redis高級之集羣---主從複製(四)---主從複製常見問題

  • 頻繁的全量複製(1)

伴隨着系統的運行,master的數據量會越來越大,一旦master重啓,runid將發生變化,會導致全部slave的全量複製操作

內部優化調整方案:

  1. master內部創建master_replid變量,使用runid相同的策略生成,長度41位,併發送給所有slave
  2. 在master關閉時執行命令shutdown save,進行RDB持久化,將runid與offset保存到RDB文件中
  1. Repl-id repl-offset
  2. 通過redis-check-rdb命令可以查看該信息
  1. master重啓後加載RDB文件,恢復數據

重啓後,將RDB文件中保存的repl-id與repl-offset加載到內存中

master_repl_id = rep1   master_repl_offset = repl-offset

通過info命令可以查看該信息

作用:本機保存上次runid,重啓後恢復該值,使所有slave認爲還是之前的master

 

  • 頻繁的全量複製(2)

問題現象:網絡環境不佳,出現網絡中斷,slave不提供服務

問題原因:複製緩衝區過小,斷網後slave的offset越界,觸發全量複製

最終結果:slave反覆進行全量複製

解決方案:修改複製緩衝區大小

repl-backlog-size

建議如下

  1. 測算從master到slave的重連平均時長second
  2. 獲取master平均每秒產生寫命令數據總量write_size_per_second
  3. 最優複製緩衝區空間=2*second*write_size_per_second

 

  • 頻繁的網絡中斷(1)

問題現象:master的cpu佔用過高或slave頻繁斷開連接

問題原因:slave每1秒發送REPLCONF ACK 命令到master

當slave接到了慢查詢時(keys*,hgetall等),會大量佔用cpu性能

Master每1秒調用複製定時函數replicationCron(),比對slave發現長時間沒有進行響應

最終結果:master各種資源(輸出緩衝區、帶寬、連接等)被嚴重佔用

解決方案:通過設置合理的超時時間,確認是否釋放slave

repl-timeout

該參數定義了超時時間的閾值(默認60秒),超過該值,釋放slave

 

  • 頻繁的網絡中斷(2)

問題現象

slave與master連接斷開

問題原因

master發送ping指令頻度較低

Master設定超時時間較短

Ping指令在網絡中存在丟包

解決方案:提高ping指令發送的頻度

超時時間repl-time的時間至少是ping指令頻度的5到10倍,否則slave很容易判定超時

 

  • 數據不一致

問題現象:多個slave獲取相同數據不同步

問題原因:網絡信息不同步,數據發送有延遲

解決方案:優化主從間的網絡環境,通常設置在同一個機房部署,如使用阿里雲等雲服務器時要注意此現象

監控主從節點延遲(通過offset)判斷,如果slave延遲過大,暫時屏蔽程序對該slave的數據訪問

slave-serve-stale-data yes|no

開啓後僅響應info、slaveof等少數命令(慎用,除非對數據一致性要求很高)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章