今天在線上環境中遇到了codis-server報警,按照常規處理流程進行處理,報錯步驟如下:
- 首先將codis-slave的rdb文件移除,並重啟codis-slave
- 在codis-dashbord中將codis-slave移除問題codis group
- 將codis-slave重新加入codis group,並測試在codis-master中寫入數據,查看codis-slave中能否正常讀取數據
沒想到在新加入codis group同步數據時發生以下報錯:
[13029] 15 Oct 13:56:29.063 # Client id=8443510 addr=10.24.193.69:30377 fd=6 name= age=187 idle=187 flags=S db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=16365 oll=3917 omem=100541448 events=rw cmd=psync scheduled to be closed ASAP for overcoming of output buffer limits.
[13029] 15 Oct 13:56:29.160 # Connection with slave 10.24.193.69:6379 lost.
[13029] 15 Oct 13:56:30.607 * Slave 10.24.193.69:6379 asks for synchronization
[13029] 15 Oct 13:56:30.607 * Full resync requested by slave 10.24.193.69:6379
[13029] 15 Oct 13:56:30.607 * Starting BGSAVE for SYNC with target: disk
[13029] 15 Oct 13:56:30.856 * Background saving started by pid 17765
[17765] 15 Oct 13:58:26.910 * DB saved on disk
[17765] 15 Oct 13:58:27.093 * RDB: 969 MB of memory used by copy-on-write
[13029] 15 Oct 13:58:27.492 * Background saving terminated with success
出現以上報錯的原因是codis/redis默認配置中```repl-timeout```的時間為60s,當復制數據的時間超過60s時,codis/redis master就會認為連接超時主動斷開連接,也就是```Connection with master lost```報錯。當然簡單的理解,復制的過程中肯定有兩個參數,一個是復制時長,另一個就是每秒/每分鍾復制數據占用服務器資源的大小```client-output-buffer-limit```參數就決定了客戶端輸出緩沖區內存使用量,所以我們可以通過調整這兩個參數來解決此次問題。
解決Redis/Codis同步超時問題
我們的codis部分配置文件如下:
repl-timeout 60 client-output-buffer-limit slave 256mb 64mb 60上面是master上的slave客戶端,默認緩沖區大小限制:當緩沖區使用超過256mb,master會盡快殺掉它;當緩沖區使用大於64mb,且小於256mb的soft limit值時,並持續時間達60秒,也會被Master盡快殺掉。
綜上所述
解決超時問題有兩種方式:
- 修改超時時間長短
repl-timeout 60- 修改緩沖區占用內容大小限制
client-output-buffer-limit
當數據同步完成后最好將配置修改為原配置,避免占用服務器資源過高引起其他問題
