1. 程式人生 > >分散式Redis主備複製

分散式Redis主備複製

  當資料落在不同節點上時,如何保證資料節點之間的一致性是非常關鍵的

  Redis採用主備複製的方式保證一致性,所有節點中,只有一個節點為主節點(master),它對外提供寫服務,然後非同步的將資料複製到其他節點上

  主備複製流程

  Redis包含master 和slave 2種節點:

  master 對外提供寫服務

  slave 節點作為master的資料備份,不可以提供寫服務

  主備複製由master 主動觸發

  

 

  1、首先slave向master發起SYNC命令。這一步在slave啟動後觸發,master 被動的將新slave節點加入主備複製叢集

  2、master收到SYNC後,開啟BGSAVE 操作。BGSAVE 是Redis的一種全量持久化機制(RDB)

  3、BGSAVE完成後,master將快照資訊傳送給slave

  4、傳送期間,master收到來自Client的新寫入命令,除了正常響應外,再存入一份到backlog佇列

  5、快照資訊傳送完成後,master繼續傳送backlog佇列中的資訊

  6、backlog傳送完成之後,後續的操作同時發給slave,保持實時的非同步複製

  對於上面的slave節點,處理邏輯如下:

  傳送完SYNC後,繼續對外提供服務

  開始接受master的快照資訊,此時會清空slave現有資料,並將master快照寫入

  接收backlog 並執行(回放),期間對外提供讀服務

  繼續接受master的命令副本,並繼續回放,從而保持和master的資料一致性

  如果有多個slave 同時傳送SYNC 命令

  只要第2個slave的SYNC 命令發生在master 完成BGSAVE之前,第2個slave 將和第1個收到相同的快照和backlog

  否則第2個slave的SYNC將觸發master的第2次BGSAVE

  斷點續傳

  當每次slave 通過SYNC 和master同步資料時,master都會dump 全量資料併發送

  當一個已經和master 完成了同步,並且並保持了長時間的slave,當網路斷開很短時間再重新連上時,master不得不重新做一次全量的dump傳送。這種無疑會增加大量的無效開銷,最好的方式是隻同步網路斷開期間的增量資料。

  Redis的 PSYNC(Partial Sync)可以用於代替SYNC,做到master-slave基於斷點續傳的主備同步協議。master-slave 2端通過維護一個offset記錄當前已經同步的命令,slave斷開期間,master的增量命令會儲存在快取中。當slave重連後,告知master斷開時的offset,master會將後續的資料繼續同步,從而完成了斷點續傳。