本文摘自PHP中文网,作者尚,侵删。
一、RDB持久化模式缺陷
1、问题描述:
并发200路,模拟不断写Redis,持续4小时后,接口调用开始出现大量失败,错误信息如下:
1 |
|
2、原因分析:
解读错误信息,以为是磁盘不够用引起,结果发现磁盘还剩余42%,如下所示:
于是根据错误信息提示开启Redis日志,继续压测,接口依然报错,但可从Redis日志信息中
Can’t save in background: fork: Cannot allocate memory
进程使用内存不当有关,查看Redis主进程占用内存如下:占用近55%*4G内存
具体原因:Redis在保存数据到硬盘时为了避免主进程假死,需要Fork一份主进程,然后在Fork进程内完成数据保存到硬盘的操作,如果主进程使用了2.2GB的内存,Fork子进程的时候需要额外的2.2GB,此时内存就不够了,Fork失败,进而数据保存硬盘也失败了。
3、缓解方案(不能根本解决问题):
3.1 修改redis.conf文件中配置项stop-writes-on-bgsave-error no (默认值为yes),即当bgsave快照操作出错时停止写数据到磁盘,这样后面写错做均会失败,为了不影响后续写操作,故需将该项值改为no
3.2 修改内核参数(如下3种方式),但需要root权限:
1 2 3 |
|
二、AOF持久化模式缺陷
相关阅读 >>
更多相关阅读请进入《Redis》频道 >>
数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。