首頁 資料庫 Redis redis中兩種持久化缺陷介紹

redis中兩種持久化缺陷介紹

May 19, 2020 am 09:11 AM
redis

redis中兩種持久化缺陷介紹

一、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日誌,繼續壓測,介面仍會報錯,但可從Redis日誌訊息中

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

處理程序使用記憶體不當有關,查看Redis主程序佔用記憶體如下:佔用近55%*4G記憶體

redis中兩種持久化缺陷介紹

具體原因: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中兩種持久化缺陷介紹

redis中兩種持久化缺陷介紹


#從系統日誌也能看出,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宕掉會導致大量資料遺失且是不可恢復的。 ######更多redis知識請關注###redis入門教學###欄位。 ###

以上是redis中兩種持久化缺陷介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Windows11安裝10.0.22000.100跳出0x80242008錯誤解決方法 Windows11安裝10.0.22000.100跳出0x80242008錯誤解決方法 May 08, 2024 pm 03:50 PM

Windows11安裝10.0.22000.100跳出0x80242008錯誤解決方法

剖析 PHP 函數瓶頸,提升執行效率 剖析 PHP 函數瓶頸,提升執行效率 Apr 23, 2024 pm 03:42 PM

剖析 PHP 函數瓶頸,提升執行效率

Golang API快取策略與最佳化 Golang API快取策略與最佳化 May 07, 2024 pm 02:12 PM

Golang API快取策略與最佳化

redis是記憶體快取嗎 redis是記憶體快取嗎 Apr 20, 2024 am 05:26 AM

redis是記憶體快取嗎

redis是非關係型資料庫嗎 redis是非關係型資料庫嗎 Apr 20, 2024 am 05:36 AM

redis是非關係型資料庫嗎

erlang和golang性能哪個好? erlang和golang性能哪個好? Apr 21, 2024 am 03:24 AM

erlang和golang性能哪個好?

PHP開發中的快取機制與應用實戰 PHP開發中的快取機制與應用實戰 May 09, 2024 pm 01:30 PM

PHP開發中的快取機制與應用實戰

PHP數組分頁中如何使用Redis快取? PHP數組分頁中如何使用Redis快取? May 01, 2024 am 10:48 AM

PHP數組分頁中如何使用Redis快取?

See all articles