Redis(RemoteDictionary Server ),即遠程字典服務,是一個開源的使用ANSIC語言編寫、支持網絡、可基于內存亦可持久化的日志型、Key-Value數據庫,并提供多種語言的API。
redis是一個key-value存儲系統,支持存儲的value類型包括string(字符串)、list(鏈表)、set(集合)、zset(sortedset--有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現了master-slave(主從)同步。
redis
組件版本:
redis:5.0.3
節點架構:
3主3從、6主機
某業務系統采用rediscluster架構,一批業務數據采用string類型設置過期時間key,業務部分過期key未刪除,在redis集群里查找該key存在產生數據錯誤的故障。
Redis集群大致架構圖:
一組RedisCluster是由多個Redis實例組成,官方推薦使用6實例,其中3個為主節點,3個為從結點。一旦有主節點發生故障的時候,RedisCluster可以選舉出對應的從結點成為新的主節點,繼續對外服務,從而保證服務的高可用性。
對于客戶端來說,如何知道對應key是要路由到哪一個節點的那?這里RedisCluster把所有的數據劃分為16384個不同的槽位,可以根據機器的性能把不同的槽位分配給不同的Redis實例,對于Redis實例來說,他們只會存儲部門的Redis數據,當然,槽的數據是可以遷移的,不同的實例之間,可以通過一定的協議,進行數據遷移。
通過對提供的部分key在集群里查看狀態為未刪除,然后查看了業務設置過期時間的代碼看無問題,如下:
通過對redis集群狀態檢查、槽數量、epoch等檢查,redis集群狀態正常,如下:
軟件層檢查后,再對主機linux層檢查內存出現異常主要在swap層,趨勢圖如下:
swap快速增長
可判斷由于業務數據量增長導致內存、swap增長,由于部分數據進入swap后導致部分key過期后未刪除
從問題定位來看,解決方法有幾種:
擴容內存使數據不占用swap并重啟redis集群。
判斷數據的重要性,可關閉redis本身的持久化,避免持久化過程中占用內存,進而占用swap。
擴容節點及增加主機、增加主節點來分散數據使單個節點內存占用量減少。
均衡當時的資源情況及數據重要性,決定采取第一種方法擴容內存6臺主機從48G擴容到64G。
通過擴容內存后結合業務進行幾天的觀察后swap得到有效得控制,swap趨勢圖如下:
后續業務未發生過期key未刪除的情況
1、redis如果占用了swap,可能會導致各種問題(如之前過期key未刪除等),建議在搭建環境時盡量統計業務數據量根據數據量來設置內存大小、并安裝linux系統時關閉swap。
2、由于該redis開了持久化,在持久化過程中會占用當前主機內存,所以建議在開啟持久化的時候建議主機內存的大小是redismaxmemory大小的的2倍以上。
3、redis集群一般建議多主機多節點,單節點內存不超過maxmemory20G。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/130186.html
摘要:單線程執行命令。文件描述符事件。內部原因不合理使用或數據結構可能由此導致慢查詢等飽和是單線程,只會使用單個持久化阻塞操作產生阻塞,對硬盤的操作產生阻塞或寫操作阻塞等。內存達到時執行內存溢出控制策略。 最近在看《Redis開發與運維》,把自己學會的知識點記錄下來,畢竟好記性不如爛筆頭。 一.Redis是什么。 Redis是一個Key-Value的NoSQL數據庫. 二.Redis的特點。...
閱讀 1346·2023-01-11 13:20
閱讀 1684·2023-01-11 13:20
閱讀 1132·2023-01-11 13:20
閱讀 1858·2023-01-11 13:20
閱讀 4100·2023-01-11 13:20
閱讀 2704·2023-01-11 13:20
閱讀 1385·2023-01-11 13:20
閱讀 3597·2023-01-11 13:20