jedispool redis哨兵_Redis详解(九)------ 哨兵(Sentinel)模式详解
在上一篇博客----Redis詳解(八)------ 主從復(fù)制,我們簡(jiǎn)單介紹了Redis的主從架構(gòu),但是這種主從架構(gòu)存在一個(gè)問(wèn)題,當(dāng)主服務(wù)器宕機(jī),從服務(wù)器不能夠自動(dòng)切換成主服務(wù)器,為了解決這個(gè)問(wèn)題,我們又介紹了哨兵模式,本篇博客我們繼續(xù)深入的介紹一下這種模式.
1、架構(gòu)圖
2、服務(wù)器列表
3、搭建主從模式
①、主要配置項(xiàng)
主服務(wù)器(上圖的Node1)配置文件 redis.config 主要配置項(xiàng):
#配置端口
port 6379
#以守護(hù)進(jìn)程模式啟動(dòng)
daemonize yes
#pid的存放文件
pidfile /var/run/redis_6379.pid
#日志文件名
logfile "redis_6379.log"
#存放備份文件以及日志等文件的目錄
dir "/opt/redis/data"
從服務(wù)器配置文件主要配置項(xiàng)基本和主服務(wù)器保持一致,需要修改端口 port ;另外存放位置和日志文件名也可以根據(jù)需要修改.
為了表示主從關(guān)系,還需要在從服務(wù)器配置文件中添加一行重要配置:
#配置主服務(wù)器IP,端口
slaveof 192.168.14.101 6379
②、驗(yàn)證主從關(guān)系
配置完成后,我們通過(guò) redis-server redis.conf 命令啟動(dòng)Redis.然后通過(guò)?redis-cli -p 端口 分別進(jìn)入到各臺(tái)服務(wù)器的控制行頁(yè)面:
輸入如下命令:
info replication
三臺(tái)服務(wù)器打印結(jié)果如下:
由上圖可以看到,Node1 服務(wù)器作為主服務(wù)器,節(jié)點(diǎn)角色是 master,另外的兩臺(tái)從服務(wù)器,節(jié)點(diǎn)角色都是 slave.
另外還可以進(jìn)行如下測(cè)試:可以在主服務(wù)器上添加一條數(shù)據(jù),然后看看從服務(wù)器上是否能夠查到該數(shù)據(jù).
③、問(wèn)題
如果對(duì)于上面的測(cè)試,主服務(wù)器上添加的數(shù)據(jù),從服務(wù)器上無(wú)法查詢到,可以查看前面配置的目錄/opt/redis/data 日志文件,有一種錯(cuò)誤如下:
這是由于主服務(wù)器設(shè)置了登錄密碼,從服務(wù)器在向主服務(wù)器進(jìn)行數(shù)據(jù)同步復(fù)制時(shí),由于不知道主服務(wù)器密碼,導(dǎo)致連接不上,從而無(wú)法進(jìn)行同步.
解決這個(gè)問(wèn)題,需要明確兩個(gè)配置:
一.requreipass
設(shè)置redis的登錄密碼.
二.masterauth
針對(duì)master對(duì)應(yīng)的slave節(jié)點(diǎn)設(shè)置的,在slave節(jié)點(diǎn)數(shù)據(jù)同步的時(shí)候用到。
建議,如果啟用Redis密碼校驗(yàn),最好將各個(gè)節(jié)點(diǎn)的masterauth和requirepass設(shè)置為相同的密碼;如果不設(shè)置為相同的,要注意slave節(jié)點(diǎn)masterauth和master節(jié)點(diǎn)requirepass的對(duì)應(yīng)關(guān)系.
4、搭建哨兵模式
①、主要配置項(xiàng)
配置文件名稱為:sentinel.conf
#配置端口
port 26379
#以守護(hù)進(jìn)程模式啟動(dòng)
daemonize yes
#日志文件名
logfile "sentinel_26379.log"
#存放備份文件以及日志等文件的目錄
dir "/opt/redis/data"
#監(jiān)控的IP 端口號(hào) 名稱 sentinel通過(guò)投票后認(rèn)為mater宕機(jī)的數(shù)量,此處為至少2個(gè)
sentinel monitor mymaster 192.168.14.101 6379 2
#30秒ping不通主節(jié)點(diǎn)的信息,主觀認(rèn)為master宕機(jī)
sentinel down-after-milliseconds mymaster 30000
#故障轉(zhuǎn)移后重新主從復(fù)制,1表示串行,>1并行
sentinel parallel-syncs mymaster 1
#故障轉(zhuǎn)移開(kāi)始,三分鐘內(nèi)沒(méi)有完成,則認(rèn)為轉(zhuǎn)移失敗
sentinel failover-timeout mymaster 180000
注意三臺(tái)服務(wù)器的端口配置.如果redis服務(wù)器配置了密碼連接,則要增加如下配置:
sentinel auth-pass mymaster 123
后面的123表示密碼.注意這行配置要配置到 sentinel monitor mymaster ip port 后面,因?yàn)槊Q mymaster要先定義.
②、啟動(dòng)哨兵
redis-sentinel sentinel.conf
③、驗(yàn)證主從自動(dòng)切換
首先kill掉Redis 主節(jié)點(diǎn).然后查看sentinel 日志:
上面截圖紅框框住的幾個(gè)重要信息,這里先介紹最后一行,switch-master mymaster 192.168.14.101 6379 192.168.14.103 6381 表示master服務(wù)器將由6379的redis服務(wù)切換為6381端口的redis服務(wù)器.
PS:+switch-master 表示切換主節(jié)點(diǎn).
然后我們通過(guò) info replication 命令查看 6381的redis服務(wù)器:
我們發(fā)現(xiàn),6381的Redis服務(wù)已經(jīng)切換成master節(jié)點(diǎn)了.
另外,也可以查看sentinel.conf 配置文件,里面的?sentinel monitor mymaster 192.168.14.101 6379 2 也自動(dòng)更改為?sentinel monitor mymaster 192.168.14.103 6381 2 配置了.
5、Java客戶端連接哨兵集群
這里通過(guò)springboot項(xiàng)目來(lái)連接,代碼地址如下:
https://github.com/YSOcean/redis-sentinel.git
這里貼一下主要測(cè)試代碼:
PS:實(shí)際上springboot已經(jīng)為我們注入了RedisTemplate,我們?cè)趯?shí)際項(xiàng)目中不用寫的像下面代碼這么麻煩,這樣寫是為了詳細(xì)的表明連接步驟.
//1.設(shè)置sentinel 各個(gè)節(jié)點(diǎn)集合
Set sentinelSet = new HashSet<>();
sentinelSet.add("192.168.14.101:26379");
sentinelSet.add("192.168.14.102:26380");
sentinelSet.add("192.168.14.103:26381");
//2.設(shè)置jedispool 連接池配置文件
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(10);
config.setMaxWaitMillis(1000);
//3.設(shè)置mastername,sentinelNode集合,配置文件,Redis登錄密碼
JedisSentinelPool jedisSentinelPool = new JedisSentinelPool("mymaster",sentinelSet,config,"123");
Jedis jedis = null;
try {
jedis = jedisSentinelPool.getResource();
//獲取Redis中key=hello的值
String value = jedis.get("hello");
System.out.println(value);
} catch (Exception e) {
e.printStackTrace();
} finally {
if(jedis != null){
jedis.close();
}
}
6、Java客戶端連接原理
①、結(jié)構(gòu)圖
②、連接步驟
一.客戶端遍歷所有的 Sentinel 節(jié)點(diǎn)集合,獲取一個(gè)可用的 Sentinel 節(jié)點(diǎn).
二.客戶端向可用的 Sentinel 節(jié)點(diǎn)發(fā)送 get-master-addr-by-name 命令,獲取Redis Master 節(jié)點(diǎn).
三.客戶端向Redis Master節(jié)點(diǎn)發(fā)送role或role replication 命令,來(lái)確定其是否是Master節(jié)點(diǎn),并且能夠獲取其 slave節(jié)點(diǎn)信息.
四.客戶端獲取到確定的節(jié)點(diǎn)信息后,便可以向Redis發(fā)送命令來(lái)進(jìn)行后續(xù)操作了
需要注意的是:客戶端是和Sentinel來(lái)進(jìn)行交互的,通過(guò)Sentinel來(lái)獲取真正的Redis節(jié)點(diǎn)信息,然后來(lái)操作.實(shí)際工作時(shí),Sentinel 內(nèi)部維護(hù)了一個(gè)主題隊(duì)列,用來(lái)保存Redis的節(jié)點(diǎn)信息,并實(shí)時(shí)更新,客戶端訂閱了這個(gè)主題,然后實(shí)時(shí)的去獲取這個(gè)隊(duì)列的Redis節(jié)點(diǎn)信息.
7、哨兵模式工作原理
①、三個(gè)定時(shí)任務(wù)
一.每10秒每個(gè) sentinel 對(duì)master 和 slave 執(zhí)行info 命令:該命令第一個(gè)是用來(lái)發(fā)現(xiàn)slave節(jié)點(diǎn),第二個(gè)是確定主從關(guān)系.
二.每2秒每個(gè) sentinel 通過(guò) master 節(jié)點(diǎn)的 channel(名稱為_(kāi)sentinel_:hello) 交換信息(pub/sub):用來(lái)交互對(duì)節(jié)點(diǎn)的看法(后面會(huì)介紹的節(jié)點(diǎn)主觀下線和客觀下線)以及自身信息.
三.每1秒每個(gè) sentinel 對(duì)其他 sentinel 和 redis 執(zhí)行 ping 命令,用于心跳檢測(cè),作為節(jié)點(diǎn)存活的判斷依據(jù).
②、主觀下線和客觀下線
一.主觀下線
SDOWN:subjectively down,直接翻譯的為”主觀”失效,即當(dāng)前sentinel實(shí)例認(rèn)為某個(gè)redis服務(wù)為”不可用”狀態(tài).
二.客觀下線
ODOWN:objectively down,直接翻譯為”客觀”失效,即多個(gè)sentinel實(shí)例都認(rèn)為master處于”SDOWN”狀態(tài),那么此時(shí)master將處于ODOWN,ODOWN可以簡(jiǎn)單理解為master已經(jīng)被集群確定為”不可用”,將會(huì)開(kāi)啟故障轉(zhuǎn)移機(jī)制.
結(jié)合我們第4點(diǎn)搭建主從模式,驗(yàn)證主從切換時(shí),kill掉Redis主節(jié)點(diǎn),然后查看 sentinel 日志,如下:
發(fā)現(xiàn)有類似 sdown 和 odown 的日志.在結(jié)合我們配置 sentinel 時(shí)的配置文件來(lái)看:
#監(jiān)控的IP 端口號(hào) 名稱 sentinel通過(guò)投票后認(rèn)為mater宕機(jī)的數(shù)量,此處為至少2個(gè)
sentinel monitor mymaster 192.168.14.101 6379 2
最后的 2 表示投票數(shù),也就是說(shuō)當(dāng)一臺(tái) sentinel 發(fā)現(xiàn)一個(gè) Redis 服務(wù)無(wú)法 ping 通時(shí),就標(biāo)記為 主觀下線 sdown;同時(shí)另外的 sentinel 服務(wù)也發(fā)現(xiàn)該 Redis 服務(wù)宕機(jī),也標(biāo)記為 主觀下線,當(dāng)多臺(tái) sentinel (大于等于2,上面配置的最后一個(gè))時(shí),都標(biāo)記該Redis服務(wù)宕機(jī),這時(shí)候就變?yōu)榭陀^下線了,然后進(jìn)行故障轉(zhuǎn)移.
③、故障轉(zhuǎn)移
故障轉(zhuǎn)移是由 sentinel 領(lǐng)導(dǎo)者節(jié)點(diǎn)來(lái)完成的(只需要一個(gè)sentinel節(jié)點(diǎn)),關(guān)于 sentinel 領(lǐng)導(dǎo)者節(jié)點(diǎn)的選取也是每個(gè) sentinel 向其他 sentinel 節(jié)點(diǎn)發(fā)送我要成為領(lǐng)導(dǎo)者的命令,超過(guò)半數(shù)sentinel 節(jié)點(diǎn)同意,并且也大于quorum ,那么他將成為領(lǐng)導(dǎo)者,如果有多個(gè)sentinel都成為了領(lǐng)導(dǎo)者,則會(huì)過(guò)段時(shí)間在進(jìn)行選舉.
sentinel 領(lǐng)導(dǎo)者節(jié)點(diǎn)選舉出來(lái)后,會(huì)通過(guò)如下幾步進(jìn)行故障轉(zhuǎn)移:
一.從 slave 節(jié)點(diǎn)中選出一個(gè)合適的 節(jié)點(diǎn)作為新的master節(jié)點(diǎn).這里的合適包括如下幾點(diǎn):
1.選擇 slave-priority(slave節(jié)點(diǎn)優(yōu)先級(jí))最高的slave節(jié)點(diǎn),如果存在則返回,不存在則繼續(xù)下一步判斷.
2.選擇復(fù)制偏移量最大的 slave 節(jié)點(diǎn)(復(fù)制的最完整),如果存在則返回,不存在則繼續(xù).
3.選擇runId最小的slave節(jié)點(diǎn)(啟動(dòng)最早的節(jié)點(diǎn))
二.對(duì)上面選出來(lái)的 slave 節(jié)點(diǎn)執(zhí)行 slaveof no one 命令讓其成為新的 master 節(jié)點(diǎn).
三.向剩余的 slave 節(jié)點(diǎn)發(fā)送命令,讓他們成為新master 節(jié)點(diǎn)的 slave 節(jié)點(diǎn),復(fù)制規(guī)則和前面設(shè)置的 parallel-syncs 參數(shù)有關(guān).
四.更新原來(lái)master 節(jié)點(diǎn)配置為 slave 節(jié)點(diǎn),并保持對(duì)其進(jìn)行關(guān)注,一旦這個(gè)節(jié)點(diǎn)重新恢復(fù)正常后,會(huì)命令它去復(fù)制新的master節(jié)點(diǎn)信息.(注意:原來(lái)的master節(jié)點(diǎn)恢復(fù)后是作為slave的角色)
可以從 sentinel 日志中出現(xiàn)的幾個(gè)消息來(lái)進(jìn)行查看故障轉(zhuǎn)移:
1.+switch-master:表示切換主節(jié)點(diǎn)(從節(jié)點(diǎn)晉升為主節(jié)點(diǎn))
2.+sdown:主觀下線
3.+odown:客觀下線
4.+convert-to-slave:切換從節(jié)點(diǎn)(原主節(jié)點(diǎn)降為從節(jié)點(diǎn))
總結(jié)
以上是生活随笔為你收集整理的jedispool redis哨兵_Redis详解(九)------ 哨兵(Sentinel)模式详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 瓜子二手车发12月二手车价格:汉兰达奥德
- 下一篇: JDBC和MySQL的实现原理