redis主從複製同步數據死循環問題

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文件,見下圖

55197CC156B149BF80D4D849B8C7A266

2、從庫的日誌裏面出現大量“Connection with master lost”日誌,從句面意思來理解是說主庫連接丟失,見下圖

3241BD998273456AAA3B9D1FDF869C98

3、登錄到主庫,查看日誌發現了"Connection with slave 10.20.1.4:6504 lost"“scheduled to be closed ASAP for overcoming of output buffer limits.”兩條重要信息

514C7ADC7A974F3AA2642BC3B896761F

4、登錄到主庫使用info命令發現“slave0:ip=10.20.1.4,port=6504,state=send_bulk,offset=0,lag=0”

8929D2F977AF4950A134A8DB676A7574

問題分析:

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才強制關閉,問題解決。

在主庫的日誌裏面看到現象如下:

70E85796C13945CFAC880CAA7C7D28BE

在從庫的日誌裏面看到現象如下:

F588126FF0A74DFFBA1FDE9C2395518F

 


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