Redis主從復制配置

jopen 9年前發布 | 13K 次閱讀 Redis NoSQL數據庫

redis雖然有著卓越的性能,但我們仍然可以通過master/slave這種簡單架構,進行讀寫分離,進一步挖掘redis的性能,提高系統的可用性。

redis怎么進行主從復制呢?redis復制主要是通過master server持久化的rdb文件實現的。master server 先dump出內存快照文件,然后將rdb文件傳給slave server,slave server 根據rdb文件重建內存表。redis復制過程如下:

1、slave server啟動連接到master server之后,salve server主動發送SYNC命令給master server

 2、master server接受SYNC命令之后,判斷,是否有正在進行內存快照的子進程,如果有,則等待其結束,否則,fork一個子進程,子進程把內存數據保存為文件,并發送給slave server

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

4、slave server 接收內存快照文件之后,清空內存數據,根據接收的快照文件,重建內存表數據結構

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

6、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自帶的復制策略,不過,主動復制,怎么保持數據的一致性也是個不小的挑戰。

redis配置文件相關信息,請參閱以前的blog:Redis系列-配置文件小結

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!