docker 搭建簡單的Redis哨兵模式(接redis主從復(fù)制)

接上篇文章,解決主從復(fù)制后,主機(jī)宕機(jī),主備不自動(dòng)切換--哨兵模式

docker 搭建簡單的Redis 主從復(fù)制(slaveof)并且連接Laravel

搭建哨兵有兩種方式

  • 哨兵服務(wù)和主從機(jī)在同一機(jī)器上
  • 哨兵服務(wù)單獨(dú)開一個(gè)redis服務(wù)器

一、主機(jī)和哨兵在同一臺(tái)機(jī)器上

首先創(chuàng)建哨兵所需配置文件sentinel.conf,在m1、s1、s2文件下分別創(chuàng)建。

image.png

啟動(dòng)redis容器,并且配置主從

注意這里如果直接掛載目錄,會(huì)有一個(gè)錯(cuò)誤,產(chǎn)生這個(gè)錯(cuò)誤的原因就是目錄掛載問題
因?yàn)镾entinel會(huì)在啟動(dòng)后向自己的配置文件中追加內(nèi)容,它采用的是先創(chuàng)建一個(gè)臨時(shí)配置文件,然后使用它替換掉原來的配置文件的方式。
WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy

運(yùn)行容器、并且配置主從

docker run --name m1 -p 6379:6379 -v  E:/Docker/redis/monitor/m1/:/data -d redis     
docker run --name s1 -p 6380:6380 -v  E:/Docker/redis/monitor/s1/:/data  -d redis       
docker run --name s2 -p 6381:6381 -v  E:/Docker/redis/monitor/s2/:/data -d redis   

配置主從,語法:slaveof <host> <port>host為主機(jī) m1 地址,可以通過 docker inspect m1查看

// s1
docker exec -it s1 redis-cli
slaveof 172.17.0.6 6379

// s2
docker exec -it s2 redis-cli
slaveof 172.17.0.6 6379

編寫sentinel.conf配置文件,配置文件詳解

<port> => 哨兵默認(rèn)監(jiān)聽端口
<dir> => 指定哨兵工作目錄
<daemonize> => 是否以守護(hù)進(jìn)程方式啟動(dòng),默認(rèn)為否,你可以進(jìn)行刪除或者設(shè)置成no
<sentinel monitor mymaster <host> <port> <num>> 聲明了要監(jiān)控的主節(jié)點(diǎn)信息。你需要將<host><port> 替換為實(shí)際的主節(jié)點(diǎn)的IP 地址主機(jī)名端口號(hào),并設(shè)置 <num> 為希望達(dá)到的哨兵數(shù)量
sentinel down-after-milliseconds mymaster 5000 設(shè)置哨兵判斷主節(jié)點(diǎn)不可用的時(shí)間閾值為 5000 毫秒(即 5 秒)。如果哨兵在指定的時(shí)間內(nèi)無法與主節(jié)點(diǎn)通信,將判斷主節(jié)點(diǎn)不可用。
sentinel failover-timeout mymaster 10000設(shè)置故障轉(zhuǎn)移的超時(shí)時(shí)間為 10000 毫秒(即 10 秒)。如果主節(jié)點(diǎn)在超過指定時(shí)間后仍然不可用,哨兵將啟動(dòng)故障轉(zhuǎn)移操作。
<示例> => sentinel monitor mymaster 172.17.0.6 6379 2

port 26379
dir /data
daemonize yes
sentinel monitor mymaster <host> <port> <num>
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000

分別進(jìn)入容器,啟動(dòng)哨兵服務(wù)

// m1
docker exec -it m1 bash
redis-sentinel sentinel-conf

// s1
docker exec -it s1 bash
redis-sentinel sentinel-conf

// s2
docker exec -it s2 bash
redis-sentinel sentinel-conf

主從配置完成后

image.png

啟動(dòng)哨兵服務(wù)完成后

image.png

查看哨兵狀態(tài)

image.png

停止主機(jī)m1

查看 主從信息 info replication

1686735629183.jpg
選擇完成再次查看 info replication
image.png

重新啟動(dòng) m1 后,成為 s2 的從機(jī)

image.png

二、哨兵和主從分別在不同的服務(wù)器上,需要提前創(chuàng)建目錄

docker run -d --name sentinel0 -p 26379:26379 -v  E:/Docker/redis/sentinel/m1/:/data redis    
docker run -d --name sentinel1 -p 26380:26380 -v  E:/Docker/redis/sentinel/s1/:/data redis      
docker run -d --name sentinel2 -p 26381:26381 -v  E:/Docker/redis/sentinel/s2/:/data redis    

E:/Docker/redis/sentinel/m1 、s1、s2 下分別創(chuàng)建 sentinel.conf文件,并寫入配置

port 26379
dir /data
daemonize yes
sentinel monitor mymaster 172.17.0.6 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000

分別進(jìn)入sentinel0 、sentinel1、sentinel2 容器啟動(dòng)哨兵服務(wù)

docker exec -it sentinel0 bash
reids-sentinel sentinel.conf

停止掉主機(jī) m1 后,會(huì)自動(dòng)選擇一個(gè)從機(jī)升級(jí)為主機(jī),實(shí)現(xiàn)故障自動(dòng)轉(zhuǎn)移

sentinel.conf也可以如下配置

// 版本一
port 26379
dir /data
daemonize yes
sentinel monitor mymaster 172.17.0.6 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
sentinel known-slave mymaster 172.17.0.7 6380
sentinel known-slave mymaster 172.17.0.8 6381
// 版本二
port 26379
dir /data
daemonize yes
sentinel monitor mymaster 172.17.0.6 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
sentinel known-slave mymaster 172.17.0.7 6380
sentinel known-slave mymaster 172.17.0.8 6381
sentinel known-sentinel mymaster 172.17.0.9 26379
// 版本三
port 26379
dir /data
daemonize yes
sentinel monitor mymaster 172.17.0.6 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000

上述配置文件主要的區(qū)別是:

  • 第一個(gè)配置文件:除了配置了主節(jié)點(diǎn)的監(jiān)控信息外,還列出了兩個(gè)從節(jié)點(diǎn)的信息。
  • 第二個(gè)配置文件:除了配置了主節(jié)點(diǎn)的監(jiān)控信息外,還列出了兩個(gè)從節(jié)點(diǎn)和一個(gè)已知的哨兵節(jié)點(diǎn)的信息。
  • 第三個(gè)配置文件:僅配置了主節(jié)點(diǎn)的監(jiān)控信息,沒有列出任何從節(jié)點(diǎn)或其他哨兵節(jié)點(diǎn)的信息。
  • 因此,第三個(gè)配置文件只關(guān)注主節(jié)點(diǎn)的監(jiān)控和故障轉(zhuǎn)移,而忽略了從節(jié)點(diǎn)和其他哨兵節(jié)點(diǎn)的配置。這意味著在故障轉(zhuǎn)移時(shí),沒有指定的從節(jié)點(diǎn)或其他哨兵節(jié)點(diǎn)來協(xié)助決策和執(zhí)行故障轉(zhuǎn)移操作。
  • 如果你只關(guān)注主節(jié)點(diǎn)的故障轉(zhuǎn)移,并且不需要從節(jié)點(diǎn)或其他哨兵節(jié)點(diǎn)的協(xié)助,那么這個(gè)簡化的配置文件足夠了。但是,如果你希望實(shí)現(xiàn)完整的哨兵機(jī)制,包括從節(jié)點(diǎn)和多個(gè)哨兵節(jié)點(diǎn)的協(xié)作,那么你需要在配置文件中添加相應(yīng)的信息

Raft 算法簡單的剖析

Raft主要有三個(gè)角色:領(lǐng)導(dǎo)者、追隨者、候選者

  • 初始狀態(tài)下,所有哨兵節(jié)點(diǎn)都是追隨者,當(dāng)一個(gè)節(jié)點(diǎn)成為領(lǐng)導(dǎo)者時(shí),它負(fù)責(zé)處理客戶端請求和復(fù)制日志給其他節(jié)點(diǎn)。如果當(dāng)前的領(lǐng)導(dǎo)者失去聯(lián)系或發(fā)生故障,其他節(jié)點(diǎn)會(huì)發(fā)起選舉來選擇新的領(lǐng)導(dǎo)者。
  • 如果一個(gè)哨兵節(jié)點(diǎn)在一段時(shí)間內(nèi)無法與其他節(jié)點(diǎn)通信,它會(huì)嘗試成為領(lǐng)導(dǎo)者,當(dāng)多個(gè)哨兵節(jié)點(diǎn)都嘗試成為領(lǐng)導(dǎo)者時(shí),它們會(huì)進(jìn)行選舉,即從跟隨者轉(zhuǎn)變成為候選者,然后它會(huì)向其他節(jié)點(diǎn)發(fā)送選舉請求,求請求他們投票,節(jié)點(diǎn)可以投給自己或其他節(jié)點(diǎn),當(dāng)一個(gè)節(jié)點(diǎn)收到了大多數(shù)節(jié)點(diǎn)的投票時(shí)(一般是超過半數(shù)),它將成為新的領(lǐng)導(dǎo)者
  • 成為領(lǐng)導(dǎo)者的哨兵節(jié)點(diǎn)會(huì)向其他節(jié)點(diǎn)發(fā)送心跳信號(hào)來維持其領(lǐng)導(dǎo)地位
  • 如果一個(gè)追隨者在一段時(shí)間內(nèi)沒有收到領(lǐng)導(dǎo)者的心跳信號(hào),它會(huì)嘗試成為領(lǐng)導(dǎo)者
  • 領(lǐng)導(dǎo)者負(fù)責(zé)監(jiān)控主節(jié)點(diǎn)的健康狀態(tài),并在需要時(shí)執(zhí)行故障轉(zhuǎn)移操作
  • 當(dāng)主節(jié)點(diǎn)出現(xiàn)故障時(shí),領(lǐng)導(dǎo)者會(huì)通知其他節(jié)點(diǎn)進(jìn)行故障轉(zhuǎn)移,選出新的主節(jié)點(diǎn)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容