來源:尚 發(fā)布時(shí)間:2020-05-11 10:09:38 閱讀量:1438
一、RDB持久化模式缺陷
1、問題描述:
并發(fā)200路,模擬不斷寫Redis,持續(xù)4小時(shí)后,接口調(diào)用開始出現(xiàn)大量失敗,錯(cuò)誤信息如下:
1 |
|
2、原因分析:
解讀錯(cuò)誤信息,以為是磁盤不夠用引起,結(jié)果發(fā)現(xiàn)磁盤還剩余42%,如下所示:
于是根據(jù)錯(cuò)誤信息提示開啟Redis日志,繼續(xù)壓測(cè),接口依然報(bào)錯(cuò),但可從Redis日志信息中
Can’t save in background: fork: Cannot allocate memory
進(jìn)程使用內(nèi)存不當(dāng)有關(guān),查看Redis主進(jìn)程占用內(nèi)存如下:占用近55%*4G內(nèi)存
具體原因:Redis在保存數(shù)據(jù)到硬盤時(shí)為了避免主進(jìn)程假死,需要Fork一份主進(jìn)程,然后在Fork進(jìn)程內(nèi)完成數(shù)據(jù)保存到硬盤的操作,如果主進(jìn)程使用了2.2GB的內(nèi)存,F(xiàn)ork子進(jìn)程的時(shí)候需要額外的2.2GB,此時(shí)內(nèi)存就不夠了,F(xiàn)ork失敗,進(jìn)而數(shù)據(jù)保存硬盤也失敗了。
3、緩解方案(不能根本解決問題):
3.1 修改redis.conf文件中配置項(xiàng)stop-writes-on-bgsave-error no (默認(rèn)值為yes),即當(dāng)bgsave快照操作出錯(cuò)時(shí)停止寫數(shù)據(jù)到磁盤,這樣后面寫錯(cuò)做均會(huì)失敗,為了不影響后續(xù)寫操作,故需將該項(xiàng)值改為no
3.2 修改內(nèi)核參數(shù)(如下3種方式),但需要root權(quán)限:
1 2 3 |
|
二、AOF持久化模式缺陷
1、問題1描述:
Redis主從節(jié)點(diǎn)均開啟AOF模式,并發(fā)200路,模擬不斷寫Redis,持續(xù)15分鐘后,接口調(diào)用開始出現(xiàn)大量失敗,且Redis所在的Linux虛擬服務(wù)器掛起。
接口報(bào)錯(cuò)如下:
1 2 3 4 |
|
原因分析:
從dubbo接口報(bào)錯(cuò)信息來看,是由于接口API操作Redis超時(shí)導(dǎo)致。從系統(tǒng)日志和IO監(jiān)控來看,均說明上述問題是由于IO瓶頸(系統(tǒng)IO過于繁忙)所致,如下所示:
從系統(tǒng)日志也能看出,IO阻塞時(shí)間超過了120秒,由于系統(tǒng)安全機(jī)制導(dǎo)致機(jī)器掛起。
總結(jié)
測(cè)試結(jié)果證明AOF模式存在最明顯缺陷,即訪問壓力大時(shí)IO會(huì)成為性能瓶頸,進(jìn)而導(dǎo)致服務(wù)不可用。
3、緩解方案(不能根本解決問題)
編輯/etc/sysctl.conf ,添加如下配置:
1 2 |
|
然后sysctl -p 使配置文件生效。
問題2描述:
無論采用AOF模式還是RDB(快照模式),當(dāng)兩文件(.aof或.rdb)大小超過系統(tǒng)內(nèi)存80%,Redis進(jìn)程會(huì)被系統(tǒng)Kill掉,導(dǎo)致服務(wù)不可用。
總結(jié)
上述問題說明我們?cè)谑褂肦edis時(shí)需要事先做好系統(tǒng)內(nèi)存的容量規(guī)劃,因?yàn)橐坏㏑edis宕掉會(huì)導(dǎo)致大量數(shù)據(jù)丟失且是不可恢復(fù)的。
在線
客服
服務(wù)時(shí)間:周一至周日 08:30-18:00
選擇下列產(chǎn)品馬上在線溝通:
客服
熱線
7*24小時(shí)客服服務(wù)熱線
關(guān)注
微信
關(guān)注官方微信