共計 3695 個字符,預計需要花費 10 分鐘才能閱讀完成。
本篇內容主要講解“Redis 中 redis-cluster 需要注意哪些地方”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓丸趣 TV 小編來帶大家學習“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 --- 解決應用端拋異常的問題
172.31.39.54:6379 config rewrite
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 換入的粒度。(https://segmentfault.com/a/1190000004708270)
持久化的問題
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 時就會開始比較危險了。
到此,相信大家對“Redis 中 redis-cluster 需要注意哪些地方”有了更深的了解,不妨來實際操作一番吧!這里是丸趣 TV 網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
正文完