try redis (五) -- master -slave 主從復制
參考官網原文: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 同步請求的時候。會有一個單獨的線程專門來保存他們。
同一時候在網上找打一個 比較好的一個狀態流程的解釋
- Slave端在配置文件裏加入了slave of指令,於是Slave啟動時讀取配置文件。初始狀態為REDIS_REPL_CONNECT。
- Slave端在定時任務serverCron(Redis內部的定時器觸發事件)中連接Master,發送sync命令,然後堵塞等待master發送回其內存快照文件(最新版的Redis已經不須要讓Slave堵塞)。
- Master端收到sync命令簡單推斷是否有正在進行的內存快照子進程,沒有則馬上開始內存快照,有則等待其結束。當快照完畢後會將該文件發送給Slave端。
- Slave端接收Master發來的內存快照文件,保存到本地,待接收完畢後,清空內存表。又一次讀取Master發來的內存快照文件,重建整個內存表數據結構。並終於狀態置位為 REDIS_REPL_CONNECTED狀態,Slave狀態機流轉完畢。
- 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 主從復制