关键参数有两个: 参数 默认值 作用 repl-timeout 60秒 主从之间 ping/pong 超时阈值 tcp-keepalive 300 秒 底层 TCP keepalive 探活间隔 ⚠️ 问题就出在这里:如果网络瞬时抖动(比如交换机丢包、跨可用区延迟突增),导致 超过 repl-timeout 时间内没有收到对方响应,Redis 就会认为连接已断,主动关闭复制连接。 而默认的 repl-timeout=60 在高延迟或不稳定网络中 过于敏感。 原理补充: Redis 的复制心跳是应用层协议(非依赖 TCP keepalive)。 解决方案 4.1 适当增大 repl-timeout 编辑从节点的 redis.conf: # 原值:60 repl-timeout 180 根据不同的环境,对应的建议值如下: 内网稳定环境:60~90 验证效果:调优后连续 7 天零断连 我们将上述配置应用到生产从节点: repl-timeout 180 tcp-keepalive 60 client-output-buffer-limit slave
repl-timeout 主从复制超时 以下三种情况认为复制超时: 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
repl-timeout 60 秒 这个参数一定不能小于repl-ping-replica-period,可以考虑为repl-ping-replica-period的3倍或更大。 repl-timeout和cluster-node-timeout的区别: 默认值 单位 repl-timeout 60 秒 决定复制超时,并不能决定slave发起选举,也不决定master何时为
/var/lib/redis # 最大内存 maxmemory 1gb maxmemory-policy allkeys-lru # 主从相关优化 repl-backlog-size 256mb repl-timeout 日志 logfile "/var/log/redis/redis-server.log" # 复制相关优化 repl-diskless-sync no repl-backlog-size 256mb repl-timeout
要注意该参数受到操作系统最大文件句柄的限制(ulimit -n ) 【2】repl-ping-slave-period/repl-timeout:1)、说明:slave 会每隔 repl-ping-slave-period (默认10秒)ping 一次 master,如果查过 repl-timeout(默认 60秒)都没有收到响应,就会认为 Master 挂掉。 可以适当调大 repl-timeout 【3】client-output-buffer-limit:1)说明:客户端输出缓冲区大小。
可以通过调大 repl-timeout 参数来解决此问题。 Redis 虽然支持无盘复制,即直接通过网络发送给从节点,但功能不是很完善,生产环境慎用。 当从节点出现网络中断,超过了 repl-timeout 时间,主节点就会中断复制连接。 主节点会将请求的数据写入到“复制积压缓冲区”,默认 1MB。 主节点收到 replconf 信息后,判断从节点超时时间,如果超过 repl-timeout 60 秒,则判断节点下线。 ?
报如下所示错误: for lack of backlog (Slave request was: 51875158284) 通过网上查找资料,修改client-output-buffer-limit和repl-timeout
可以通过调大 repl-timeout 参数来解决此问题。 2、Redis 虽然支持无盘复制,即直接通过网络发送给从节点,但功能不是很完善,生产环境慎用。 1、当从节点出现网络中断,超过了 repl-timeout 时间,主节点就会中断复制连接。 2、主节点会将请求的数据写入到“复制积压缓冲区”,默认 1MB。 4、主节点收到 replconf 信息后,判断从节点超时时间,如果超过 repl-timeout 60 秒,则判断节点下线。 ?
replicationCron(),在其中判断当前时间距离上次收到各个从节点REPLCONF ACK的时间,是否超过了repl-timeout值,如果超过了则释放相应从节点的连接。 为了避免这种情况的发生,除了注意Redis单机数据量不要过大,另一方面就是适当增大repl-timeout值,具体的大小可以根据bgsave耗时来调整。 第一种情况:网络问题时间极为短暂,只造成了短暂的丢包,主从节点都没有判定超时(未触发repl-timeout);此时只需要通过REPLCONF ACK来补充丢失的数据即可。 第二种情况:网络问题时间很长,主从节点判断超时(触发了repl-timeout),且丢失的数据过多,超过了复制积压缓冲区所能存储的范围;此时主从节点无法进行部分复制,只能进行全量复制。 2) repl-timeout 60:与各个阶段主从节点连接超时判断有关,见前面的介绍。
一次主从切换记录1 测试集群运行在同一个物理机上,cluster-node-timeout值比repl-timeout值大。 6.1. cluster-node-timeout值为30000 repl-ping-slave-period值为1 repl-timeout Jan 2019 20:12:32.810 # MASTER timeout: no data nor PING received... // 发现master超时,master异常10秒后发现,原因是repl-timeout 一次主从切换记录2 测试集群运行在同一个物理机上,cluster-node-timeout值比repl-timeout值小。 7.1. cluster-node-timeout值为10000 repl-ping-slave-period值为1 repl-timeout
总结就是上面间隔多少秒发送一次检测存活的pingPong信号,下面repl-timeout就是判定发送这个信号后的返回超时时间。 repl-timeout 设置主库批量数据传输时间或者ping回复时间间隔,默认值是60秒。一定要确保repl-timeout大于repl-ping-slave-period。
maxmemory-policy volatile-lru maxmemory-samples 3 slowlog-log-slower-than 10000 repl-backlog-size 64mb timeout 0 repl-timeout maxmemory-policy volatile-lru maxmemory-samples 3 slowlog-log-slower-than 10000 repl-backlog-size 64mb timeout 0 repl-timeout
当redis检测到repl-timeout超时(默认值60s),将会关闭主从之间的连接,redis replica 发起重新建立主从连接的请求。 repl-timeout 60 主从空间堆积策略 Master 在接受数据写入后,会写到 replication buffer(这个主要用于主从复制的数据传输缓冲),同时也写到 积压replication
问题又来了何为及时,Redis通过参数repl-timeout来设定,它的默认值是60s。 Redis配置文件(redis.conf)中详细解释了repl-timeout的含义: # The following option sets the replication timeout for: a timeout will be detected # every time there is low traffic between the master and the slave. # # repl-timeout 60 我们回过头再来看上边的同步日志,从节点加载RDB文件花费将近三分钟的时间,超过了repl-timeout,所以从节点认为与主节点的连接断开,所以它尝试重新连接并进行主从同步。
0 如果要最大的可用性,值设置为0 repl-ping-slave-period 1 slave ping master的时间间隔,单位为秒 repl-timeout 设置达到最大内存时的淘汰策略 client-output-buffer-limit 设置master端的客户端缓存 repl-timeout 3) for lack of backlog (Slave request was: 51875158284) 默认值: # redis-cli config get repl-timeout 8388608 60" 4) 复制中断场景 A) master的slave缓冲区达到限制的硬或软限制大小,与参数client-output-buffer-limit相关; B) 复制时间超过repl-timeout 指定的值,与参数repl-timeout相关。
解决方案1、增大 repl-backlog-size ,大多数场景默认100M已经够用,这套环境是个特例,该参数设置过大会导致 OS 可用内存变少,有可能会触发 OOM ,因此暂不考虑;2、增大 repl-timeout 暂时选择了方案2,调大 repl-timeout 后该问题得到解决。
1、repl-backlog-size太小,默认是1M,如果你有大量的写入,很容易击穿这个缓冲区;2、repl-timeout,Redis主从默认每十秒钟ping一次,60秒钟ping不推就会主从重置, 首先是大规模的消息下发导致负载增加;然后,Redis Master压力增大,TCP包积压,OS产生丢包现象,丢包把Redis主从ping的包给丢了,触发了repl-timeout 60秒的阈值,主从就重置了 五、tcp-backlog、repl-backlog-size、repl-timeout适度增大。 六、Master不做持久化,Slave做AOF+定时重置。 最后是个人的一些思考和建议。
repl-timeout:这是一个超时间,当某些操作达到这个时间时,Master和Slave双方都会认为对方已经断开连接。实际上您可以将这个时间看成是一个租约到期的时间。 MASTER time out: no data nor PING received… slave 会每隔repl-ping-slave-period(默认10秒)ping一次master,如果超过repl-timeout 可以适当调大repl-timeout。
最终参数优化调整如下(主库): repl-backlog-size 512mb repl-timeout 120 client-output-buffer-limit normal 0 0 0 client-output-buffer-limit
告诉主节点从节点当前同步数据的位置,以防命令出现丢失网络延迟/中断引起的问题从节点因为网络中断或者从节点CPU占用过高,导致没与主节点维持心跳导致主节点各种资源被从节点占用,可以通过设置心跳超时时间来解决 (**repl-timeout ** 默认60s,超时释放从节点)主节点发送的ping命令可能在网络中丢包,所以超时时间设置太短**repl-timeout**和发送ping命令频率设置太低**repl-ping-slave-period