ITPub博客

首页 > 数据库 > 数据库开发技术 > 生产故障排查记录:Redis 中间件疑难错误排查与修复

生产故障排查记录:Redis 中间件疑难错误排查与修复

原创 数据库开发技术 作者:DevOps和k8s全栈技术 时间:2024-12-25 13:51:42 0 删除 编辑
欢迎关注我的公众号「DevOps和k8s全栈技术」,进公众号【服务】栏,可以看到技术群,点击即可加入学习交流群。↓↓↓

一、问题描述
某生产环境中,Redis 集群出现间歇性超时(timeout)和高延迟,部分应用侧出现 READONLY You can't write against a read-only replica 错误。

二、问题分析
1. 错误现象
    1)应用层报错:
    Timeout waiting for connectionREADONLY You can't write against a read-only replica
    ‍2)Redis 集群监控显示
    主节点 CPU 使用率接近 100%。节点间通信出现延迟波动。慢查询日志中存在大量命令。

2. 初步怀疑原因
网络抖动导致主从切换(failover),部分请求发送到了只读节点。客户端连接池配置不当或连接耗尽。应用层滥用高耗时命令(如 keys、hgetall 等)。节点内存不足或硬件问题(例如磁盘性能)。
3. 排查步骤
(1)排查 Redis 日志
通过 Redis 日志(redis.log)发现:
  • 集群频繁出现 LOADING Redis is loading the dataset in memory,意味着节点重启后在加载数据。
  • 间歇性出现 FAILOVER 日志,主从角色切换。
  • 有大量 CLIENT_KILL 日志,表示 Redis 主动断开了一些客户端连接。
(2)检查网络状况
  • 使用 ping 和 mtr 工具检查应用服务器与 Redis 节点间的网络连接,发现延迟波动较大。
  • 部分节点的 INFO replication 输出中显示 master_link_down_since_seconds > 0,表明主从连接中断。
(3)检查慢查询日志
通过 Redis 的 SLOWLOG 查看慢查询日志:
  • 大量 KEYS 命令在慢查询中占比高。
  • 某些哈希表的 hgetall 命令返回了超过 10000 行结果。
(4)检查节点资源使用
  • 部分节点的内存使用接近限制,触发了 Redis 的内存回收策略(eviction)。
  • 主节点的 CPU 使用率高达 95%~100%,主要由大键(big keys)操作导致。

三、修复与优化方案
1. 网络优化
1)更换稳定的网络链路: 将 Redis 集群迁移到网络延迟低、带宽稳定的专有网络中。
2)配置 TCP keepalive: 在 Redis 配置中增加 tcp-keepalive 参数,减少因网络抖动导致的连接断开。
tcp-keepalive 60
2. 客户端优化
  • 调整连接池配置: 增加连接池最大连接数,减少 timeout waiting for connection 错误。
  • 优化连接策略: 使用支持 Redis Sentinel 或 Cluster 模式的客户端,以便自动识别主从节点。
3. 应用层优化
  • 避免使用高耗时命令:
    • 将所有 KEYS 替换为 SCAN 命令,分批获取键,降低主节点压力。
    • 针对 hgetall,按需使用字段过滤(如 hmget)。
  • 大键拆分: 针对慢查询日志中的大键,优化为小粒度存储。例如将一个大的 hash 拆分为多个子 hash。
4. Redis 配置优化
  • 增加慢查询阈值报警: 设置 slowlog-log-slower-than 参数并定期分析慢查询日志。
slowlog-log-slower-than 10000  # 单位:微秒slowlog-max-len 128
  • 内存优化:使用 maxmemory-policy 参数合理选择淘汰策略,例如 allkeys-lru。
    maxmemory-policy allkeys-lru
  • 限制客户端请求频率:启用 client-output-buffer-limit 限制客户端的流量峰值。
‍
5. 主从同步问题修复
  • 修复主从断开问题:
    • 优化磁盘性能(如更换为 SSD)。
    • 调整从节点的 repl-backlog-size 参数,增加主从同步的缓冲区大小,减少全量同步触发几率。
repl-backlog-size 128mb
四、总结
  • 生产环境中 Redis 问题通常是网络、资源和命令使用模式的综合问题。
  • 通过合理的配置优化、应用程序调整以及资源监控,可以高效排查并修复中间件问题。

近期热文:


欢迎关注我的公众号「DevOps和k8s全栈技术」,进公众号【服务】栏,可以看到技术群,点击即可加入到学习交流群。↓↓↓


原文作者:DevOps和k8s全栈技术;如有侵权,请联系管理员删除。

上一篇: 没有了~
请登录后发表评论 登录
全部评论
云计算架构师、阿里云开发者社区专家博主、腾讯云架构师北京同盟成员、Linux基金会开源软件学园2023、2024年度优秀讲师,在中国计算机学会(CCF)任职人工智能与模式识别委员和计算机应用委员、中国科普作家协会会员,清华大学出版社出版的畅销书《Kubernetes从入门到DevOps企业应用实战》作者。

注册时间:2017-10-15

  • 博文量
    127
  • 访问量
    61684