欢迎关注我的公众号「DevOps和k8s全栈技术」,进公众号【服务】栏,可以看到技术群,点击即可加入学习交流群。↓↓↓某生产环境中,Redis 集群出现间歇性超时(timeout)和高延迟,部分应用侧出现 READONLY You can't write against a read-only replica 错误。
网络抖动导致主从切换(failover),部分请求发送到了只读节点。客户端连接池配置不当或连接耗尽。应用层滥用高耗时命令(如 keys、hgetall 等)。节点内存不足或硬件问题(例如磁盘性能)。
通过 Redis 日志(redis.log)发现:
- 集群频繁出现 LOADING Redis is loading the dataset in memory,意味着节点重启后在加载数据。
- 间歇性出现 FAILOVER 日志,主从角色切换。
- 有大量 CLIENT_KILL 日志,表示 Redis 主动断开了一些客户端连接。
- 使用 ping 和 mtr 工具检查应用服务器与 Redis 节点间的网络连接,发现延迟波动较大。
- 部分节点的 INFO replication 输出中显示 master_link_down_since_seconds > 0,表明主从连接中断。
通过 Redis 的 SLOWLOG 查看慢查询日志:
- 某些哈希表的 hgetall 命令返回了超过 10000 行结果。
- 部分节点的内存使用接近限制,触发了 Redis 的内存回收策略(eviction)。
- 主节点的 CPU 使用率高达 95%~100%,主要由大键(big keys)操作导致。
1)更换稳定的网络链路: 将 Redis 集群迁移到网络延迟低、带宽稳定的专有网络中。2)配置 TCP keepalive: 在 Redis 配置中增加 tcp-keepalive 参数,减少因网络抖动导致的连接断开。
- 调整连接池配置: 增加连接池最大连接数,减少 timeout waiting for connection 错误。
- 优化连接策略: 使用支持 Redis Sentinel 或 Cluster 模式的客户端,以便自动识别主从节点。
- 将所有 KEYS 替换为 SCAN 命令,分批获取键,降低主节点压力。
- 针对 hgetall,按需使用字段过滤(如 hmget)。
- 大键拆分: 针对慢查询日志中的大键,优化为小粒度存储。例如将一个大的 hash 拆分为多个子 hash。
- 增加慢查询阈值报警: 设置 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 限制客户端的流量峰值。
- 调整从节点的 repl-backlog-size 参数,增加主从同步的缓冲区大小,减少全量同步触发几率。
- 生产环境中 Redis 问题通常是网络、资源和命令使用模式的综合问题。
- 通过合理的配置优化、应用程序调整以及资源监控,可以高效排查并修复中间件问题。
近期热文:
欢迎关注我的公众号「DevOps和k8s全栈技术」,进公众号【服务】栏,可以看到技术群,点击即可加入到学习交流群。↓↓↓
原文作者:DevOps和k8s全栈技术;如有侵权,请联系管理员删除。