共計 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 日志,繼續壓測,接口依然報錯,但可從 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)編輯 /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 過于繁忙)所致,如下所示:
從系統日志也能看出,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 問一下細節