1. 程式人生 > >主從伺服器(複製)

主從伺服器(複製)

redis中,使用者可以通過執行SLAVEOF 命令或設定slaveof選項,讓一個伺服器複製另一個伺服器。

  • 主伺服器(master):被複制的伺服器。
  • 從伺服器(slave):對主伺服器進行復制的伺服器。

主從伺服器雙方資料庫狀態一致。

127.0.0.1:12345> SLAVEOF 127.0.0.1 6379

這裡寫圖片描述

1. 舊版複製功能的實現

redis的複製功能分為兩個操作:
1. 同步(sync)
2. 命令傳播(command propagate)

1.1 同步

從伺服器向主伺服器傳送SYNC命令,實現同步操作。
這裡寫圖片描述

1.2 命令傳播

每當主伺服器執行客戶端傳送的寫命令時,主伺服器的資料庫狀態可能被修改,導致主從伺服器狀態不一致。為了讓主從伺服器再次回到一致狀態,主伺服器需要對從伺服器執行命令傳播操作:主伺服器將造成主從伺服器不一致的命令,傳送給從伺服器執行,使主從伺服器再次回到一致狀態。

1.3 舊版複製功能的缺陷

redis中,從伺服器對主伺服器的複製分兩種情況:
1. 初次複製
2. 斷線後重複製

舊版複製在處理斷線後重複製時,採用和初次複製一樣的操作,比較低效。

2. 新版複製功能的實現

新版複製功能使用PSYNC命令代替SYNC命令,具有:
1. 完整重同步:處理初次複製情況。
2. 部分重同步:處理斷線後重複製情況。

這裡寫圖片描述

2.1 部分重同步的實現

部分重同步功能由三部分構成:
1. 複製偏移量(replication offset)
2. 複製積壓緩衝區(replication backlog)
3. 伺服器的執行ID(run ID)

(1)執行復制的雙方—主伺服器和從伺服器,會分別維護一個複製偏移量:主伺服器每次向從伺服器傳播N個位元組的資料時,就將自己的複製偏移量+N,從伺服器每次收到主伺服器傳播來的N個位元組資料時,複製偏移量+N。
對比主從伺服器的複製偏移量,可以判斷主從伺服器是否處於一致狀態。
這裡寫圖片描述
這裡寫圖片描述

(2)複製積壓緩衝區

主伺服器維護的一個固定長度(fixed-size)先進先出佇列(FIFO),預設大小為1MB。
當主伺服器進行命令傳播時,①將寫命令傳送給所有從伺服器;②將寫命令入隊到複製積壓緩衝區。
這裡寫圖片描述

(3)伺服器執行ID

每個redis伺服器,主從,都有自己的執行ID,在伺服器啟動時自動生成。
如果從伺服器儲存的執行ID和當前連線的主伺服器的執行ID相同,說明斷線前複製的就是當前連線的主伺服器,執行部分重同步。
如果從伺服器儲存的執行ID和當前連線的主伺服器的執行ID不同,說明斷線前複製的不是當前連線的主伺服器,執行完整重同步。

2.1 複製的實現

步驟:
1. 設定主伺服器的地址和埠:從伺服器在redisServer->masterhost 和 masterport 中儲存主伺服器的地址和埠。
2. 建立套接字連線
3. 傳送PING命令
4. 身份驗證
5. 傳送埠訊息:從伺服器向主伺服器傳送從伺服器的監聽埠
6. 同步
7. 命令傳播

3. 心跳檢測

在命令傳播階段,從伺服器預設會每秒一次的頻率,向主伺服器傳送命令:REPLCONF ACK <replication_offset>,其中replication_offset是從伺服器當前的複製偏移量。
作用有三:
1. 檢測主從伺服器的網路連線狀態
2. 輔助實現min-slaves選項
3. 檢測命令丟失

(1)主從伺服器通過傳送和接收REPLCONF ACK命令來檢查兩者之間的網路連線是否正常:如果主伺服器超過一秒鐘沒有收到從伺服器發來的REPLCONF ACK命令,則可判斷網路連線異常。

(2)redis的min-slaves-to-writemin-slaves-max-lag兩個選項可以防止 主伺服器在不安全的情況下執行寫命令。

(3)檢測命令丟失

如果因為網路故障,命令傳播在半路丟失,那麼當從伺服器傳送REPLCONF ACK命令時,主伺服器發覺複製偏移量不同,就會從複製積壓緩衝區找到從伺服器丟失的資料,重新發送。

如果主伺服器執行了命令 SET key value (協議格式的長度為 33 位元組), 將自己的複製偏移量更新到了 233 , 並嘗試向從伺服器傳播命令 SET key value , 但這條命令卻因為網路故障而在傳播的途中丟失, 那麼主從伺服器之間的複製偏移量就會出現不一致: 主伺服器的複製偏移量會被更新為 233 , 而從伺服器的複製偏移量仍然為 200 , 如圖 15-24 所示。
這裡寫圖片描述
在這之後, 當從伺服器向主伺服器傳送 REPLCONF ACK 命令的時候, 主伺服器會察覺從伺服器的複製偏移量依然為 200 , 而自己的複製偏移量為 233 , 這說明覆制積壓緩衝區裡面複製偏移量為 201 至 233 的資料(也即是命令 SET key value )在傳播過程中丟失了, 於是主伺服器會再次向從伺服器傳播命令 SET key value , 從伺服器通過接收並執行這個命令可以將自己更新至主伺服器當前所處的狀態, 如圖 15-25 所示。
這裡寫圖片描述