分散式Redis主備複製

w39發表於2021-09-09

當資料落在不同節點上時,如何保證資料節點之間的一致性是非常關鍵的
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會將後續的資料繼續同步,從而完成了斷點續傳。



作者:芥末無疆sss
連結:
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/854/viewspace-2815718/,如需轉載,請註明出處,否則將追究法律責任。

相關文章