redis master/slave架構

redis雖然有着卓越的性能,但咱們仍然能夠經過master/slave這種簡單架構,進行讀寫分離,進一步挖掘redis的性能,提升系統的可用性。 

redis怎麼進行主從複製呢?redis複製主要是經過master server持久化的rdb文件實現的。master server 先dump出內存快照文件,而後將rdb文件傳給slave server,slave server 根據rdb文件重建內存表。redis複製過程以下: 

一、slave server啓動鏈接到master server以後,salve server主動發送SYNC命令給master server 

二、master server接受SYNC命令以後,判斷,是否有正在進行內存快照的子進程,若是有,則等待其結束,不然,fork一個子進程,子進程把內存數據保存爲文件,併發送給slave server 

三、master server子進程進程作數據快照時,父進程能夠繼續接收client端請求寫數據,此時,父進程把新寫入的數據放到待發送緩存隊列中 

四、slave server 接收內存快照文件以後,清空內存數據,根據接收的快照文件,重建內存表數據結構 

五、master server把快照文件發送完畢以後,發送緩存隊列中保存的子進程快照期間改變的數據給slave server,slave server作相同處理,保存數據一致性 

六、master server 後續接收的數據,都會經過步驟1創建的鏈接,把數據發送到slave server 

須要注意:slave server若是由於網絡或其餘緣由斷與master server的鏈接,當slave server從新鏈接時,須要從新獲取master server的內存快照文件,slave server的數據會自動所有清空,而後再從新創建內存表,這樣會讓slave server 啓動恢復服務比較慢,同時也給master server帶來較大壓力,能夠看出redis的複製沒有增量複製的概念,這是redis主從複製的一個主要弊端,在實際環境中,儘可能規避中途增長從庫。 

經過上面的介紹,咱們對redis的主從複製有了個大概瞭解,下面講講具體怎麼配置master/slave。因爲條件限制,這裏用一臺機器,啓動兩個進程來進行主從複製。 

master server 配置文件master.conf, 主要配置以下: 

daemonize yes   
pidfile /var/run/redis_6379.pid   
port 6379   
#save 900 1   
#save 300 10   
#save 60 10000   
dbfilename dump.rdb   
dir /var/lib/redis/6379 

slave server 配置文件slave.conf,主要配置以下: 

daemonize yes   
pidfile /var/run/redis_6379.pid   
port 6380   
save 900 1   
save 300 10   
save 60 10000   
dbfilename dump.rdb   
dir /var/lib/redis/6380   
slaveof 127.0.0.1 6379   

slave.conf中,主要經過slaveof指定其master的ip和端口。啓動master和slave: 

/usr/local/bin/redis-server /etc/redis/master.conf   
/usr/local/bin/redis-server /etc/redis/slave.conf 

鏈接master server,寫入數據: 

[root@xsf001 ~]# redis-cli -p 6379   
redis 127.0.0.1:6379> set user.1.name zhangsan   
OK 

鏈接 slave server,讀數據: 

[root@xsf001 ~]# redis-cli -p 6380   
redis 127.0.0.1:6380> get user.1.name   
"zhangsan" 

從測試結果看,數據確實自動複製了。經過複製功能,咱們能夠在master上只寫數據,在slave上讀數據,關閉master的持久化(或aof)功能(在salve上開啓),從而分擔master服務器讀壓力,提升master服務器性能,同時,master掛了,能夠快速地用slave server來替換master server,提升系統的可用性。 

在實際環境中,咱們能夠根據redis複製特色,定製適合咱們本身的複製架構。好比,採用master server ->slave server ->slave server ->slave server這種一拖一【或一拖一再拖多】的方式,和常規的一拖多方式相比,這種方式更能減小master server在複製數據時的壓力。固然,因爲redis複製的自然缺陷,咱們也能夠採用主動複製的方式【經過redis代理層,client在寫master時,寫多個master】來改造優化redis自帶的複製策略,不過,主動複製,怎麼保持數據的一致性也是個不小的挑戰。web

相關文章
相關標籤/搜索