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才強制關閉,問題解決。
在主庫的日志里面看到現象如下:
在從庫的日志里面看到現象如下:
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。