說說 Redis 主從複製原理

在 Redis 複製的基礎上(不包括 Redis Cluster、Redis Sentinel),使用和配置主從複製非常簡單,能使得【從 Redis 服務器】(後文稱 slave)能精確得複製【主 Redis 服務器】(下文稱 master)的內容。
每當 slave 和 master 之間的連接斷開時, slave 會自動重連到 master,並且無論這期間 master 發生了什麼, slave 都將嘗試讓自身成爲 master 的精確副本。

那這到底是怎麼做到的呢?

1 依賴機制

該系統的運行依靠如下重要機制:

1.1 更新 slave

當一個 master 和一個 slave 連接正常時, master 會發送一連串命令流保持對 slave 的更新,以便將自身數據集的改變複製給 slave,這包括客戶端的寫入、key 的過期或被逐出等。

1.2 部分重同步

當 master 和 slave 斷連後,由於網絡問題或是主從意識到連接超時,slave 重新連接上 master 並會嘗試進行部分重同步:它會嘗試只獲取在斷開連接期間內丟失的命令流

1.3 全量重同步

當無法進行部分重同步時, slave 會請求全量重同步。這更復雜,比如 master 需創建所有數據的快照,將之發送給 slave ,之後在數據集更改時持續發送命令流到 slave。

Redis 使用默認的異步複製,低延遲且高性能,適用於大多數 Redis 場景。但 slave 會異步確認從 master 週期接收到的數據量。

客戶端可用 WAIT 命令請求同步複製某些特定的數據。但 WAIT 只能確保在其他 Redis 實例中有指定數量的已確認的副本:在故障轉移期間,由於不同原因的故障轉移或由於 Redis 持久性的實際配置,故障轉移期間確認的寫入操作可能仍然會丟失。

2 Redis 複製的特點

3 單機 “危機”

3.1 主從複製作用

3.2 總結

4 實現複製的操作

4.1 命令:slaveof

異步執行,很耗時間

無需重啓,但不便於配置的管理。

4.2 配置

slaveof ip port
slave-read-only yes

雖然可統一配置,但需重啓。

5 全量複製

  1. master 執行bgsave,在本地生成一份 RDB 快照 client-output-buffer-limit slave 256MB 64MB 60

  2. master 將 RDB 快照發送給 salve,若 RDB 複製時間超過 60 秒(repl-timeout),那麼 slave 就會認爲複製失敗,可適當調大該參數 (對於千兆網卡的機器,一般每秒傳輸 100MB,6G 文件,很可能超過 60s)

  3. master 在生成 RDB 時,會將所有新的寫命令緩存在內存中,在 salve 保存了 rdb 之後,再將新的寫命令複製給 salve

  4. 若在複製期間,內存緩衝區持續消耗超過 64MB,或者一次性超過 256MB,那麼停止複製,複製失敗

  5. slave node 接收到 RDB 之後,清空自己的舊數據,然後重新加載 RDB 到自己的內存中,同時基於舊的數據版本對外提供服務

  6. 如果 slave 開啓了 AOF,那麼會立即執行 BGREWRITEAOF,重寫 AOF

RDB 生成、RDB 通過網絡拷貝、slave 舊數據的清理、slave aof rewrite,很耗費時間

如果複製的數據量在 4G~6G 之間,那麼很可能全量複製時間消耗到 1 分半到 2 分鐘

5.1 全量複製開銷

  1. bgsave 時間

  2. RDB 文件網絡傳輸時間

  3. 從節點清空數據時間

  4. 從節點加載 RDB 的時間

  5. 可能的 AOF 重寫時間

5.2 全量同步細節

master 開啓一個後臺 save 進程,以便生成一個 RDB 文件。同時它開始緩衝所有從客戶端接收到的新的寫入命令。當後臺 save 完成 RDB 文件時, master 將該 RDB 數據集文件發給 slave, slave 會先將其寫入磁盤,然後再從磁盤加載到內存。再然後 master 會發送所有緩存的寫命令發給 slave。這個過程以指令流的形式完成並且和 Redis 協議本身的格式相同。

當主從之間的連接因爲一些原因崩潰之後, slave 能夠自動重連。如果 master 收到了多個 slave 要求同步的請求,它會執行一個單獨的後臺保存,以便於爲多個 slave 服務。

6 增量複製

  1. 如果全量複製過程中,master-slave 網絡連接中斷,那麼 salve 重連 master 時,會觸發增量複製

  2. master 直接從自己的 backlog 中獲取部分丟失的數據,發送給 slave node

  3. msater 就是根據 slave 發送的 psync 中的 offset 來從 backlog 中獲取數據的

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/zITYR4CAfhcaU3ATjBGkrQ