Redis中RDB和AOF持久化模式缺陷是什么

56次阅读
没有评论

共计 2004 个字符,预计需要花费 6 分钟才能阅读完成。

自动写代码机器人,免费开通

这篇文章主要介绍了 Redis 中 RDB 和 AOF 持久化模式缺陷是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让丸趣 TV 小编带着大家一起了解一下。

一、RDB 持久化模式缺陷

1、问题描述:

并发 200 路,模拟不断写 Redis,持续 4 小时后,接口调用开始出现大量失败,错误信息如下:

{data :{ sendResult :null}, base :{returncode : 99999 , returndesc : 系统异常:MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.}, qrybase :{total :0, count :0, start :0}}

2、原因分析:

解读错误信息,以为是磁盘不够用引起,结果发现磁盘还剩余 42%,如下所示:

Redis 中 RDB 和 AOF 持久化模式缺陷是什么

于是根据错误信息提示开启 Redis 日志,继续压测,接口依然报错,但可从 Redis 日志信息中

Can’t save in background: fork: Cannot allocate memory

进程使用内存不当有关,查看 Redis 主进程占用内存如下:占用近 55%*4G 内存

Redis 中 RDB 和 AOF 持久化模式缺陷是什么

具体原因: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)编辑 /etc/sysctl.conf ,改 vm.overcommit_memory=1,然后 sysctl -p  使配置文件生效(2)sysctl vm.overcommit_memory=1(3)echo 1   /proc/sys/vm/overcommit_memory

二、AOF 持久化模式缺陷

1、问题 1 描述:

Redis 主从节点均开启 AOF 模式,并发 200 路,模拟不断写 Redis,持续 15 分钟后,接口调用开始出现大量失败,且 Redis 所在的 Linux 虚拟服务器挂起。

接口报错如下:

{data :null, base :{ returndesc : 系统异常 , returncode : 999999}, qrybase :null}
Biz(dubbo)接口报错如下:2015-06-05 11:28:28.760 [DubboServerHandler-X.X.X.X:20882-thread-173] ERROR - error while validate jedis!
redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out

原因分析:

从 dubbo 接口报错信息来看,是由于接口 API 操作 Redis 超时导致。从系统日志和 IO 监控来看,均说明上述问题是由于 IO 瓶颈(系统 IO 过于繁忙)所致,如下所示:

Redis 中 RDB 和 AOF 持久化模式缺陷是什么

Redis 中 RDB 和 AOF 持久化模式缺陷是什么

从系统日志也能看出,IO 阻塞时间超过了 120 秒,由于系统安全机制导致机器挂起。

总结

测试结果证明 AOF 模式存在最明显缺陷,即访问压力大时 IO 会成为性能瓶颈,进而导致服务不可用。

3、缓解方案(不能根本解决问题)

编辑 /etc/sysctl.conf,添加如下配置:

vm.dirty_background_ratio = 5
vm.dirty_ratio = 10

然后 sysctl -p 使配置文件生效。

问题 2 描述:

无论采用 AOF 模式还是 RDB(快照模式),当两文件(.aof 或.rdb)大小超过系统内存 80%,Redis 进程会被系统 Kill 掉,导致服务不可用。

上述问题说明我们在使用 Redis 时需要事先做好系统内存的容量规划,因为一旦 Redis 宕掉会导致大量数据丢失且是不可恢复的。

感谢你能够认真阅读完这篇文章,希望丸趣 TV 小编分享的“Redis 中 RDB 和 AOF 持久化模式缺陷是什么”这篇文章对大家有帮助,同时也希望大家多多支持丸趣 TV,关注丸趣 TV 行业资讯频道,更多相关知识等着你来学习!

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-04发表,共计2004字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)