Redis 主從復制概述
Redis 的主從復制是一種機制,允許一個主節點(主實例)將數據復制到一個或多個從節點(從實例)。通過這一機制,從節點可以獲取主節點的數據并與之保持同步。
復制流程
- 開始同步:從節點通過向主節點發送
PSYNC
命令請求同步。 - 全量復制:如果是第一次連接或之前的連接失效,從節點會請求進行全量復制,主節點會將當前數據快照(RDB 文件)發送給從節點。
- 增量復制:全量復制完成后,主從之間保持一個長連接,主節點會通過此連接將后續的寫操作傳遞給從節點,從而確保數據一致性。
Redis 主從架構
下圖展示了一個 Redis 主從架構:
在這一架構中,僅主節點可以進行寫入操作,而其他從節點通過復制來保持數據的一致性。這種機制不僅保障了數據一致性,還通過將讀請求分散到多個節點,提高了系統的吞吐量和可用性。
主從復制原理詳解
Redis 的主從復制主要有兩種同步方式:全量同步和增量同步。
1. 全量同步
下圖描述了全量同步的流程:
- 流程:
- 從節點發送命令
psync ? -1
觸發全量同步請求。 - 主節點接收到請求后,發現從節點傳遞的 run ID 為“?”(表示未知),因此判斷為需要進行全量同步,并返回其自身的 run ID 以及當前的復制進度。
- 主節點執行
bgsave
生成 RDB 文件,同時將新接收到的寫入命令存儲在一個名為 replication buffer 的臨時緩沖區中。 - RDB 文件生成完成后,主節點將其發送給從節點,從節點在接收后清空舊數據并加載新的 RDB 數據。
- 加載完成后,主節點將 replication buffer 中緩存的寫入命令發送給從節點,以確保數據的一致性。
- 從節點發送命令
2. 增量同步
- 背景:在網絡不穩定的情況下,主節點的一部分寫操作可能未能成功傳遞給從節點。全量同步的數據量較大且耗時,因此 Redis 引入了增量同步(從 Redis 2.8 版本開始)。
- 使用
repl_backlog_buffer
:repl_backlog_buffer
是一個環形緩沖區,默認大小為 1 MB,用于存儲主節點最近的寫入命令。- 當從節點重新連接時,如果它的 run ID 與主節點一致,并且 offset 值在
repl_backlog_buffer
中,主節點將從緩沖區中查找相應的命令并發送給從節點,以實現增量同步。
replication buffer 與 repl_backlog_buffer 的區別
-
replication buffer:
- 每個從節點都有一個獨立的
replication buffer
,用于實時傳輸寫命令。其大小是動態調整的。可以通過配置client-output-buffer-limit
來控制其大小,以防止緩沖區過大導致的連接問題。
- 每個從節點都有一個獨立的
-
repl_backlog_buffer:
repl_backlog_buffer
在主節點上是唯一的,主要用于存儲最近的寫命令,以便從節點在重新連接時能夠進行部分重同步。該緩沖區的大小是固定的,主要用于支持增量同步。
通過以上設計,Redis 能夠實現高可用性和高性能的數據管理。
當然可以!下面是你要的 Markdown 格式:題目和選項部分在前,所有答案和解析統一放在最后,方便做題和核對。
Redis 主從復制選擇題(共 5 題)
1. 在 Redis 主從復制中,如果從節點是第一次連接主節點,或者之前的連接失效,從節點會如何進行同步?
A. 從節點會請求全量復制,主節點將當前數據快照(RDB 文件)發送給從節點
B. 從節點會請求全量復制,主節點將當前內存快照以流的形式發送
C. 從節點會請求主節點的 AOF 日志文件
D. 從節點請求主節點的 replication buffer 中的數據
2. Redis 主從復制中,以下哪個緩沖區是用于存儲最近的寫命令,并用于從節點重新連接進行部分重同步?
A. replication buffer
B. client-output-buffer-limit
C. repl_backlog_buffer
D. psync命令緩沖區
3. 如何避免 Redis 主從復制中頻繁進行全量同步?
A. 增強主節點內存大小
B. 增加從節點數量
C. 增加 repl_backlog_buffer 和 client-output-buffer-limit 的大小
D. 增加主節點 CPU 數量
4. 對于從節點延遲較大的情況,如何控制從節點使用的內存緩沖?
A. 調整主節點的 RDB 文件生成頻率
B. 限制從節點的 client-output-buffer-limit
C. 調整 client-output-buffer-limit 控制主節點的 replication buffer 大小
D. 增加網絡帶寬
5. 當增量同步失敗后,為什么 Redis 會選擇進行全量同步?
A. repl_backlog_buffer 中的數據已經被覆蓋
B. repl_backlog_buffer 中的數據被誤刪
C. 主節點丟失了隊列內的 runid
D. 從節點數據損壞
? 答案與解析
1. 正確答案:A
解析:當從節點首次連接或失聯重新連接時,主節點會向其發送全量數據快照(RDB 文件)進行同步。
2. 正確答案:C
解析:repl_backlog_buffer
是用于部分同步的緩沖區,記錄最近的寫命令。
3. 正確答案:C
解析:增加相關 buffer 的大小可以有效避免 offset 被覆蓋,從而減少全量同步頻率。
4. 正確答案:B
解析:client-output-buffer-limit
控制從節點在主節點上的輸出緩存,限制可避免資源過度消耗。
5. 正確答案:A
解析:如果從節點 offset 太舊,而 repl_backlog_buffer
已被覆蓋,則只能重新進行全量同步。