【Redis】redis-cluster需要注意的幾個地方
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- java打包exe程式需要注意的幾個地方Java
- 伺服器搬遷需要注意的幾個地方伺服器
- 使用React 應當注意的幾個地方React
- 26個提升java效能需要注意的地方Java
- javascript變數宣告需要注意的一個地方JavaScript變數
- Python中Lambda使用要注意的幾個地方Python
- 【Redis】redis-cluster到redis-cluster的快速複製Redis
- 使用Context建立一個View需要注意的地方ContextView
- delete與delete[]需要注意的地方delete
- Javascript需要注意的幾個運算子JavaScript
- margin-top使用需要注意的地方
- /etc/fstab檔案需要注意的地方
- vmware搭建HMC需要注意的幾個點
- jquery獲取ajax傳遞的值一個需要注意的地方jQuery
- js switch語句需要特別注意的地方JS
- link流程 建立時需要注意的地方
- Struts中上傳檔案需要注意的地方
- springMVC的@ResponseBody、@RequestBody使用需要注意的地方SpringMVC
- oracle over()的使用和需要特別注意的地方Oracle
- 一個優秀的雲原生架構需要注意哪些地方架構
- 微信企業付款介面PHP開發需要注意的兩個地方PHP
- Spring事務需要注意的幾個點Spring
- IBM面試需要注意的幾個問題IBM面試
- redis-cluster心得Redis
- javascript原型繼承constructor需要注意的地方JavaScript原型繼承Struct
- 在PHP中使用類可能需要注意的地方PHP
- oracle 11.2.0.3 版本 vote盤需要注意的地方Oracle
- 【Redis】 redis-cluster刪除指定的keyRedis
- 開發者提交產品前需要注意的幾個點
- 成功接專案需要注意的幾個要點
- 行內元素和塊計元素需要注意的地方
- 建設個性化主題多媒體展廳需要注意的地方
- 【Redis】redis遷移資料到redis-clusterRedis
- 【Redis】redis-cluster 安裝遇到的問題Redis
- 做聚合支付代理需要注意的這幾個問題?
- 11gRAC安裝需要注意的幾個問題
- 資料補丁中需要注意的幾個問題
- 選擇雲伺服器有哪些需要注意的地方?伺服器