新聞中心

成都創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)金水,10多年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):13518219792
Redis 官方推薦一種高可用方案,也就是 Redis Sentinel 哨兵模式,它彌補了主從模式的不足。Sentinel 通過監(jiān)控的方式獲取主機的工作狀態(tài)是否正常,當(dāng)主機發(fā)生故障時, Sentinel 會自動進行 Failover(即故障轉(zhuǎn)移),并將其監(jiān)控的從機提升主服務(wù)器(master),從而保證了系統(tǒng)的高可用性。
哨兵模式原理
哨兵模式是一種特殊的模式,Redis 為其提供了專屬的哨兵命令,它是一個獨立的進程,能夠獨立運行。下面使用 Sentinel 搭建 Redis 集群,基本結(jié)構(gòu)圖如下所示:
圖1:哨兵基本模式
在上圖過程中,哨兵主要有兩個重要作用:
- 第一:哨兵節(jié)點會以每秒一次的頻率對每個 Redis 節(jié)點發(fā)送
PING命令,并通過 Redis 節(jié)點的回復(fù)來判斷其運行狀態(tài)。 - 第二:當(dāng)哨兵監(jiān)測到主服務(wù)器發(fā)生故障時,會自動在從節(jié)點中選擇一臺將機器,并其提升為主服務(wù)器,然后使用 PubSub 發(fā)布訂閱模式,通知其他的從節(jié)點,修改配置文件,跟隨新的主服務(wù)器。
在實際生產(chǎn)情況中,Redis Sentinel 是集群的高可用的保障,為避免 Sentinel 發(fā)生意外,它一般是由 3~5 個節(jié)點組成,這樣就算掛了個別節(jié)點,該集群仍然可以正常運轉(zhuǎn)。其結(jié)構(gòu)圖如下所示:
圖2:多哨兵模式
上圖所示,多個哨兵之間也存在互相監(jiān)控,這就形成了多哨兵模式,現(xiàn)在對該模式的工作過程進行講解,介紹如下:
1) 主觀下線
主觀下線,適用于主服務(wù)器和從服務(wù)器。如果在規(guī)定的時間內(nèi)(配置參數(shù):down-after-milliseconds),Sentinel 節(jié)點沒有收到目標(biāo)服務(wù)器的有效回復(fù),則判定該服務(wù)器為“主觀下線”。比如 Sentinel1 向主服務(wù)發(fā)送了
PING命令,在規(guī)定時間內(nèi)沒收到主服務(wù)器
PONG回復(fù),則 Sentinel1 判定主服務(wù)器為“主觀下線”。
2) 客觀下線
客觀下線,只適用于主服務(wù)器。 Sentinel1 發(fā)現(xiàn)主服務(wù)器出現(xiàn)了故障,它會通過相應(yīng)的命令,詢問其它 Sentinel 節(jié)點對主服務(wù)器的狀態(tài)判斷。如果超過半數(shù)以上的 Sentinel 節(jié)點認為主服務(wù)器 down 掉,則 Sentinel1 節(jié)點判定主服務(wù)為“客觀下線”。
3) 投票選舉
投票選舉,所有 Sentinel 節(jié)點會通過投票機制,按照誰發(fā)現(xiàn)誰去處理的原則,選舉 Sentinel1 為領(lǐng)頭節(jié)點去做 Failover(故障轉(zhuǎn)移)操作。Sentinel1 節(jié)點則按照一定的規(guī)則在所有從節(jié)點中選擇一個最優(yōu)的作為主服務(wù)器,然后通過發(fā)布訂功能通知其余的從節(jié)點(slave)更改配置文件,跟隨新上任的主服務(wù)器(master)。至此就完成了主從切換的操作。
對上對述過程做簡單總結(jié):
Sentinel 負責(zé)監(jiān)控主從節(jié)點的“健康”狀態(tài)。當(dāng)主節(jié)點掛掉時,自動選擇一個最優(yōu)的從節(jié)點切換為主節(jié)點??蛻舳藖磉B接 Redis 集群時,會首先連接 Sentinel,通過 Sentinel 來查詢主節(jié)點的地址,然后再去連接主節(jié)點進行數(shù)據(jù)交互。當(dāng)主節(jié)點發(fā)生故障時,客戶端會重新向 Sentinel 要地址,Sentinel 會將最新的主節(jié)點地址告訴客戶端。因此應(yīng)用程序無需重啟即可自動完成主從節(jié)點切換。
哨兵模式應(yīng)用
Redis Sentinel 哨兵模式適合于在 Linux 系統(tǒng)中使用,所以下面的應(yīng)用都基于 Ubuntu 實現(xiàn)。
1) 安裝sentinel
Sentinel 需要作為插件單獨安裝,安裝方式如下:
sudo apt install redis-sentinel
2) 搭建主從模式
接下來,在本地環(huán)境使用主從模式搭建一個擁有三臺服務(wù)器的 Redis 集群,命令如下所示:
啟動6379的redis服務(wù)器作為master主機: sudo /etc/init.d/redis-server start 啟動6380的redis服務(wù)器,設(shè)置為6379的slave: redis-server --port 6380 $ redis-cli -p 6380 127.0.0.1:6380> slaveof 127.0.0.1 6379 OK 啟動6381的redis服務(wù)器,設(shè)置為6379的salve redis-server --port 6381 $ redis-cli -p 6381 127.0.0.1:6381> slaveof 127.0.0.1 6379
3) 配置sentinel哨兵
首先新建 sentinel.conf 文件,并對其進行配置,如下所示:
port 26379 Sentinel monitor biancheng 127.0.0.1 6379 1
配置文件說明如下:
port 26379 #sentinel監(jiān)聽端口,默認是26379,可以更改 sentinel monitor
第二個配置項表示:讓 sentinel 去監(jiān)控一個地址為 ip:port 的主服務(wù)器,這里的 master-name 可以自定義;
4) 啟動sentienl哨兵
方式一: redis-sentinel sentinel.conf 方式二: redis-server sentinel.conf --sentinel
5) 停止主服務(wù)器服務(wù)
下面模擬主服務(wù)意外宕機的情況,首先直接將主服務(wù)器的 Redis 服務(wù)終止,然后查看從服務(wù)器是否被提升為了主服務(wù)器。執(zhí)行以下命令:
#終止master的redis服務(wù) sudo /etc/init.d/redis-server stop
執(zhí)行完上述命令,您會發(fā)現(xiàn) 6381 稱為了新的 master,而其余節(jié)點變成了它的從機,執(zhí)行命令驗證:
127.0.0.1:6381> set webname www.biancheng.net OK
哨兵的配置文件 sentinel.conf 也發(fā)生了變化:
#port 26379 #sentinel myid 4c626b6ff25dca5e757afdae2bd26a881a61a2b2 # Generated by CONFIG REWRITE dir "/home/biancheng" maxclients 4064 sentinel myid 4c626b6ff25dca5e757afdae2bd26a881a61a2b2 sentinel monitor biancheng 127.0.0.1 6379 1 sentinel config-epoch biancheng 2 sentinel leader-epoch biancheng 2 sentinel known-slave biancheng 127.0.0.1 6379 sentinel known-slave biancheng 127.0.0.1 6380 sentinel known-slave biancheng 127.0.0.1 6381 port 26379 sentinel current-epoch 2
如果您想開啟多個哨兵,只需配置要多個 sentinel.conf 文件即可,一個配置文件開啟一個。
sentinel.conf配置項
下面對 Sentinel 配置文件的其他配置項做簡單說明:
| 配置項 | 參數(shù)類型 | 說明 |
|---|---|---|
| dir | 文件目錄 | 哨兵進程服務(wù)的文件存放目錄,默認為 /tmp。 |
| port | 端口號 | 啟動哨兵的進程端口號,默認為 26379。 |
| sentinel down-after-milliseconds | <服務(wù)名稱><毫秒數(shù)(整數(shù))> | 在指定的毫秒數(shù)內(nèi),若主節(jié)點沒有應(yīng)答哨兵的 PING 命令,此時哨兵認為服務(wù)器主觀下線,默認時間為 30 秒。 |
| sentinel parallel-syncs | <服務(wù)名稱><服務(wù)器數(shù)(整數(shù))> | 指定可以有多少個 Redis 服務(wù)同步新的主機,一般而言,這個數(shù)字越小同步時間越長,而越大,則對網(wǎng)絡(luò)資源要求就越高。 |
| sentinel failover-timeout | <服務(wù)名稱><毫秒數(shù)(整數(shù))> | 指定故障轉(zhuǎn)移允許的毫秒數(shù),若超過這個時間,就認為故障轉(zhuǎn)移執(zhí)行失敗,默認為 3 分鐘。 |
| sentinel notification-script | <服務(wù)名稱><腳本路徑> | 腳本通知,配置當(dāng)某一事件發(fā)生時所需要執(zhí)行的腳本,可以通過腳本來通知管理員,例如當(dāng)系統(tǒng)運行不正常時發(fā)郵件通知相關(guān)人員。 |
| sentinel auth-pass |
<服務(wù)器名稱><密碼> | 若主服務(wù)器設(shè)置了密碼,則哨兵必須也配置密碼,否則哨兵無法對主從服務(wù)器進行監(jiān)控。該密碼與主服務(wù)器密碼相同。 |
標(biāo)題名稱:Redis集群:Sentinel哨兵模式(詳細圖解)
網(wǎng)頁網(wǎng)址:http://www.dlmjj.cn/article/dpjesod.html


咨詢
建站咨詢
