前言
Redis體系學習整理,點我點我
解決問題:
1:單點問題,機器宕機,服務不可用,數據丟失。
2:容量瓶頸。 簡而言之,保障Redis的HP和HA
主從複製三大步驟
如果我們要自己設計一個主從同步的系統,你會怎麼處理?
大家都能想到,最簡單的思路也是三步
- 機器建立連接
- 數據複製
- 後續新指令維護
我們來看下Redis的具體步驟。因爲都是人設計出來其實思路是一致的。
- 鏈接階段:Slave 向Master建立鏈接
- 數據同步階段:講Master的數據同步到Slave
- 全量複製
- 增量複製
- 命令傳播階段:後續指令持續同步
下面我們單獨針對各個階段進行說明
鏈接階段
slave主動去和master建立socket鏈接。
- Slave自我介紹 發送IP + Port 給Master
- Master接收到消息。返回master的運行ID(run_id )具體作用下面介紹
- 根據master的結果,開始建立socket
- 建立完成,互相檢測心跳(Ping master IP)。當然Slave頻率是遠遠大於Master的。
對應命令
客戶端式:slaveof [IP] [port] 成爲執行機器的從服務器:如果該機器之前是其他master的slave那麼會丟棄之前的數據集。
啓動服務時:redis-service – slaveof 127.0.0.1 6379
配置式(推薦): redis.conf文件中添加配置 slaveof [IP] [port]
QA:
Q:爲什麼是Slave發起連接,發起同步請求,更頻繁的檢測心跳呢?
A:其實很簡單,因爲Master太忙了 【手動狗頭~】不僅要處理各種數據,還要管理和響應Slave。
數據同步階段
這一步涉及RDB和AOF相關的知識: 不熟悉的同學,先點這裏去了解一下
-
Slave發送同步請求
- 1.0 sync
- 2.8 psync
- 4.0 psync < runid > < offset >
- 第一次請求因爲沒有runid 會傳默認值 0 -1。master接受到默認參數時,判斷爲首次鏈接,會開闢 複製積壓緩衝區 用來把RDB後的數據進行存儲,防止指令丟失。
- 複製積壓緩衝區的結構如下:偏移值,就是指令中的offset,master根據複製偏移量來決定同步的數據信息。
-
全量複製
- master收到同步請求,運行 bgsave,得到RDB文件。後續指令存入複製積壓緩衝區。
- RDB文件通過Socket同步給Slave
- Slave接收到RDB文件。開始清除老數據flashdb。然後根據RDB文件恢復數據。
-
增量複製
- master從指令積壓緩衝區得到 AOF文件。發送給Slave
- Slave 接收數據。執行bgrewriter,然後開始執行恢復。
到這一步,數據就基本同步完畢了。
命令傳播階段
- 互相Ping 心跳包
- 根據複製積壓緩衝區的數據,進行後續的增量複製。
注意事項和遺留問題
注意事項
- 生產環境主庫數據巨大,新增從庫應並開流量高峯期,避免阻塞影響高可用
- 複製緩衝區大小默認是1mb。 如果你發現CPU持續走高,可能就是緩衝區大小設置的不合理。 在全複製時,如果檢測到複製積壓緩衝區滿了,系統會進行2次(3次甚至更多次)的全量複製。
- 內存分配比例,要留30%左右給 bgsave和創建緩衝區。
- 多Slave錯峯同步,避免帶寬壓崩。
遺留問題:
master宕機的怎麼辦?
數據不一致主從延遲怎麼辦?
相關解釋在集羣和哨兵模式中進行介紹
主從同步今天就總結到這裏~