1. 程式人生 > >try redis (五) -- master -slave 主從復制

try redis (五) -- master -slave 主從復制

開啟 註意點 無法 targe 流轉 系統 主從復制 nbsp reids

參考官網原文:http://redis.io/topics/replication

參考文章 :http://in.sdo.com/?p=1187


註意事項

Redis 的復制說白了就是通過配置 將slave 當做 masters 的復制。可是有有幾個須要註意點:

1、Redis使用的是一部復制。

從Redis 2.8開始。slaves 將定期確認從復制流中處理的數量

2、一個master 能夠有多個slavers

3、slaves能夠接受其它slaves 的連接。

4、Redis的復制是不會堵塞master 的,也就是所謂的 non-blocking.這就意味著當一個或者多個slaves 在處理最初的同步時,master能夠繼續他的查詢操作等。

5、為了有多個僅僅讀slaves,能夠用倆做一些伸縮性的復制。

6、復制操作有可能也能夠避免Redis將全部的數據集寫入disk的損失。


master持久化變與復制的安全性

當 Redis 復制使用的時候,它是強烈建議master的持久化是開啟的,當沒法開啟持久化比方須要延遲。Redis 須要配置成 禁止自己主動重新啟動

為了更好的 理解為什麽master 在自己主動重新啟動的 情況下。關閉持久化配置是危急的。

可能造成數據從master 和全部slaves 中擦除,我們看一個樣例

1、我們啟動nodeA 作為master。同一時候設置A 為持久化 turned down 。

node B、C 從A 中復制數據

2、假設A 突然掛了,然後能夠重新啟動,可是因為沒有開啟持久化。

重新啟動後數據集為空

3、這個似乎 B 和 C將從 A 中復制空的數據集,這樣原來的一些老的數據就被擦除了。

當 redis 系統為了提高可用率,會將master的持久化給關閉。

可是不論什麽時候,數據安全都是最重要的,復制功能在沒有配置持久化,同一時候又自己主動重新啟動的機器中是不可取的。



Reids 復制時怎麽工作的

當啟動一個slave 。連接後他會發送一個SYNC命令。在它第一次連接或者又一次連接master的時候,這個都是正常的。

master 開始後臺進行保存操作。同一時候開始開始緩存全部收到的改變數據集的命令。當後臺保存成功,master將 保存在硬盤上的 數據集文件(dump.rdb) 讀入到內存中 ,發送給slave。

然後master將發送全部緩存命令,這好比是一個命令流,是redis協議本身實現的

Slaves 能夠自己主動沖洗連接。

當 master <-> salve 連接由於某些原因中斷的時候。

當master收到多個並發 slave 同步請求的時候。會有一個單獨的線程專門來保存他們。


同一時候在網上找打一個 比較好的一個狀態流程的解釋


  1. Slave端在配置文件裏加入了slave of指令,於是Slave啟動時讀取配置文件。初始狀態為REDIS_REPL_CONNECT。
  2. Slave端在定時任務serverCron(Redis內部的定時器觸發事件)中連接Master,發送sync命令,然後堵塞等待master發送回其內存快照文件(最新版的Redis已經不須要讓Slave堵塞)。
  3. Master端收到sync命令簡單推斷是否有正在進行的內存快照子進程,沒有則馬上開始內存快照,有則等待其結束。當快照完畢後會將該文件發送給Slave端。

  4. Slave端接收Master發來的內存快照文件,保存到本地,待接收完畢後,清空內存表。又一次讀取Master發來的內存快照文件,重建整個內存表數據結構。並終於狀態置位為 REDIS_REPL_CONNECTED狀態,Slave狀態機流轉完畢。

  5. Master端在發送快照文件過程中,接收的不論什麽會改變數據集的命令都會臨時先保存在Slave網絡連接的發送緩存隊列裏(list數據結構)。待快照完畢後,依次發給Slave,之後收到的命令同樣處理。並將狀態置位為 REDIS_REPL_ONLINE。

狀態流程圖例如以下: 技術分享



redis.conf 關於 配置


port 6379

指定Redis監聽port,默認port為6379

################################# REPLICATION ###################################

maseter-slave 復制 須要註意幾個點

1、redis 復制時一部實現的。可是你能夠配置 master 在不能連接到一個給定數量的slaves 的時候,禁止寫入

2、redis slaves 能夠局部的再同步數據到master 假設master突然斷掉。然後啟動。

3、復制時自己主動進行的。不須要用戶調用。假設slavers 與master 無法連接。slaves 會嘗試連接master.同一時候再同步slaves上的數據到master上

######################################################################################


slaveof <masterId> <masterPort>

假設配置了slaveof 屬性。意味著當前節點是 slave。同一時候確定了master的ip 和 port


slave

try redis (五) -- master -slave 主從復制