Redis儲存快照後無法寫入解決

來源:互聯網
上載者:User

Redis儲存快照後無法寫入解決

今天開發突然和我說Redis不能寫了。我進入Redis後發現確實是這樣,不可以執行set指令了。報錯如下:

172.31.18.90:6379> set  test test1

(error) 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.

之前redis一直是正常的。不是許可權問題導致的,也不是記憶體耗盡

通過查看log發現是這個報錯fork: Cannot allocate memory

在小記憶體的進程上做一個fork,不需要太多資源,但當這個進程的記憶體空間以G為單位時,fork就成為一件很恐怖的操作。何況在16G記憶體的主機上fork 14G記憶體的進程呢?肯定會報記憶體無法分配的。更可氣的是,越是改動頻繁的主機上fork也越頻繁,fork操作本身的代價恐怕也不會比假死好多少。

找到原因之後,直接修改核心參數 vm.overcommit_memory = 1

sysctl -p 使核心參數生效

參數解釋:

Linux核心會根據參數vm.overcommit_memory參數的設定決定是否允許存取。

如果 vm.overcommit_memory = 1,直接允許存取

vm.overcommit_memory = 0:則比較 此次請求分配的虛擬記憶體大小和系統當前閒置實體記憶體加上swap,決定是否允許存取。

vm.overcommit_memory = 2:則會比較 進程所有已指派的虛擬記憶體加上此次請求分配的虛擬記憶體和系統當前的空閑實體記憶體加上swap,決定是否允許存取。

這裡在重新發一下redis 的回寫機制

Redis的資料回寫機制分同步和非同步兩種,

同步回寫即SAVE命令,主進程直接向磁碟回寫資料。在資料大的情況下會導致系統假死很長時間,所以一般不是推薦的。

非同步回寫即BGSAVE命令,主進程fork後,複製自身並通過這個新的進程回寫磁碟,回寫結束後新進程自行關閉。由於這樣做不需要主進程阻塞,系統不會假死,一般預設會採用這個方法。

這裡注意:

在redis中運行config set stop-writes-on-bgsave-error no命令只能暫時解決不能set的問題。出了問題還是要看log的

預設配置 stop-writes-on-bgsave-error yes當bgsave出錯時資料將不能修改。

下面關於Redis的文章您也可能喜歡,不妨參考下:

Ubuntu 14.04下Redis安裝及簡單測試

Redis主從複製基本配置

Redis叢集搭建與簡單使用 

CentOS 7下Redis的安裝與配置

Ubuntu 14.04安裝Redis與簡單配置

Ubuntu 16.04環境中安裝PHP7.0 Redis擴充

Redis 單機&叢集離線安裝部署

CentOS 7.0 安裝Redis 3.2.1詳細過程和使用常見問題

Ubuntu 16.04環境中安裝PHP7.0 Redis擴充

Ubuntu 15.10下Redis叢集部署文檔

Redis實戰 中文PDF

Redis熱遷移實戰總結 

Redis3.0設定檔詳解 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.