1. 程式人生 > >Redis 設計與實現 (五)--多機數據庫的實現

Redis 設計與實現 (五)--多機數據庫的實現

緩沖 所有 moved 啟動 tin 當前 body ica red

多機數據庫的實現

一、復制

  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 為主節點,接收此命令的節點為子節點

Redis 設計與實現 (五)--多機數據庫的實現