Redis 搭建哨兵集群的操作步驟
0. 哨兵原理
哨兵的結(jié)構(gòu)如圖:
功能作用
- 檢測:哨兵機(jī)制會(huì)不斷檢查 master 和 slave 是否按預(yù)期工作。
- 故障恢復(fù):如果 master 故障,Sentinel 會(huì)將一個(gè) slave 提升為 master 。當(dāng)故障實(shí)例恢復(fù)后也以新的 master 為主。
- 通知:Sentinel 充當(dāng) Redis 客戶端的服務(wù)發(fā)現(xiàn)來源,當(dāng)集群發(fā)生故障轉(zhuǎn)移時(shí),會(huì)將最新消息推送給 Redis 客戶端。
服務(wù)狀態(tài)監(jiān)控
Sentinel 基于心跳機(jī)制檢測服務(wù)狀態(tài),每隔一秒向集群的每個(gè)實(shí)例發(fā)送 ping 命令:
- 主觀下線:如果某 Sentinel 節(jié)點(diǎn)發(fā)現(xiàn)某實(shí)例未在規(guī)定的時(shí)間響應(yīng),則認(rèn)為該實(shí)例主觀下線。
- 客觀下線:若超過指定數(shù)量(quorum)的 Sentinel 都認(rèn)為該實(shí)例主觀下線,則該實(shí)例客觀下線。quorum 值最好超過 Sentinel 實(shí)例數(shù)量的一半。
選舉新的master一旦發(fā)現(xiàn)master故障,sentinel需要在salve中選擇一個(gè)作為新的master,選擇依據(jù)是這樣的:
- 首先會(huì)判斷slave節(jié)點(diǎn)與master節(jié)點(diǎn)斷開時(shí)間長短,如果超過指定值(down-after-milliseconds * 10)則會(huì)排除該slave節(jié)點(diǎn)
- 然后判斷slave節(jié)點(diǎn)的slave-priority值,越小優(yōu)先級越高,如果是0則永不參與選舉
- 如果slave-prority一樣,則判斷slave節(jié)點(diǎn)的offset值,越大說明數(shù)據(jù)越新,優(yōu)先級越高
- 最后是判斷slave節(jié)點(diǎn)的運(yùn)行id大小,越小優(yōu)先級越高。
當(dāng)選出一個(gè)新的master后,該如何實(shí)現(xiàn)切換呢?
流程如下:
- sentinel給備選的slave1節(jié)點(diǎn)發(fā)送slaveof no one命令,讓該節(jié)點(diǎn)成為master
- sentinel給所有其它slave發(fā)送slaveof 192.168.150.101 7002 命令,讓這些slave成為新master的從節(jié)點(diǎn),開始從新的master上同步數(shù)據(jù)。
- 最后,sentinel將故障節(jié)點(diǎn)標(biāo)記為slave,當(dāng)故障節(jié)點(diǎn)恢復(fù)后會(huì)自動(dòng)成為新的master的slave節(jié)點(diǎn)
1. 哨兵集群架構(gòu)
三個(gè)sentinel實(shí)例信息如下:
節(jié)點(diǎn) | IP | PORT |
---|---|---|
s1 | 192.168.1.184 | 27001 |
s2 | 192.168.1.184 | 27002 |
s3 | 192.168.1.184 | 27003 |
ip 指的是 redis 所在服務(wù)器或者虛擬機(jī)的ip。
2. 準(zhǔn)備實(shí)例和配置
要在同一臺虛擬機(jī)開啟3個(gè)實(shí)例,必須準(zhǔn)備三份不同的配置文件和目錄,配置文件所在目錄也就是工作目錄。
我們創(chuàng)建三個(gè)文件夾,名字分別叫s1、s2、s3:
# 進(jìn)入/tmp目錄 cd /tmp # 創(chuàng)建目錄 mkdir s1 s2 s3
然后我們在s1目錄創(chuàng)建一個(gè)sentinel.conf文件,添加下面的內(nèi)容:
port 27001 sentinel announce-ip 192.168.1.184 sentinel monitor mymaster 192.168.1.184 7001 2 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 60000 dir "/tmp/s1"
解讀:
port 27001
:是當(dāng)前sentinel實(shí)例的端口sentinel monitor mymaster 192.168.1.184 7001 2
:指定主節(jié)點(diǎn)信息mymaster
:主節(jié)點(diǎn)名稱,自定義,任意寫192.168.1.184 7001
:主節(jié)點(diǎn)的ip和端口2
:選舉master時(shí)的quorum值
然后將s1/sentinel.conf文件拷貝到s2、s3兩個(gè)目錄中(在/tmp目錄執(zhí)行下列命令):
# 方式一:逐個(gè)拷貝 cp s1/sentinel.conf s2 cp s1/sentinel.conf s3 # 方式二:管道組合命令,一鍵拷貝 echo s2 s3 | xargs -t -n 1 cp s1/sentinel.conf
修改s2、s3兩個(gè)文件夾內(nèi)的配置文件,將端口分別修改為27002、27003:
sed -i -e 's/27001/27002/g' -e 's/s1/s2/g' s2/sentinel.conf sed -i -e 's/27001/27003/g' -e 's/s1/s3/g' s3/sentinel.conf
3. 啟動(dòng)
為了方便查看日志,我們打開3個(gè)ssh窗口,分別啟動(dòng)3個(gè)redis實(shí)例,啟動(dòng)命令:
# 第1個(gè) redis-sentinel s1/sentinel.conf # 第2個(gè) redis-sentinel s2/sentinel.conf # 第3個(gè) redis-sentinel s3/sentinel.conf
啟動(dòng)后
4. 測試
嘗試讓master節(jié)點(diǎn)7001宕機(jī),查看sentinel日志
查看7003的日志
查看7002的日志
5. RedisTemplate 的哨兵模式
在Sentinel集群監(jiān)管下的Redis主從集群,其節(jié)點(diǎn)會(huì)因?yàn)樽詣?dòng)故障轉(zhuǎn)移而發(fā)生變化,Redis的客戶端必須感知這種變化,及時(shí)更新連接信息。Spring的RedisTemplate底層利用lettuce實(shí)現(xiàn)了節(jié)點(diǎn)的感知和自動(dòng)切換。
下面,我們通過一個(gè)測試來實(shí)現(xiàn)RedisTemplate集成哨兵機(jī)制。
配置地址
然后在配置文件application.yml中指定redis的sentinel相關(guān)信息:
spring: redis: sentinel: master: mymaster nodes: - 192.168.150.101:27001 - 192.168.150.101:27002 - 192.168.150.101:27003
配置讀寫分離
在項(xiàng)目的啟動(dòng)類中,添加一個(gè)新的bean:
@Bean public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){ return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED); }
這個(gè)bean中配置的就是讀寫策略,包括四種:
- MASTER:從主節(jié)點(diǎn)讀取
- MASTER_PREFERRED:優(yōu)先從master節(jié)點(diǎn)讀取,master不可用才讀取replica
- REPLICA:從slave(replica)節(jié)點(diǎn)讀取
- REPLICA _PREFERRED:優(yōu)先從slave(replica)節(jié)點(diǎn)讀取,所有的slave都不可用才讀取master
到此這篇關(guān)于Redis 搭建哨兵集群的操作步驟的文章就介紹到這了,更多相關(guān)Redis 搭建哨兵集群內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis server 主從復(fù)制配置實(shí)現(xiàn)
從復(fù)制是指將一個(gè)Redis服務(wù)器的數(shù)據(jù)復(fù)制到其他Redis服務(wù)器的過程,本文主要介紹了Redis server 主從復(fù)制配置實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02Redis SETEX命令實(shí)現(xiàn)鍵值對管理
本文主要介紹了Redis SETEX命令實(shí)現(xiàn)鍵值對管理,SETEX命令用于設(shè)置具有過期時(shí)間的鍵值對,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06window手動(dòng)操作清理redis緩存的技巧總結(jié)
在本篇文章中小編給大家分享了關(guān)于window環(huán)境手動(dòng)操作清理redis緩存的方法和技巧,有興趣的朋友們可以跟著學(xué)習(xí)下。2019-07-07