首先說下主從同步Replication的原理html
在Slave啓動並鏈接到Master以後,它將主動發送一條SYNC命令。此後Master將啓動後臺存盤進程,同時收集全部接收到的用於修改數據集的命令,在後臺進程執行完畢後,Master將傳送整個數據庫文件到Slave,以完成一次徹底同步。而Slave服務器在接收到數據庫文件數據以後將其存盤並加載到內存中。此後,Master繼續將全部已經收集到的修改命令,和新的修改命令依次傳送給Slaves,Slave將在本次執行這些數據修改命令,從而達到最終的數據同步。redis
若是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配置ui
logfile 「/tmp/redis6379.log」
slaveof 172.30.21.96 6379
啓動slavespa
./redis-server ../redis.conf &
檢查啓動結果.net
在各自服務器上用 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