redis——主從複製筆記

redis主從複製

在redis中,歐諾個話可以通過slaveof命令或者slaveof選項,讓一個服務器去複製另一個服務器的數據,2.8版本前是舊版複製功能,即同步sync和命令傳播command propagate兩個操作

舊版複製

1.同步
從服務器向主服務器發送sync命令
主服務器執行BGSAVE命令(不阻塞),生成RDB文件,並在緩衝區中記錄從現在開始執行的寫命令
從服務器接受RDB文件,並將狀態更新到和主服務器執行BGSAVE時的狀態
主服務器將緩衝區內容發送給從服務器並執行
2.命令傳播
之後的操作需要主服務器將客戶端執行的命令發送給從服務器來保證一致性

舊版複製的效率在某些場景下有些低,可能相對與RDB更小的一些操作引起的變化,使得需要複製整個redis的RDB,很多數據沒必要重新走一遍備份和恢復(大多是斷線的情況)

新版複製

從2.8版本開始,使用PSAVE命令代替SAVE
PSAVE命令有完整重同步(full resynchronization)和部分重同步兩種模式(partial resynchorization)
完整重同步用來處理初次同步,步驟和舊版複製相同
部分重同步用來處理斷線後的部分同步,

部分重同步的實現:

有三部分構成

  • 主服務器的複製偏移量
  • 從服務器的複製積壓緩衝區
  • 服務器的運行ID

複製偏移量是主從各一份的維護的數據,用來判斷是否一致,和需要同步幾條數據
積壓緩衝區將命令放在了一個隊列中,並且記錄了offset(偏移量)
積壓緩衝區的構造↓
在這裏插入圖片描述
查找offset偏移量就能知道從服務器和主服務器不一致時從什麼地方開始部分重同步。
多加思考一下就會發現,如果隊列太小,保存的最小偏移量的標記比從服務器當前的偏移量還要小就無法進行部分重同步了,因爲有有一部分的數據已經丟失,因此,正確估算和設置積壓緩衝區的大小十分重要。
在這裏插入圖片描述
隨便舉得例子,只是數值上是600,命令條數不足600


服務器ID
不管是從服務器還是主服務器,都有自己的服務器ID,斷線重連之後,從服務器會將之前synv的服務器ID發送給主服務器,如果比對正確,就嘗試進行部分重同步,否則進行完全重同步。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章