多機資料庫的實現
一、複製
slaveof 主伺服器ip地址。形成主從關係。
1、同步
從向主伺服器傳送sync命令。
主伺服器收到sync命令執行bgsave,生成rdb檔案,緩衝區同時記錄從現在開始執行的所有命令。
主伺服器執行完畢bgsave命令,會將rdb檔案傳送給從伺服器,從伺服器接收並載入這個rdb檔案,同步給主伺服器狀態
主伺服器傳送緩衝區的命令給從伺服器,從伺服器執行當前命令,保持資料最終一致。
2、命令傳播
第一步同步,類似於初始化。
後續還需要,主從伺服器實時同步。
主伺服器將 寫命令同步傳送給從伺服器執行。保持主從一致。
3、斷點續傳
psync 分為完全同步,部分同步
(1)複製偏移量
-
-
- 主伺服器每次想從伺服器創博N個位元組資料時,同時將自己的複製偏移量加N.
- 從伺服器接收N個位元組資料,同時更新自己的偏移量加N.
-
(2)複製積壓緩衝區
-
-
- 主伺服器將緩衝區命令傳送給從伺服器,同時更新複製積壓緩衝區,標記命令位元組的偏移量。
- 主伺服器會根據這個積壓偏移量,選擇同步命令的方式。
-
(3)同步伺服器ID
根據ID和儲存的ID對比選擇不同的同步方式。
二、Sentinel
哨兵策略是redis高可用的解決方案(一個或者多個哨兵例項組成的哨兵系統),可以監視多個主伺服器。
(1)故障轉移
-
-
- 監測到主伺服器下線,選舉主伺服器下的一個從伺服器升級為主伺服器.
- 通知其他從伺服器,更新主伺服器地址.
- 監視下線伺服器,並將下線的伺服器升級為從伺服器.
-
三、叢集
叢集實現了分散式資料庫解決方案
1、節點:cluster meet <ip><port>
node節點傳送上述命令到指定的ip:port節點,它們進行握手,成功後,將指定的ip:port節點新增到node的叢集中。
2、啟動節點
一個節點就是一個執行在叢集模式下的redis伺服器,根據cluster-enable來判斷是否開啟叢集模式。
3、配置槽位:通過分片方式來儲存資料庫中的鍵值對,叢集的整個資料庫被分為 0~16384個槽位
cluster addslots <一個或者多個槽位>
節點之間互相同步自己的槽位
資料庫要處理的鍵屬於哪個槽 ->指派當前節點->沒有的話,moved,下一個->直到找到為止
鍵槽位演算法:cluster keyslot <key>
4、重新分片
moved 槽的負責權有一個節點轉移到另一個節點
ask 槽遷移過程中使用的臨時措施
5、複製故障轉移
叢集分為主節點和從節點,主節點用於處理槽,子節點用於複製主節點
在主節點下線時,代替主節點繼續處理命令請求。
cluster replicate <node-id> node-id 為主節點,接收此命令的節點為子節點