重慶市建設(shè)醫(yī)院網(wǎng)站首頁西點培訓(xùn)前十名學(xué)校
Redis哨兵集群搭建及其原理
- 1.Redis哨兵
- 1.1.哨兵原理
- 1.1.1.集群結(jié)構(gòu)和作用
- 1.1.2.集群監(jiān)控原理
- 1.1.3.集群故障恢復(fù)原理
- 1.1.4.小結(jié)
- 2.搭建哨兵集群
- 2.1.集群結(jié)構(gòu)
- 2.2.準(zhǔn)備實例和配置
- 2.3.啟動
- 2.4.測試
- 3.RedisTemplate
- 3.1.引入依賴
- 3.2.配置Redis地址
- 3.3.配置讀寫分離
1.Redis哨兵
Redis提供了哨兵(Sentinel)機(jī)制來實現(xiàn)主從集群的自動故障恢復(fù)。
1.1.哨兵原理
1.1.1.集群結(jié)構(gòu)和作用
哨兵的結(jié)構(gòu)如圖:
哨兵的作用如下:
- 監(jiān)控:Sentinel 會不斷檢查您的master和slave是否按預(yù)期工作
- 自動故障恢復(fù):如果master故障,Sentinel會將一個slave提升為master。當(dāng)故障實例恢復(fù)后也以新的master為主
- 通知:Sentinel充當(dāng)Redis客戶端的服務(wù)發(fā)現(xiàn)來源,當(dāng)集群發(fā)生故障轉(zhuǎn)移時,會將最新信息推送給Redis的客戶端
1.1.2.集群監(jiān)控原理
Sentinel基于心跳機(jī)制監(jiān)測服務(wù)狀態(tài),每隔1秒向集群的每個實例發(fā)送ping命令:
?主觀下線:如果某sentinel節(jié)點發(fā)現(xiàn)某實例未在規(guī)定時間響應(yīng),則認(rèn)為該實例主觀下線。
?客觀下線:若超過指定數(shù)量(quorum)的sentinel都認(rèn)為該實例主觀下線,則該實例客觀下線。quorum值最好超過Sentinel實例數(shù)量的一半。
1.1.3.集群故障恢復(fù)原理
一旦發(fā)現(xiàn)master故障,sentinel需要在salve中選擇一個作為新的master,選擇依據(jù)是這樣的:
- 首先會判斷slave節(jié)點與master節(jié)點斷開時間長短,如果超過指定值(down-after-milliseconds * 10)則會排除該slave節(jié)點
- 然后判斷slave節(jié)點的slave-priority值,越小優(yōu)先級越高,如果是0則永不參與選舉
- 如果slave-prority一樣,則判斷slave節(jié)點的offset值,越大說明數(shù)據(jù)越新,優(yōu)先級越高
- 最后是判斷slave節(jié)點的運行id大小,越小優(yōu)先級越高。
當(dāng)選出一個新的master后,該如何實現(xiàn)切換呢?
流程如下:
- sentinel給備選的slave1節(jié)點發(fā)送slaveof no one命令,讓該節(jié)點成為master
- sentinel給所有其它slave發(fā)送slaveof 192.168.150.101 7002 命令,讓這些slave成為新master的從節(jié)點,開始從新的master上同步數(shù)據(jù)。
- 最后,sentinel將故障節(jié)點標(biāo)記為slave,當(dāng)故障節(jié)點恢復(fù)后會自動成為新的master的slave節(jié)點
1.1.4.小結(jié)
Sentinel的三個作用是什么?
- 監(jiān)控
- 故障轉(zhuǎn)移
- 通知
Sentinel如何判斷一個redis實例是否健康?
- 每隔1秒發(fā)送一次ping命令,如果超過一定時間沒有相向則認(rèn)為是主觀下線
- 如果大多數(shù)sentinel都認(rèn)為實例主觀下線,則判定服務(wù)下線
故障轉(zhuǎn)移步驟有哪些?
- 首先選定一個slave作為新的master,執(zhí)行slaveof no one
- 然后讓所有節(jié)點都執(zhí)行slaveof 新master
- 修改故障節(jié)點配置,添加slaveof 新master
2.搭建哨兵集群
2.1.集群結(jié)構(gòu)
這里我們搭建一個三節(jié)點形成的Sentinel集群,來監(jiān)管之前的Redis主從集群。如圖:
三個sentinel實例信息如下:
節(jié)點 | IP | PORT |
---|---|---|
s1 | 192.168.150.101 | 27001 |
s2 | 192.168.150.101 | 27002 |
s3 | 192.168.150.101 | 27003 |
2.2.準(zhǔn)備實例和配置
要在同一臺虛擬機(jī)開啟3個實例,必須準(zhǔn)備三份不同的配置文件和目錄,配置文件所在目錄也就是工作目錄。
我們創(chuàng)建三個文件夾,名字分別叫s1、s2、s3:
# 進(jìn)入/tmp目錄
cd /tmp
# 創(chuàng)建目錄
mkdir s1 s2 s3
如圖:
然后我們在s1目錄創(chuàng)建一個sentinel.conf文件,添加下面的內(nèi)容:
port 27001
sentinel announce-ip 192.168.150.101
sentinel monitor mymaster 192.168.150.101 7001 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
dir "/tmp/s1"
解讀:
port 27001
:是當(dāng)前sentinel實例的端口sentinel monitor mymaster 192.168.150.101 7001 2
:指定主節(jié)點信息mymaster
:主節(jié)點名稱,自定義,任意寫192.168.150.101 7001
:主節(jié)點的ip和端口2
:選舉master時的quorum值
然后將s1/sentinel.conf文件拷貝到s2、s3兩個目錄中(在/tmp目錄執(zhí)行下列命令):
# 方式一:逐個拷貝
cp s1/sentinel.conf s2
cp s1/sentinel.conf s3
# 方式二:管道組合命令,一鍵拷貝
echo s2 s3 | xargs -t -n 1 cp s1/sentinel.conf
修改s2、s3兩個文件夾內(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
2.3.啟動
為了方便查看日志,我們打開3個ssh窗口,分別啟動3個redis實例,啟動命令:
# 第1個
redis-sentinel s1/sentinel.conf
# 第2個
redis-sentinel s2/sentinel.conf
# 第3個
redis-sentinel s3/sentinel.conf
啟動后:
2.4.測試
嘗試讓master節(jié)點7001宕機(jī),查看sentinel日志:
查看7003的日志:
查看7002的日志:
3.RedisTemplate
在Sentinel集群監(jiān)管下的Redis主從集群,其節(jié)點會因為自動故障轉(zhuǎn)移而發(fā)生變化,Redis的客戶端必須感知這種變化,及時更新連接信息。Spring的RedisTemplate底層利用lettuce實現(xiàn)了節(jié)點的感知和自動切換。
下面,我們通過一個測試來實現(xiàn)RedisTemplate集成哨兵機(jī)制。
3.1.引入依賴
在項目的pom文件中引入依賴:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
3.2.配置Redis地址
然后在配置文件application.yml中指定redis的sentinel相關(guān)信息:
spring:redis:sentinel:master: mymasternodes:- 192.168.150.101:27001- 192.168.150.101:27002- 192.168.150.101:27003
3.3.配置讀寫分離
在項目的啟動類中,添加一個新的bean:
@Bean
public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
}
這個bean中配置的就是讀寫策略,包括四種:
- MASTER:從主節(jié)點讀取
- MASTER_PREFERRED:優(yōu)先從master節(jié)點讀取,master不可用才讀取replica
- REPLICA:從slave(replica)節(jié)點讀取
- REPLICA _PREFERRED:優(yōu)先從slave(replica)節(jié)點讀取,所有的slave都不可用才讀取master