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