zhmg23

我们是如此的不同
资深运维工程师互荐群: 102123162

记一次redis主从复制client-output-buffer-limit 设置遇到的问题

问题:

redis 主从复制出现问题,主从复制中断了

从日志:

 # Can't rewrite append only file in background: fork: Cannot allocate memory


主日志:

[3898] 19 Jul 08:57:27.066 # Client id=117991 addr=192.168.6.212:47179 fd=479 name= age=2426 idle=2426 flags=S db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=16383 oll=2470 omem=68932080 events=rw cmd=psync scheduled to be closed ASAP for overcoming of output buffer limits.

[3898] 19 Jul 08:57:27.162 # Connection with slave 192.168.6.212:6379 lost.

[3898] 19 Jul 08:57:28.014 * Slave 192.168.6.212:6379 asks for synchronization

[3898] 19 Jul 08:57:28.014 * Full resync requested by slave 192.168.6.212:6379

[3898] 19 Jul 08:57:28.014 * Starting BGSAVE for SYNC with target: disk 


注意上面红色字体,谷歌查了一下,说把redis的配置项调整为:

client-output-buffer-limit slave 256mb 64mb 60 

修改为

client-output-buffer-limit slave 0  0  0


以下是网上找到的相关解释:

当主服务器进行命令传播的时候,maser不仅将所有的数据更新命令发送到所有slave的replication buffer,还会写入replication backlog。当断开的slave重新连接上master的时候,slave将会发送psync命令(包含复制的偏移量offset),请求partial resync。如果请求的offset不存在,那么执行全量的sync操作,相当于重新建立主从复制。


replication backlog是一个环形缓冲区,整个master进程中只会存在一个,所有的slave公用。backlog的大小通过repl-backlog-size参数设置,默认大小是1M,其大小可以根据每秒产生的命令、(master执行rdb bgsave) +(master发送rdb到slave) + (slave load rdb文件)时间之和来估算积压缓冲区的大小,repl-backlog-size值不小于这两者的乘积。

记一次redis主从复制client-output-buffer-limit 设置遇到的问题 - zhm - 合肥运维

 

查看当前redis的repl-backlog-size参数大小

127.0.0.1:6379> config get repl-backlog-size

1) "repl-backlog-size"

2) "1048576"


主从同步的时候,slave会落后master的时间 =(master执行rdb bgsave)+ (master发送rdb到slave) + (slave load rdb文件) 的时间之和。 然后如果在这个时间master的数据变更非常巨大,超过了replication backlog,那么老的数据变更命令就会被丢弃,导致需要全量同步。

我看了一下日志,从4M 到1215M,跨度还是比较大的,所以默认1M,显然不够用

[4709] 13 Aug 01:06:29.873 * RDB: 4 MB of memory used by copy-on-write

[3639] 14 Apr 14:42:10.615 * RDB: 1215 MB of memory used by copy-on-write


设置后,查看设置参数

127.0.0.1:6379> config get client-output-buffer-limit 

1) "client-output-buffer-limit"

2) "normal 0 0 0 slave 0 0 0 pubsub 33554432 8388608 60"


参考:

https://github.com/antirez/redis/issues/1400

http://blog.arganzheng.me/posts/redis-could-not-get-resource-from-pool.html

http://mdba.cn/2015/03/19/redis%E4%B8%BB%E4%BB%8E%E5%A4%8D%E5%88%B6%EF%BC%884%EF%BC%89-client-buffer/

评论