一:原理
主要是通過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主從複制的一個主要弊端,在實際環境中,盡量規避中途增加從庫。redis2.8之前不支援增量,到2.8之後就支援增量了!
二:說明
1、準備兩台伺服器
master:192.168.0.128
slave:192.168.0.129
2、關閉防火牆
iptables -F
# getenforce
Disabled
三、安裝配置
1、分别都安裝redis
參考我之前寫的文章:Redis資料庫的安裝與配置
<a href="http://msiyuetian.blog.51cto.com/8637744/1717983" target="_blank">http://msiyuetian.blog.51cto.com/8637744/1717983</a>
2、master配置檔案不用動,slave配置檔案上加一行
slaveof 192.168.0.128 6379 //主IP
masterauth 123456 //如果主上設定了密碼,若密碼為123456,則要加這行
3、分别啟動master和slave上的redis
四、驗證主從
在從上檢視日志
[root@slave ~]# tail /usr/local/redis/var/redis.log
[6117] 03 Dec 11:52:12.034 * Full resync from master: 37031d932827c403dfd2be6df445901ae3b67a65:1
[6117] 03 Dec 11:52:12.385 * MASTER <-> SLAVE sync: receiving 18 bytes from master
[6117] 03 Dec 11:52:12.385 * MASTER <-> SLAVE sync: Flushing old data
[6117] 03 Dec 11:52:12.385 * MASTER <-> SLAVE sync: Loading DB in memory
[6117] 03 Dec 11:52:12.385 * MASTER <-> SLAVE sync: Finished with success
[6117] 03 Dec 11:52:17.108 - 1 clients connected (0 slaves), 276592 bytes in use
[6117] 03 Dec 11:52:22.169 - 1 clients connected (0 slaves), 276592 bytes in use
[6117] 03 Dec 11:52:27.219 - 1 clients connected (0 slaves), 276592 bytes in use
[6117] 03 Dec 11:52:32.308 - 1 clients connected (0 slaves), 276592 bytes in use
[6117] 03 Dec 11:52:37.390 - 1 clients connected (0 slaves), 276592 bytes in use
若出現上面類似的資訊,說明主從配置成功了。下面要進行示例驗證
示例驗證:
在主上建立資料
[root@master ~]# redis-cli -a 123456
127.0.0.1:6379> set key1 123
OK
127.0.0.1:6379> set key2 456
127.0.0.1:6379> sadd set1 aaa
(integer) 1
127.0.0.1:6379> sadd set1 bbb
127.0.0.1:6379> sadd set1 ccc
127.0.0.1:6379> keys *
1) "set1"
2) "key2"
3) "key1"
在從上檢視
[root@slave ~]# redis-cli
1) "key2"
2) "set1"
127.0.0.1:6379> get key1
"123"
127.0.0.1:6379> get key2
"456"
127.0.0.1:6379> smembers set1
1) "ccc"
2) "aaa"
3) "bbb"
由上可知,實作了主從同步。
五、主從其他相關配置
1)slave-read-only yes //讓從隻讀
2)repl-ping-slave-period 10 //設定slave向master發起ping的頻率,每10s發起一次
3)repl-timeout 60 //設定slave ping不通master多少秒後就逾時
4)repl-disable-tcp-nodelay no //是否開啟tcp_nodelay,開啟後将會使用更少的帶寬,但會有延遲,是以建議關閉
5)repl-backlog-size 1mb //同步隊列的長度,backuplog是master的一個緩沖區,主從斷開後,master會先把資料寫入到緩沖區,slave再次連接配接會從緩沖區中同步資料
6)repl-backlog-ttl 3600 //主從斷開後,緩沖區的有效期,預設1小時
7)slave-priority 100 //多個slave是可以設定優先級的,數值越小優先級越高,應用于叢集中,支援slave切換為master,優先級最高的才會切換
8)min-slaves-to-write 3 //和下面的一起使用,它的意思是master發現有超過3個slave的延遲高于10s,那麼master就會暫停寫操作。這兩個數值任何一個為0,則關閉該功能,預設第一個數值是0
9)min-slaves-max-lag 10
本文轉自 M四月天 51CTO部落格,原文連結:http://blog.51cto.com/msiyuetian/1719176,如需轉載請自行聯系原作者