Redis 設計與實現 (五)--多機資料庫的實現

K戰神發表於2018-03-02

多機資料庫的實現

一、複製

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

 

相關文章