redis因AOF追加磁盤阻塞發生故障轉移
redis 錯誤日誌截圖
下圖為AOF工作流程圖
AOF工作流程圖
1.所有的寫入命令會追加aof_buf(緩沖區中)。
2.AOF緩沖區根據對應的策略向硬盤做同步操作。
3.隨著AOF文件越來越大,需要定期對AOF文件進行重寫,達成壓縮的目的(對一個key跟新100次會有100條記錄, 重寫後只留最後一條).
4.當redis服務器重啟時,可以加載AOF文件進行數據恢復。
原主數據庫追加aof阻塞
ip地址 原主庫追加阻塞次數.
aof_delayed_fsync:154
使用everysec(每秒)刷盤策略的流程圖
1.主線程負責AOF緩沖區
2.AOF線程負責每秒一次同步磁盤操作,並記錄最近一次同步時間.
3.主線程對比AOF同步時間:
3.1如果距離上次同步時間在兩秒內,主線程直接返回。
3.2如果距離上次同步時間超過兩秒(意識是現在還在同步),主線程將會被阻塞, 直到同步完成。
整個集群的其他主庫阻塞次數統計
15臺主庫的AOF 在SYNC的時候因磁盤繁忙,
追加AOF時阻塞次數,其中有11臺主庫被阻塞過,
aof_delayed_fsync阻塞次數.
ip1
# Persistence
aof_delayed_fsync:1
ip2
# Persistence
aof_delayed_fsync:18
ip3
# Persistence
aof_delayed_fsync:0
ip4
# Persistence
aof_delayed_fsync:1
解決方案
1.打開no-appendfsync-on-rewrite參數, 默認關閉,表示AOF重寫期間不做sync操作, 並不能根本解決問題, 因為故障轉移前沒有發生AOF重寫。
2.關閉AOF, 如果一組(主-從) 同時宕機, 會丟失5分鐘數據,啟動redis時如果沒有發現AOF文件,redis 會選擇RDB來恢復數據,rdb copy-on-write到磁盤的頻率5分鐘一次。
3.提升磁盤寫入速度。
重啟加載流程圖
RDB 物化到磁盤頻率圖
redis因AOF追加磁盤阻塞發生故障轉移