1. 程式人生 > >redis主從複製和叢集實現原理

redis主從複製和叢集實現原理

redis主從複製
redis主從配置比較簡單,基本就是在從節點配置檔案加上:slaveof 192.168.33.130 6379
主要是通過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之後就支援增量了!


redis cluster(叢集)
redis叢集配置參考我的博文:
http://blog.csdn.net/nuli888/article/details/52134117

3.0之後的功能,至少需要3(Master)+3(Slave)才能建立叢集,是無中心的分散式儲存架構,可以在多個節點之間進行資料共享,解決了Redis高可用、可擴充套件等問題。

redis叢集提供了以下兩個好處
1、將資料自動切分(split)到多個節點
2、當叢集中的某一個節點故障時,redis還可以繼續處理客戶端的請求。
一個 redis 叢集包含 16384 個雜湊槽(hash slot),資料庫中的每個資料都屬於這16384個雜湊槽中的一個。叢集使用公式 CRC16(key) % 16384 來計算鍵 key 屬於哪個槽。叢集中的每一個節點負責處理一部分雜湊槽。
叢集中的主從複製
叢集中的每個節點都有1個至N個複製品,其中一個為主節點,其餘的為從節點,如果主節點下線了,叢集就會把這個主節點的一個從節點設定為新的主節點,繼續工作。這樣叢集就不會因為一個主節點的下線而無法正常工作
注意:
1、如果某一個主節點和他所有的從節點都下線的話,redis叢集就會停止工作了。redis叢集不保證資料的強一致性,在特定的情況下,redis叢集會丟失已經被執行過的寫命令
2、使用非同步複製(asynchronous replication)是redis 叢集可能會丟失寫命令的其中一個原因,有時候由於網路原因,如果網路斷開時間太長,redis叢集就會啟用新的主節點,之前發給主節點的資料就會丟失。