redis主從複製同步數據死循環問題
發現現象:
最近有問必答codis一個從庫端口6504一直時不時,主從延時和從庫連接不上的報警,開始懷疑是redis備份導致,沒有深入去找原因,後面發現白天也在報警,故深入排查了一下原因。
host: 10.20.1.4
port: 6504
idc: KDDI
role: redis_s
item: r_replication
current: 32767
last: 1 minutes.
info:
send at [2015-11-27 09:17:49]
------------------------------------------
host: 10.20.1.4
port: 6504
idc: KDDI
role: redis_s
item: r_connection
current: 0
last: 1 minutes.
info: failed
send at [2015-11-27 08:13:46]
問題現象:
1、登錄到從庫所在服務器,奇怪的發現了,從庫週期性的在產生temp-rewriteaof-xxx.aof文件,見下圖
2、從庫的日誌裏面出現大量“Connection with master lost”日誌,從句面意思來理解是說主庫連接丟失,見下圖
3、登錄到主庫,查看日誌發現了"Connection with slave 10.20.1.4:6504 lost"和“scheduled to be closed ASAP for overcoming of output buffer limits.”兩條重要信息
4、登錄到主庫使用info命令發現“slave0:ip=10.20.1.4,port=6504,state=send_bulk,offset=0,lag=0”
問題分析:
1、通過從庫週期性的生成aof文件以及日誌裏面看到週期性的連接主庫lost現象,初步懷疑是複製層面的問題,並查看其他幾個從庫的日誌沒有發現這種情況,先排除網絡問題
2、在主庫也發現了連接從庫lost現象,確定是6504端口redis內部的問題,並且看到“overcoming of output buffer limits”,提示buffer限制了
3、以上信息基本上可以確認問題的原因,先回想一下redis主從複製原理:當在從庫執行slaveof ip port命令之後,主庫會使用bgsave生成一個rdb快照文件,生成文件之後通過網絡將這個文件傳到從庫,同時主庫上會將生成rdb快照那一刻起的新數據寫的一個buffer緩衝區,另一方面,從庫接受主庫剛剛生成那個rdb文件之後,開始加載這個rdb文件,加載需要一定時間,如果這個時間越長,其主庫的寫入量越大,那麼剛剛主庫產生的buffer也會越大(當然不能無限大),在主庫client-output-buffer-limit參數 slave 268435456 67108864 60設置了其大小,意思說如果buffer大小超過256Mb或者連續60秒鐘產生的buffer大小大於64Mb,則buffer會強制關閉
解決辦法:
1、調整主庫client-output-buffer-limit默認參數,CONFIG SET client-output-buffer-limit "slave 1073741824 268435456 300",將其限制設置爲1G,連續300秒超過256Mb才強制關閉,問題解決。
在主庫的日誌裏面看到現象如下:
在從庫的日誌裏面看到現象如下: