Redis主從配置及HA方案


首先說下主從同步Replication的原理

在Slave啟動並連接到Master之后,它將主動發送一條SYNC命令。此后Master將啟動后台存盤進程,同時收集所有接收到的用於修改數據集的命令,在后台進程執行完畢后,Master將傳送整個數據庫文件到Slave,以完成一次完全同步。而Slave服務器在接收到數據庫文件數據之后將其存盤並加載到內存中。此后,Master繼續將所有已經收集到的修改命令,和新的修改命令依次傳送給Slaves,Slave將在本次執行這些數據修改命令,從而達到最終的數據同步。

如果Master和Slave之間的鏈接出現斷連現象,Slave可以自動重連Master,但是在連接成功之后,一次完全同步將被自動執行。

 

服務器名稱 內網IP

Master 172.30.21.96
Slave1 172.30.21.88
Slave2 172.30.21.89
Slave3 172.30.21.90
Slave4 172.30.21.91


master配置

logfile “/tmp/redis6379.log”
# slaveof
<masterip> <masterport> #master這個地方注釋不打開,保持默認

啟動master

./redis-server ../redis.conf &

slave配置

logfile “/tmp/redis6379.log”
slaveof 172.30.21.96 6379 

啟動slave

./redis-server ../redis.conf &

檢查啟動結果

在各自服務器上用 redis-cli客戶端連接redis,輸入info指令,即可查看主從的狀態。

master:

slave:

 

主從切換

Redis的主從架構,如果沒有設置哨兵,那么如果master出現故障,需要手動將slave切換成master繼續服務。下面先說明如何進行手動切換:

#在新的master上執行:
SLAVEOF NO ONE
#在其他的slave上執行:
SLAVEOF <新的masterip> <新的masterport>

原來的主redis恢復正常了,要重新切換回去。重新切回的步驟如下:

1 將現在的主redis的數據進行保存(save指令)
2 將現在的主redis根目錄下dump.rdb文件拷貝覆蓋到原來主redis的根目錄
3 啟動原來的主redis
4 在現在的主redis中切換 SLAVEOF <舊的masterip> <舊的masterport>
5 在其他的slave節點切換 SLAVEOF <舊的masterip> <舊的masterport>
6 完畢

自動切換(高可用方案配置)

  手動的方式容易造成失誤,容易導致數據丟失,而且如果主從節點很多,切換起來也很麻煩。自動切換一般通過設置哨兵實現。哨兵可以對master和slave進行監控,並在master出現故障的時候,能自動將slave切換成master。

  redis哨兵(Redis Sentinel)的啟動和redis實例的啟動沒有關系。所以可以在任何機器上啟動redis哨兵。Redis Sentinel 是一個分布式系統,可以在整個redis主從架構中運行多個 Sentinel 進程(progress)。建議至少要保證有兩個哨兵在運行,要不然物理機宕機后哨兵進程也不存在了,就無法進行主從切換。

  我們這里有5台redis服務器(1主4從),所以啟動5個哨兵。每個哨兵的配置如下:

 修改sentinel.conf的配置:

logfile "/tmp/sentinel.log"
sentinel monitor mymaster 172.30.21.96 6379 2 #這個2代表,當集群中有2個sentinel認為master掛了時,才能真正認為該master已經不可用了

啟動sentinel(默認端口號26379)

./redis-sentinel ../sentinel.conf &

 

關於sentinel可以看官方文檔,有很多的說明。這里列出一些主要的配置屬性:

# 指明日志文件名
logfile "/tmp/sentinel.log"
# 哨兵監控的master,主從配置一樣,這里只用輸入redis主節點的ip/port和法定人數。
sentinel monitor mymaster 172.30.21.96 6379 1
# master或slave多長時間(默認30秒)不能使用后標記為s_down狀態。
sentinel down-after-milliseconds mymaster 5000
# 若sentinel在該配置值內未能完成failover操作(即故障時master/slave自動切換),則認為本次failover失敗。
sentinel failover-timeout mymaster 18000
# 設置master和slaves驗證密碼
sentinel auth-pass mymaster 123456 
# 指定了在執行故障轉移時, 最多可以有多少個從服務器同時對新的主服務器進行同步
sentinel parallel-syncs mymaster 1

 

通過哨兵查看集群的信息:

$ redis-cli -p 26379
sentinel master mymaster//查看master的狀態 
SENTINEL slaves mymaster //查看salves的狀態
SENTINEL sentinels mymaster //查看哨兵的狀態
SENTINEL get-master-addr-by-name mymaster//獲取當前master的地址
info sentinel//查看哨兵信息

 

寫個代碼測試下:

public static void main(String[] args) {
        Set<String> sentinels = new HashSet<String>();
        sentinels.add(new HostAndPort("172.30.21.96", 26379).toString());
        sentinels.add(new HostAndPort("172.30.21.88", 26379).toString());
        sentinels.add(new HostAndPort("172.30.21.89", 26379).toString());
        sentinels.add(new HostAndPort("172.30.21.90", 26379).toString());
        sentinels.add(new HostAndPort("172.30.21.91", 26379).toString());
        JedisSentinelPool sentinelPool = new JedisSentinelPool("mymaster", sentinels);

        System.out.println("Current master: " + sentinelPool.getCurrentHostMaster().toString());

        Jedis master = sentinelPool.getResource();
        //master.set("username","jager");

        System.out.println(master.get("username"));

        sentinelPool.close();
        sentinelPool.destroy();
    }

 

參考文檔:

http://blog.csdn.net/quiet_boy/article/details/53885406

http://www.cnblogs.com/Xrinehart/p/3502198.html

http://www.cnblogs.com/clor001/p/5409891.html

http://www.cnblogs.com/lulu/archive/2013/04/14/3021261.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM