转载

Redis主从复制网络闪断处理

先记录几个有意思的用法
1.重复执行
-r 选项重复执行一个命令指定的次数。
-i 设置命令执行的间隔。
比如查看redis每秒执行的commands(qps)

./redis-cli -r 100 -i 1 info stats | grep instantaneous_ops_per_sec
instantaneous_ops_per_sec:334
instantaneous_ops_per_sec:306
instantaneous_ops_per_sec:294
instantaneous_ops_per_sec:349
instantaneous_ops_per_sec:371
instantaneous_ops_per_sec:380
instantaneous_ops_per_sec:388

2.获取指定redis实例的rdb文件,保存到本地
redis-cli -h 192.168.44.16 -p 6379 --rdb 6379.rdb

3.模拟slave从master上接收到的commands
./redis-cli --slave

和monitor不一样,monitor接收所有命令.而--slave仅仅接收 insert,update,delete的命令.

4.--scan和--pattern
代替 keys IM*
./redis-cli --scan --pattern 'IM*'

这样不会长时间阻塞redis而导致其他客户端的命令请求一直处于阻塞状态。

参考:
http://mdba.cn/2015/03/12/redis-cli%E7%9A%84%E4%B8%80%E4%BA%9B%E6%9C%89%E8%B6%A3%E4%B9%9F%E5%BE%88%E6%9C%89%E7%94%A8%E7%9A%84%E5%8A%9F%E8%83%BD/


最近经常收到邮件报警,
一般都是Redis CPU使用率达到阈值.
那是一个Slave实例,qps也就仅仅几百而已.
经过排查,应该是网络不稳定,导致的Slave断线重连.

中间有几个参数,还得重新回顾一下.

1.client-output-buffer-limit
redis server以单进程的方式处理接收到的请求,而redis完成请求有些工作比较慢,比如网络IO和磁盘IO等比较慢的操作。redis为了提高处理客户端请求的响应时间,做了很多优化。比如网络io和磁盘io是异步完成、使用后台进程完成bgsave和bgrewriteaof工作,在server端为客户提供读buffer等等。
client buffer是在server端实现的一个读取缓冲区。redis server在接收到客户端的请求后,把影响结果写入到client buffer中,而不是直接发送给客户端。server把结果写入到client buffer中后,继续处理客户端的其他请求。这样异步处理方式使redis server不会因为网络原因阻塞其他请求的处理。之前的文章中replication buffer也是client buffer中的一种。

1) "client-output-buffer-limit"
2) "normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60"

具体参数含义如下:
class : 客户端种类,normal、slave、pubsub。
– mormal:普通的客户端
– slave: 从库的复制客户端
– pub/sub: 发布与订阅的客户端的
hard limit: 缓冲区大小的硬性限制。
soft limit: 缓冲去大小的软性限制。
soft seconds: 缓冲区大小达到了(超过)soft limit值的持续时间。
client-output-buffer-limit参数限制分配的缓冲区的大小,防止内存无节制的分配。参数的默认值都为0,意思是不做任何限制。

hard limit:当buffer的量达到硬限制之后,redis立即断开与client的连接
soft limit和soft seconds:当buffer的在soft seconds秒内超出了soft limit,redis不会关闭client连接。如果当buffer的在soft seconds秒之后,仍然超出了soft limit 的限制,则redis立即关闭client连接。

2.repl-timeout
redis里面的repl-timeout参数值也太小也将会导致复制不成功.
redis配置文件中对repl-timeout的参数解释如下:
# The following option sets the replication timeout for:
#
# 1) Bulk transfer I/O during SYNC, from the point of view of slave.
# 2) Master timeout from the point of view of slaves (data, pings).
# 3) Slave timeout from the point of view of masters (REPLCONF ACK pings).
三种情况认为复制超时:
1)slave角度,如果在repl-timeout时间内没有收到master SYNC传输的rdb snapshot数据,
2)slave角度,在repl-timeout没有收到master发送的数据包或者ping。
3)master角度,在repl-timeout时间没有收到REPCONF ACK确认信息。
当redis检测到repl-timeout超时(默认值60s),将会关闭主从之间的连接,redis slave发起重新建立主从连接的请求。
对于内存数据集比较大的系统,可以增大repl-timeout参数。

3.slave ping period
redis slave会定期从master发送ping命令,时间间隔repl-ping-slave-period指定。
因而,设置参数时, repl-timeout > repl-ping-slave-period。
# Slaves send PINGs to server in a predefined interval.  The default value is 10 seconds.
# repl-ping-slave-period 10
 
# It is important to make sure that this value is greater than the values pecified for repl-ping-slave-period otherwise a timeout will be detected every time there is low traffic between the master and the slave.

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

为了避免网络不稳定造成的全量同步.
修改参数如下:
config set repl-timeout 240
config set repl-backlog-size 67108864

参考:
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/
http://mdba.cn/2015/03/18/redis%E4%B8%BB%E4%BB%8E%E5%A4%8D%E5%88%B6%EF%BC%883%EF%BC%89-%E5%A4%8D%E5%88%B6%E8%B6%85%E6%97%B6/
http://leejia.blog.51cto.com/4356849/1419997
正文到此结束
Loading...