天天看點

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主從複制的一個主要弊端,在實際環境中,盡量規避中途增加從庫。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 &lt;-&gt; SLAVE sync: receiving 18 bytes from master

[6117] 03 Dec 11:52:12.385 * MASTER &lt;-&gt; SLAVE sync: Flushing old data

[6117] 03 Dec 11:52:12.385 * MASTER &lt;-&gt; SLAVE sync: Loading DB in memory

[6117] 03 Dec 11:52:12.385 * MASTER &lt;-&gt; 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&gt; set key1 123

OK

127.0.0.1:6379&gt; set key2 456

127.0.0.1:6379&gt; sadd set1 aaa

(integer) 1

127.0.0.1:6379&gt; sadd set1 bbb

127.0.0.1:6379&gt; sadd set1 ccc

127.0.0.1:6379&gt; keys *

1) "set1"

2) "key2"

3) "key1"

在從上檢視

[root@slave ~]# redis-cli

1) "key2"

2) "set1"

127.0.0.1:6379&gt; get key1

"123"

127.0.0.1:6379&gt; get key2

"456"

127.0.0.1:6379&gt; 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,如需轉載請自行聯系原作者