记录一次因为redis aof rewrite重写导致的运维事故
事情起因
redis master 所在物理机A, 物理内存16G, aof rewrite 被触发时, aof文件已达12G, redis的默认配置触发了后台的rewrite进程, 内存占用达到了50%, 已严重影响到redis的正常访问. 而此时距离美股交易开盘只剩1小时.
处理过程
跟server组几名同事(carl, shilinchen, echo, jiezhao, zhiguocai)一起理清楚问题现状
- redis slave的数据是完整的, 1小时内不会有写入请求
- aof rewrite进程已运行2小时, 是否能在1小时内运行完毕不可控
- aof rewrite进程, 即使在1小时内运行完, 不确认是否会马上触发第2次rewrite
整理方案如下:
- 将物理机B的redis slave切换为master, 使其跟现有物理机A的redis脱离master-slave关系
- 对生产环境的hosts文件修改, 使hosts中配置的域名指向新的master
- 重启相关进程, 使其连接到新的redis master
- 测试白名单账号验证服务正常
- stop原来物理机A上的旧master进行, 暂时保留现场不动
- 第2天, 交易收盘后, 清理redis中的历史数据
- 周末进一步处理
- 新准备好下一交易日的uinfo和margin相关数据
- 将物理机A的redis配置为物理机B新master的slave
- 重命名该redis配置路径的aof文件
- 重启该redis, 使该redis从0开始从物理机A的redis master进行数据同步
- 手动触发物理机B的redis master的aof rewrite, 此过程完成后, aof文件从10G变为1.5G
- 补齐定期删除历史数据的server逻辑
后记
交易系统和风控系统经过重新设计, 进行了重构, redis已经是过去时了, 不过曾经踩过的这个坑希望能记录下来, 让我们时时警示一下.