Redis集群主备缓存区满了导致主备频繁倒换
2023-06-13 09:11:31 时间
问题现象
Redis 频繁进行主备倒换,通过查看主实例的日志:redis.log发现下面报错:
Client id=1317049445 addr=192.168.2.45:8004 fd=40 name= age=314 idle=0 flags=S db=0 sub=0
psub=0 multi=-1 qbuf=0 qbuf-free=32568 obl=0 oll=4430 omem=761143439 events=rw cmd=psync
scheduled to be closed ASAP for overcoming of output buffer limits
其中:psync scheduled to be closed ASAP for overcoming of output buffer limits
明显就是问题所在,那是什么问题呢。
解决思路
于是我在源码中搜索了scheduled to be closed ASAP for overcoming of output buffer limits
(psync明显是一个命令,就不用在代码里面搜索了)。
于是,我找到了下面代码:
/* If the source client contains a partial response due to client output
* buffer limits, propagate that to the dest rather than copy a partial
* reply. We don't wanna run the risk of copying partial response in case
* for some reason the output limits don't reach the same decision (maybe
* they changed) */
if (src->flags & CLIENT_CLOSE_ASAP) {
sds client = catClientInfoString(sdsempty(),dst);
freeClientAsync(dst);
serverLog(LL_WARNING,"Client %s scheduled to be \
closed ASAP for overcoming of output buffer limits.", client);
sdsfree(client);
return;
}
单从代码来看,看不出啥,但是代码上面存在注释,我使用我那四级水平翻译了下,可以看出缓存区满了,于是可以想到可能主备同步的时候可能会限制缓存区大小,并且这个缓存区被占满了。
于是我又在redis.conf中找了缓冲区的相关配置,找到了下面是三个:
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
配置格式为:
client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>
具体含义:
- class:我理解就是缓冲区的类型,目前Redis的缓冲区分为三个:
- 普通客户端:
normal
- 主备同步:
replica
- 发布订阅:
pubsub
- 普通客户端:
- hard limit: 缓冲区大小的硬性限制。当达到这个限制之后,连接就会断开。
- soft limit: 缓冲去大小的软性限制。
- soft seconds: 缓冲区大小达到了(超过)soft limit值的持续时间。
因此我们可以将client-output-buffer-limit replica 256mb 64mb 60
作出简单调整,重启Redis服务之后解决这个问题。
相关文章
- Redis:极速储存新答案(redis干什么用的)
- 搭建Redis虚拟主机,实现高效缓存服务(redis虚拟主机)
- 实现Redis功能测试:一组精心策划的用例(redis测试用例)
- 排查 Redis 运行中的问题:查看 Redis 日志(查看redis日志)
- 使用 Redis 缓存优化数据库表数据操作(redis缓存表数据)
- 探索Redis列表命令的功能性(查看redis列表命令)
- 搭建最优可用的小型Redis集群(最小redis集群)
- Win10环境下测试Redis功能(win10测试redis)
- TP5新高度使用Redis缓存极大提升应用性能(tp5配置redis缓存)
- 红色导航利用Redis优化缓存性能(导航条用redis做缓存)
- 解决Redis雪崩实践与改进(redis雪崩之后怎么办)
- Redis集群实现高可用的架构(redis集群高可用架构)
- Redis集群有多么重要(redis集群重要吗)
- Redis集群模式存在的缺点(redis 集群模式缺点)
- Redis集群采用哨兵服务器保障高可用性(redis集群有哨兵吗)
- 解决Redis集群数据不均衡的方法(redis集群数据不均衡)
- Redis集群重搭快速解决集群搭建难题(redis 集群怎么重搭)
- 基于Redis队列的ACK机制研究(redis队列ack机制)
- Redis运维解决错误排查之路(redis运维错误排查)
- 处理Redis超出最大连接数的有效方法(redis超出最大连接数)
- 缓存实现快速响应Redis请求级别缓存(redis 请求级别)
- 部署Redis集群节点命令指导(redis节点命令)
- 实战Redis缓存设计提升性能的有效方案(redis缓存设计实战)