【Redis】redis-cluster需要注意的幾個地方

小亮520cl發表於2018-09-17

1.收到150告警,rdb持久化失敗

15011:M 17 Sep 08:54:43.037 # Can't save in background: fork: Cannot allocate memory
15011:M 17 Sep 08:54:49.043 * 1 changes in 900 seconds. Saving...
15011:M 17 Sep 08:54:49.043 # Can't save in background: fork: Cannot allocate memory

 

2 檢視主機記憶體(內心os:尼瑪還有這麼多記憶體呢)

[root@ip-172-31-43-150 ~]# free -g
              total        used        free      shared  buff/cache   available
Mem:             29          14          10           0           4          14
Swap:             0           0           0


3 檢視redis-cluster叢集狀態,顯示150已down機,心慌慌

[root@ip-172-31-39-42 ~]# /usr/local/src/redis-4.0.8/src/redis-trib.rb  check 172.31.39.42:6379
[ERR] Sorry, can't connect to node 172.31.43.150:6379
*** WARNING: 172.31.39.54:6379 claims to be slave of unknown node ID 6d2b67b9745a8d4bedb70d480645e3651fddaf3f.
>>> Performing Cluster Check (using node 172.31.39.42:6379)
M: 00f7bd511046438af2d1b41666a69ff77b6f176f 172.31.39.42:6379
   slots:11258-11832,13655-16383 (3304 slots) master
   1 additional replica(s)
S: e771e70f580ec2799af50268865444cf425e000e 172.31.33.17:6379
   slots: (0 slots) slave
   replicates 00f7bd511046438af2d1b41666a69ff77b6f176f
S: 8bb99c5b9585269b66684400f036fca1d30e72cb 172.31.47.157:6379
   slots: (0 slots) slave
   replicates 148697f75e9b4f84ad893f4d5377e96fdde7664d
M: 148697f75e9b4f84ad893f4d5377e96fdde7664d 172.31.34.25:6379
   slots:28,4799-5462,6375-7282,8194-9106,11833-12744 (3398 slots) master
   1 additional replica(s)
M: 40b766b505c54066de5b5d8eb214ea78c7df8c4b 172.31.36.10:6379
   slots:7542-8193,9107-10922,12745-13654 (3378 slots) master
   1 additional replica(s)
S: f6a625cc2d6fb66d267b15c8d668ea150be262bc 172.31.37.68:6379
   slots: (0 slots) slave
   replicates 792ab7473fa447d07582817eb2f489633001d831
M: 792ab7473fa447d07582817eb2f489633001d831 172.31.33.182:6379
   slots:0-27,29-1145,1822-2105,3406-4798,7283-7541 (3081 slots) master
   1 additional replica(s)
S: 92a5541964fc3e4bfb90f1750b9105d5705beb93 172.31.39.54:6379
   slots: (0 slots) slave
   replicates 6d2b67b9745a8d4bedb70d480645e3651fddaf3f
S: 7e5e1e341f33ebd7a3c20480b66a76bbd0922a4f 172.31.32.254:6379
   slots: (0 slots) slave
   replicates 40b766b505c54066de5b5d8eb214ea78c7df8c4b
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[ERR] Not all 16384 slots are covered by nodes.


登上150檢查redis的狀態,發現好好的!


先解決持久化失敗的問題:

1.
172.31.39.54:6379> config set stop-writes-on-bgsave-error no  ---解決應用端拋異常的問題
OK
172.31.39.54:6379> config rewrite
OK
172.31.39.54:6379> 
2.開啟核心引數,解決bgsave失敗的問題
[root@ip-172-31-33-182 ~]# sudo echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
[root@ip-172-31-33-182 ~]# sysctl -p
vm.overcommit_memory = 1


再次檢視日誌,已經持久化成功,check叢集也發現叢集恢復正常


關於redis的記憶體分配學習:

Redis有自己的記憶體分配器,當key-value物件被移除時,Redis不會馬上向作業系統釋放其佔用記憶體(例如,當使用者往一個例項填充了5G的資料,移除其中2G資料,但佔用記憶體可能仍會保持在5G左右)。為什麼Redis要這樣處理?有兩個原因:
1、OS可能會將釋放記憶體交換到VM,但OS的VM又是物理檔案,其IO讀寫效率較低,從而影響Redis效能表現;
2、OS的VM換入換出是基於Page機制,同一Page內的部分資料物件被釋放,但其他資料物件依然被其他應用使用中,導致在該Page內的Redis物件沒有被釋放。
而Redis作者應該是考慮到以上問題,不希望Redis由此降低效能,所以在設計上Redis更傾向於自己掌控VM換入的粒度。()

持久化的問題

Redis持久化磁碟IO方式及其帶來的問題
有Redis線上運維經驗的人會發現Redis在實體記憶體使用比較多,但還沒有超過實際實體記憶體總容量時就會發生不穩定甚至崩潰的問題,有人認為是基於快照方式持久化的fork系統呼叫造成記憶體佔用加倍而導致的,這種觀點是不準確的,因為fork 呼叫的copy-on-write機制是基於作業系統頁這個單位的,也就是隻有有寫入的髒頁會被複制,但是一般你的系統不會在短時間內所有的頁都發生了寫入而導致複製,那麼是什麼原因導致Redis崩潰的呢?
答案是Redis的持久化使用了Buffer IO造成的,所謂Buffer IO是指Redis對持久化檔案的寫入和讀取操作都會使用實體記憶體的Page Cache,而大多數資料庫系統會使用Direct IO來繞過這層Page Cache並自行維護一個資料的Cache,而當Redis的持久化檔案過大(尤其是快照檔案),並對其進行讀寫時,磁碟檔案中的資料都會被載入到實體記憶體中作為作業系統對該檔案的一層Cache,而這層Cache的資料與Redis記憶體中管理的資料實際是重複儲存的,雖然核心在實體記憶體緊張時會做Page Cache的剔除工作,但核心很可能認為某塊Page Cache更重要,而讓你的程式開始Swap ,這時你的系統就會開始出現不穩定或者崩潰了。我們的經驗是當你的Redis實體記憶體使用超過記憶體總容量的3/5時就會開始比較危險了。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29096438/viewspace-2214326/,如需轉載,請註明出處,否則將追究法律責任。

相關文章