1. 程式人生 > >Redis -- 複製的原理及優化

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晉升機制