现象:redis一组主从节点同时在做aof备份,导致这一组节点不可用。新连接失败,只有老的连接可用。
解决办法:重启从节点,通过AOF恢复集群数据(有一小段数据丢失,业务无影响),将重启完成的节点切换为主节点。
Redis 7.0 Multi Part AOF的设计和实现
廖可知的专栏的全部内容 - 云+社区 - 腾讯云https://cloud.tencent.com/developer/column/1411
总结根本原因
- 业务量增大,redis内存占用增加,系统内存不足
- 一组主从aof同时进行,fork子进程因为内存不足失败
- fork子进程失败,导致fd泄露,多次fork导致系统暴增,系统fd资源耗尽
- 系统fd资源耗尽,导致系统新的IO(网络连接+文件操作)失败
- fd的最大限制是redis集群配置的最大连接数maxConection+128
长远方案
- 内存占用优化:空间优化,redis集群按照业务拆分
- 系统内存扩容
- redis集群升级成本版7
- redis内存暴增监控
- 设置linux系统的vm.overcommit_memory = 1(其意义可查阅man手册,本文不再展开),尽量减少子进程fork失败的情况;
- 设置Redis的maxmemory限制,当内存使用达到一定比例时不再接受新的数据;
- 使用主从备份,或bgsave持久化(RDB方式无此问题),关闭AOF持久化,等下一版本发布。