Redis -- 複製的原理及優化
Redis主從複製
-
什麼是主從複製
-
主從複製配置
-
全量複製和部分複製
-
故障處理
-
開發運維常見問題
Redis單機問題
-
機器故障
-
容量瓶頸
-
QPS瓶頸
主從複製的作用
-
資料副本
-
擴充套件讀效能(讀寫分離)
主從複製限制
-
主從複製限制一個master(主)可以有多個slave(從)
-
一個slave只能有一個master
-
資料流向是單向的,master到slave
_______________________________________________________________________________________________
兩種實現方式
主從複製是不會在一臺機子上的
1.slaveof命令
2.配置
1.slaveof命令 (非同步的)
取消複製
2.配置
兩種方式對比
方式 |
命令 |
配置 |
優點 |
無需重啟 |
統一配置 |
缺點 |
不便於管理 |
需要重啟 |
主從複製其實依賴RDB檔案
___________________________________________________________________
全量複製:
全量同步的工作細節: master 開啟一個後臺儲存程序,以便於生產一個 RDB 檔案。同時它開始緩衝所有從客戶端接收到的新的寫入命令。當後臺儲存完成時, master 將資料集檔案傳輸給 slave, slave將之儲存在磁碟上,然後載入檔案到記憶體。再然後 master 會發送所有緩衝的命令發給 slave。這個過程以指令流的形式完成並且和 Redis 協議本身的格式相同。 —–Redis中文官方文件
全量複製開銷:
1. bgsave時間
2. RDB檔案網路傳輸時間
3. 從節點清空資料時間
4. 從節點載入RDB的時間
5. 可能的AOF重寫時間
部分複製:
由於網路抖動等原因主從之間丟失連線,期間存在部分資料的不同步,主節點會將這期間的資料寫入一個緩衝佇列中,當從節點重新連線上主節點後,主節點判斷從節點的offset偏移量是否在該緩衝中,然後將從偏移量開始到佇列結束的資料同步給slave (資料丟失最簡單的方式是再做一次全量複製,但這麼做開銷特別大。這在2.8版本之前都是這麼做的)
無需磁碟參與的複製
正常情況下,一個全量重同步要求在磁碟上建立一個 RDB 檔案,然後將它從磁碟載入進記憶體,然後 slave以此進行資料同步。
如果磁碟效能很低的話,這對 master 是一個壓力很大的操作。Redis 2.8.18 是第一個支援無磁碟複製的版本。在此設定中,子程序直接傳送 RDB 檔案給 slave,無需使用磁碟作為中間儲存介質。
–redis官方文件http://www.redis.cn/topics/replication.html
_________________________________________________________________________________________
故障處理
自動故障轉移
slave故障:一主多從的情況,客戶端遷移 (從一個slave到另一個slave)
master故障:選擇slave成為新的master,客戶端遷移
主從複製沒有解決真正的故障自動轉移
—-> 高可用—->Redis sentinel
開發與運維中的問題
1. 讀寫分離
master負責寫,slaves負責讀
可能問題:
- 資料複製的延遲
- 讀到過期的資料(master過期資料,slave未同步,redis3.2解決)
- 從節點故障
2. 主從配置不一致
比如maxmemory不一致會產生資料的丟失,從記憶體小於主記憶體,淘汰機制丟失資料,
資料結構優化引數:主節點有,從節點沒有,造成記憶體不一致
3. 規避全量複製(帶來的開銷)
- 第一次全量複製不可避免,,夜間執行,分片。。
- 節點執行ID不匹配(主節點重啟等)
- 複製積壓緩衝區不足–>增大複製緩衝區配置rel_backlog_size
4. 規避複製風暴
大量的主從複製。
- 單主節點重啟
- 單機器複製,機器上有多個節點
主節點分散到多個機器
採用高可用的架構,slave晉升機制