Redis持久化之大数据服务暂停问题
目录
RDB快照方式的问题
RDB即快照存储,通过save参数配置触发条件:
save 3600 1000 # 前一次快照3600秒后,当有超过1000个key被改动时进行快照
实测场景: 20GB内存服务器,压入13GB Redis数据,进行快照操作
当进行快照时,Redis会fork子进程,导致内存使用翻倍(父进程13GB + 子进程13GB = 26GB),产生两个redis-server进程同时运行。结果:
set test2 22 # 耗时40秒左右,接近1分钟
大数据量下RDB会导致服务暂停,这对于需要频繁快照确保数据容错的场景不可容忍。
AOF+RDB混合方式的优化
配置策略:
- RDB快照时间设置为1天
- 启用AOF进行增量持久化
- 加入5GB数据测试
阶段1:fsync(内存写入AOF文件)
- set操作:无暂停
- get操作:无暂停
- 最终AOF文件大小:5.7GB
阶段2:BGREWRITEAOF(重写AOF)
- 初始配置(no-appendfsync-on-rewrite = no):set操作出现延迟,get无延迟
- 优化配置(no-appendfsync-on-rewrite = yes):两种操作都无延迟
关键发现: 设置 no-appendfsync-on-rewrite yes 后,rewrite期间redis不进行fsync,新的写操作被暂存在内存中,待rewrite完成后再写入AOF文件,这样避免了主进程和子进程的资源竞争。
推荐方案
对于大数据量场景,考虑:
- 单机多实例:一台机器上多开几个Redis实例,减少单实例内存量,避免大数据量暂停问题
- 充分利用CPU:根据CPU核心数配置对应数量的Redis实例