【Redis 系列】redis 的哨兵模式詳解和實(shí)戰(zhàn)
上一次我們說到的主從復(fù)制是這樣搭建的
主機(jī)可以讀,可以寫
從機(jī)只能讀,不能寫

想一想,那么我們是不是也可以這樣呢?
多個(gè) redis-server 首尾相連

那么咱們部署的時(shí)候就是 6379 – 6380 – 6381
此時(shí),若主機(jī) 6379 宕機(jī)掉,6380 會(huì)不會(huì)變成主機(jī)呢?
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=0,lag=1
master_failover_state:no-failover
master_replid:f1e3db9e5e438f5d98e4cad23f684b12d790ae56
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:0
復(fù)制代碼我們可以看到 6379 有一個(gè)從機(jī),6380 自身也是作為從機(jī)(雖然 6380 是 6381 的主機(jī))

此時(shí)將 6379 宕機(jī)掉,發(fā)現(xiàn) 6380 仍然是 slave
127.0.0.1:6379> shudown
not connected>
復(fù)制代碼
我們?nèi)藶榈膶?reids 6380 的服務(wù)器修改為主機(jī),看看 6379 redis-server 起來之后,是否可以把 master 搶回去
使用 slaveof no one 可以將自己設(shè)置成 master

啟動(dòng) 6379 redis-server
redis-server /usr/local/redis/redis-6.2.5/6379.conf
復(fù)制代碼發(fā)現(xiàn) 6380 仍然是主機(jī),6379 成為了光桿司令
實(shí)際項(xiàng)目中,我們肯定不會(huì)采取上面和上一次文章說到的部署方式,他們抵御風(fēng)險(xiǎn)的能力太低了
因?yàn)閷?shí)際生產(chǎn)環(huán)境中,主機(jī)宕機(jī)了,若從機(jī)沒有辦法成為主機(jī)的話,豈不是在主機(jī)回復(fù)之前再也不能做寫入操作了嗎?這是很嚴(yán)重的問題
下面我們來詳細(xì)看看 哨兵模式是如何解決上述問題的
哨兵模式
自動(dòng)選舉 master 的模式
介紹
主動(dòng)切換 master 的方法是:
當(dāng)主機(jī)服務(wù)器宕機(jī)后,以往的情況咱們需要手動(dòng)把某一個(gè)從機(jī)服務(wù)器修改為主機(jī)服務(wù)器,需要人為處理,耗時(shí)耗力,且會(huì)造成一段時(shí)間內(nèi)服務(wù)不可用的情況,這種做法是不可取的
所以有了哨兵模式,哨兵模式是 redis 2.8 版本開始真是提供的 sentinel 架構(gòu)來解決上述的問題
哨兵模式,能夠監(jiān)控后臺(tái)的主機(jī)服務(wù)器是否故障,若出現(xiàn)了故障,則會(huì)投票選舉出一個(gè)從機(jī)服務(wù)器來做主機(jī)
哨兵模式是一種特殊的模式,Redis 提供了哨兵的命令
哨兵其實(shí)是一個(gè)獨(dú)立的進(jìn)程,作為進(jìn)程,它會(huì)獨(dú)立運(yùn)行
其原理就是哨兵通過發(fā)送命令,等到 Redis 服務(wù)器響應(yīng),從而監(jiān)控運(yùn)行的多個(gè) Redis 實(shí)例
實(shí)際演練

上圖中的架構(gòu)圖,哨兵有 2 個(gè)作用:
通過發(fā)送命令,Redis 服務(wù)器返回監(jiān)控狀態(tài)信息,包括主服務(wù)器和從服務(wù)器的
若哨兵檢測到主服務(wù)器宕機(jī),會(huì)自動(dòng)將slave 切換 master,然后通過發(fā)布訂閱通知其他從服務(wù)器,修改配置文件,讓他成為主機(jī)
可是一個(gè)哨兵來監(jiān)控一個(gè) redis 集群,出現(xiàn)問題的可能性會(huì)大很多,因此,我們的哨兵也可以是集群的,每隔哨兵之間還會(huì)互相監(jiān)控的,就像下面這張圖

主觀下線
例如咱們舉一個(gè)例子,如果 master 服務(wù)器宕機(jī)了,那么其中一個(gè)哨兵就會(huì)檢測到,系統(tǒng)并不會(huì)馬上執(zhí)行 failover 的過程,僅僅是當(dāng)前這個(gè)哨兵,判斷 master 不可用,這個(gè)就是主觀下線
主觀下線
當(dāng)其他兩個(gè)哨兵也發(fā)現(xiàn) master 服務(wù)器不可用的時(shí)候,那么哨兵之間就會(huì)產(chǎn)生投票,具體的投票算法我們后續(xù)再寫,投票的結(jié)構(gòu)由一個(gè)哨兵發(fā)起,進(jìn)行 failover 故障轉(zhuǎn)移的操作,切換成功之后,就會(huì)通過發(fā)布訂閱模式,讓每一個(gè)監(jiān)控的哨兵把自己監(jiān)控的服務(wù)器切換到這個(gè) master 服務(wù)器上, 這個(gè)就是 客觀下線
我們來配置和開啟一個(gè)哨兵:
同樣在我們的配置文件目錄,與 redis 是同級的目錄下,創(chuàng)建一個(gè) sentinel.conf 文件, 并寫入配置,這個(gè)文件安裝 redis 默認(rèn)也會(huì)生成一個(gè)

如上,咱們關(guān)注的命令是
sentinel monitor mymaster 127.0.0.1 6379 1
復(fù)制代碼配置一個(gè)哨兵,進(jìn)行監(jiān)控 redis 集群
開啟 哨兵 進(jìn)程
root@iZuf66y3tuzn4wp3h02t7pZ:/usr/local/redis/redis-6.2.5# redis-sentinel sentinel.conf
18148:X 26 Aug 2021 22:22:36.187 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
18148:X 26 Aug 2021 22:22:36.187 # Redis version=6.2.5, bits=64, commit=00000000, modified=0, pid=18148, just started
18148:X 26 Aug 2021 22:22:36.187 # Configuration loaded
18148:X 26 Aug 2021 22:22:36.188 * monotonic clock: POSIX clock_gettime
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 6.2.5 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 26379
| `-._ `._ / _.-' | PID: 18148
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | https://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
18148:X 26 Aug 2021 22:22:36.189 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
18148:X 26 Aug 2021 22:22:36.193 # Sentinel ID is 7e01f5aa31aadb7fc54ed8ef2579c77120682dc9
18148:X 26 Aug 2021 22:22:36.193 # +monitor master mymaster 127.0.0.1 6379 quorum 1
18148:X 26 Aug 2021 22:22:36.193 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
18148:X 26 Aug 2021 22:22:36.196 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
復(fù)制代碼我們可以看到,開啟哨兵進(jìn)程之后,開始監(jiān)控到 redis 集群,并輸出了監(jiān)控的 redis 的 ip 和端口
此時(shí),咱們查看一個(gè) master redis 服務(wù)器的信息,可以看到目前有 2 個(gè) slave ,現(xiàn)在咱們讓主機(jī)宕機(jī)

查看哨兵的日志,咱們可以看到 哨兵進(jìn)程在 30 秒之后,開始進(jìn)行投票選舉主機(jī)

根據(jù)日志,我們可以看出,6379 的主機(jī)宕機(jī)之后,哨兵選舉了 6381 的從機(jī)作為新的主機(jī),自動(dòng)故障恢復(fù)成功,nice

查看 6381 的 master 主機(jī)進(jìn)程,查看到自己是主機(jī),有1 個(gè)從機(jī)
由于 6379 默認(rèn)配置就是 主機(jī),因此將 6379 服務(wù)器再次啟動(dòng)的時(shí)候,6379 就變成了光桿司令,從機(jī)就變成了 0 個(gè)
root@iZuf66y3tuzn4wp3h02t7pZ:~# redis-server /usr/local/redis/redis-6.2.5/6379.conf
root@iZuf66y3tuzn4wp3h02t7pZ:~# redis-cli -p 6379
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:80843f8a6497705983f6463b92d71ebd451ef385
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
復(fù)制代碼sentinel.conf 配置文件里面的配置項(xiàng)也不多,下面咱們詳細(xì)的一一說明一下:
哨兵模式詳細(xì)配置如下:
port
哨兵 sentinel 實(shí)例運(yùn)行的端口 , 默認(rèn)是26379,如果有哨兵集群,我們還需要配置每個(gè)哨兵端口
dir
哨兵sentinel的工作目錄
sentinel monitor
哨兵 sentinel 監(jiān)控的 redis 主節(jié)點(diǎn)的 ip port
master-name ,可以自己命名的主節(jié)點(diǎn)名字 只能由字母A-Z、數(shù)字0-9、這三個(gè)字符" . - _ "組成。
quorum 配置多少個(gè) sentinel 哨兵統(tǒng)一認(rèn)為master主節(jié)點(diǎn)失聯(lián)那么這時(shí)客觀上認(rèn)為主節(jié)點(diǎn)失聯(lián)了
sentine1 auth-pass
當(dāng)在 Redis 實(shí)例中開啟了requirepass foobared 授權(quán)密碼這樣所有連接 redis 實(shí)例的客戶端都要提供密碼
設(shè)置哨兵 sentinel 連接主從的密碼注意必須為主從設(shè)置一樣的驗(yàn)證密碼
sentinel down-after-mi 11i seconds <mi 11iseconds>
指定多少毫秒之后主節(jié)點(diǎn)沒有應(yīng)答哨兵sentine1 此時(shí)哨兵主觀上認(rèn)為主節(jié)點(diǎn)下線默認(rèn)30秒
sentinel paralle1-syncs
指定了在發(fā)生 failover 主備切換時(shí)最多可以有多少個(gè) slave 同時(shí)對新的 master 進(jìn)行同步
這個(gè)數(shù)字越小,完成 failover 所需的時(shí)間就越長
但是如果這個(gè)數(shù)字越大,就意味著越多的 slave 因?yàn)?replication 而 不可用
可以通過將這個(gè)值設(shè)為 1 來保證每次只有一個(gè) slave 處于不能處理命令請求的狀態(tài)
sentinel failover-timeout
故障轉(zhuǎn)移的超時(shí)時(shí)間failover-timeout 可以用在以下這些方面:
1、同一個(gè) sentinel 對同一 個(gè) master 兩次 failover 之間的間隔時(shí)間
2、當(dāng)一個(gè) slave 從一 個(gè)錯(cuò)誤的 master 那里同步數(shù)據(jù)開始計(jì)算時(shí)間
直到 slave 被糾正為向正確的 master 那里同步數(shù)據(jù)時(shí)
3、當(dāng)想要取消一個(gè)正在進(jìn)行的 failover 所需要的時(shí)間
4、當(dāng)進(jìn)行 failover 時(shí),配置所有 slave 指向新的master所需的最大時(shí)間
不過,即使過了這個(gè)超時(shí),slaves 依然會(huì)被正確配置為指向 master , 但是就不按 parallel-syncs所配置的規(guī)則來了
5、默認(rèn)時(shí)間是三分鐘
sentinel notification-script
當(dāng) sentinel 有任何警告級別的事件發(fā)生時(shí)(比如說redis實(shí)例的主觀失效和客觀失效等等),將會(huì)去調(diào)用這個(gè)腳本
這時(shí)這個(gè)腳本應(yīng)該通過郵件,SMS 等方式去通知系統(tǒng)管理員關(guān)于系統(tǒng)不正常運(yùn)行的信息
調(diào)用該腳本時(shí),將傳給腳本兩個(gè)參數(shù)
1、事件的類型
2、事件的描述
如果 sentinel . conf 配置文件中配置了這個(gè)腳本路徑,那么必須保證這個(gè)腳本存在于這個(gè)路徑,并且是可執(zhí)行的,否則 sentinel 無法正常啟動(dòng)成功
sentinel client-reconfig-script
該配置是客戶端重新配置主節(jié)點(diǎn)參數(shù)腳本
當(dāng)一個(gè) master 由于 failover 而發(fā)生改變時(shí),這個(gè)腳本將會(huì)被調(diào)用,通知相關(guān)的客戶端關(guān)于master 地址已經(jīng)發(fā)生改變的信息
以下參數(shù)將會(huì)在調(diào)用腳本時(shí)傳給腳本:
, 是 Teader 或者 observer 中的-一個(gè)
, 一般是 failover
參數(shù) from-ip, from-port, to-ip,to-port 是用來和舊的 master 和新的 master (即舊的s lave)通信的
port 26379
dir /tmp
sentinel monitor mymaster 127.0.0.1 6379 2
sentine1 auth-pass mymaster MySUPER--secret-0123passwOrd
sentine1 down-after-mi 11iseconds mymaster 30000
sentine1 paralle1-syncs mymaster 1
sentine1 fai lover-ti meout mymaster 180000
sentine1 notificati on-script mymaster /var/redis/notify. sh
sentine1 client-reconfig-script mymaster /var/redis/reconfig.sh
復(fù)制代碼參考資料:
redis_doc
歡迎點(diǎn)贊,關(guān)注,收藏
朋友們,你的支持和鼓勵(lì),是我堅(jiān)持分享,提高質(zhì)量的動(dòng)力
作者:小魔童哪吒
鏈接:https://juejin.cn/post/7000747318051864606
來源:掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
