溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

redis客戶端怎么實現(xiàn)高可用讀寫分離

發(fā)布時間:2021-07-05 09:16:08 來源:億速云 閱讀:187 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下redis客戶端怎么實現(xiàn)高可用讀寫分離,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

背景

(1) redis單機(jī)的讀寫性能輕松上大幾萬,不過線上環(huán)境不會只部署光禿禿的一個節(jié)點,還是會配合 sentinel 再部署一個 slave作為高可用節(jié)點的;
但是standby的slave節(jié)點是不對外提供服務(wù)端的,一定程度上造成了浪費資源

(2) 當(dāng)業(yè)務(wù)不斷發(fā)展,原來單節(jié)點緩存的數(shù)據(jù)(如,商品信息緩存、配置信息等)的查詢qps不斷升高(寫qps增長不多),突破十幾萬、幾十萬的的時候,此時一個節(jié)點就扛不住了,我們就需要增加幾個redis slaves節(jié)點來分擔(dān)這些查詢的壓力 也就是讀寫分離

但是,常用的 redis 客戶端jedis并不支持讀寫分離能力

實現(xiàn)方式

(1) 從配置中心獲取 master 和 slaves 的連接信息,分別初始化好一個連接master的寫連接池和一組slave的讀連接池
(2) 將命令進(jìn)行分類:執(zhí)行寫命令則從 master的連接池取連接然后執(zhí)行,如果是讀命令則從slave的連接池中取出連接執(zhí)行
可能有多個slave節(jié)點,可以按照一定的策略進(jìn)行負(fù)載均衡(權(quán)重、隨機(jī)、輪詢...etc) 從其中一個 slave節(jié)點的連接池獲取連接

大概長這樣:

redis客戶端怎么實現(xiàn)高可用讀寫分離

高可用版本

前面的實現(xiàn)方式正常情況下是可以的

但是:
(1) 如果運行期間 master掛了怎么辦? 如何自動 failover 切換?
(2) 如果流量突增,需要動態(tài)擴(kuò)容一個或多個 slave節(jié)點,如何動態(tài)生效?

那就不能從配置文件取master和slaves的 ip+port 了,得從redis ha的組件去動態(tài)獲取 當(dāng)前master 和可用slave列表的節(jié)點信息 => sentinel

1.初始化

向 sentinel 發(fā)送命令獲取master和slaves的節(jié)點信息

//獲取當(dāng)前masterName標(biāo)識的當(dāng)前master節(jié)點信息,哨兵可監(jiān)控多個 mater ha,所以要用<masterName>區(qū)分
SENTINEL get-master-addr-by-name <masterName>
//獲取可用的slaves列表信息
SENTINEL slaves <masterName>

redis客戶端怎么實現(xiàn)高可用讀寫分離

拿到連接后,繼續(xù)用開頭的方式去創(chuàng)建連接池就行了

2. 動態(tài)failover、擴(kuò)容

初始化完畢后,在運行期間master節(jié)點,和slaves還是可能變化的, 如
(1) master故障、網(wǎng)絡(luò)分區(qū),sentinel 提升一個slave為新的master
(2) 新增slave節(jié)點應(yīng)對突增流量

我們?nèi)绾文懿恢貑⒖蛻舳说那闆r下,動態(tài)切換?

sentinel 在進(jìn)行master切換、slave變更等操作的時候都會向?qū)?yīng)的 channel 發(fā)布事件,我們可以基于這些事件感知到相應(yīng)的變化
參考: https://redis.io/topics/sentinel

2.1 failover切換 master

當(dāng) sentinel 進(jìn)行master failover切換的時候,它會向channel: switch-master 發(fā)送通知,我們在客戶端訂閱這個channel,收到事件后,重新進(jìn)行初始化的步驟即可

redis客戶端怎么實現(xiàn)高可用讀寫分離

2.2 擴(kuò)容slave

當(dāng)新的 slave 節(jié)點加入, sentinel 感知到則會向channel: +slave 發(fā)布事件,我們監(jiān)聽到后,重新獲取slaves節(jié)點信息重建slaves的連接池就可以了(這邊不涉及master的變化)

redis客戶端怎么實現(xiàn)高可用讀寫分離

看完了這篇文章,相信你對“redis客戶端怎么實現(xiàn)高可用讀寫分離”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI