Redis主從+哨兵集群部署詳解
一、 哨兵模式介紹
在一主多從的 Redis 架構(gòu)中,從節(jié)點可以起到數(shù)據(jù)冗余備份和讀寫分離的作用。
如果主節(jié)點遇到故障導致無法提供服務(wù)時,可以采用手動方式將其一個從節(jié)點提升為主節(jié)點,保證 Redis 主從能夠正常工作。
主從切換通過手動完成比較耗時、費力,并且影響 Redis 正常服務(wù)。為此,Reids 提供了哨兵功能,實現(xiàn)了自動化的系統(tǒng)監(jiān)控和故障恢復(fù)功能。
1. 概述
哨兵(Sentine1),主要負責監(jiān)控主從節(jié)點運行是否正常,以及當主節(jié)點出現(xiàn)故障時自動將一個從節(jié)點轉(zhuǎn)換為新的主節(jié)點。
哨兵是一個獨立的進程。,最基礎(chǔ)的通用哨兵架構(gòu)如下所示:

哨兵最基礎(chǔ)架構(gòu)由兩部分組成,包括哨兵節(jié)點和數(shù)據(jù)節(jié)點。
其中,哨兵節(jié)點是特殊的 Redis 節(jié)點,并不存儲數(shù)據(jù),出于高可用方面考慮,哨兵架構(gòu)中通常都是多個哨兵節(jié)點共同提供服務(wù)。
數(shù)據(jù)節(jié)點用于存儲 Redis 數(shù)據(jù)。包括主節(jié)點和從節(jié)點。
2. 實現(xiàn)原理
哨兵節(jié)點的配置文件中需要添加如下配置:
sentinel monitor master-name ip port quorum
其中,sentinel monitor 是配置哨兵的命令,接著是主節(jié)點的名稱、IP 地址和端口號,最后的 quorum 用來表示執(zhí)行故障恢復(fù)操作之前至少需要幾個哨兵節(jié)點同意。一個哨兵節(jié)點可以同時監(jiān)控多個 Reids 主從系統(tǒng),多個哨兵節(jié)點也可以同時監(jiān)控同一個 Redis 主從系統(tǒng)。
配置修改好之后,就可以啟動哨兵節(jié)點了。當哨兵節(jié)點啟動時,會與要監(jiān)控的主數(shù)據(jù)庫(master)建立連接,連接建立之后,哨兵會定時地執(zhí)行以下3個任務(wù):
- 每 10 秒哨兵會向主節(jié)點和從節(jié)點發(fā)送 info 命令。
- 每2秒哨兵會向主節(jié)點和從節(jié)點發(fā)送自己的信息。
- 每1秒哨兵會向主節(jié)點、從節(jié)點和其他哨兵發(fā)送 ping 命令。
這3個定時任務(wù)貫穿哨兵進程的整個生命周期,非常重要。
當哨兵節(jié)點啟動后,會向主節(jié)點發(fā)送 info 命令,通過解析返回的結(jié)果可以獲得從節(jié)點的列表,然后與每個從節(jié)點建立連接。
之后,哨兵會每隔 10 秒定時向所有已知主從節(jié)點發(fā)送 info 命令來獲取西悉尼更新并進行相應(yīng)的操作。
接下來哨兵會向主從節(jié)點發(fā)送信息與同樣監(jiān)控主從節(jié)點的哨兵分享自己的信息。當其他哨兵節(jié)點收到信息后,會判斷發(fā)送信息的哨兵是不是新發(fā)現(xiàn)的哨兵,如果是則將其加入已發(fā)現(xiàn)的哨兵列表中并創(chuàng)建到該節(jié)點的連接,這樣就實現(xiàn)了自動發(fā)現(xiàn)從節(jié)點和其他哨兵節(jié)點。
之后哨兵要做的就是監(jiān)控主從節(jié)點是否停止服務(wù),通過發(fā)送ping 命令來實現(xiàn)的。
ping 命令是每隔1秒發(fā)送一次,如果被 ping 的節(jié)點超時一定的時間沒有回復(fù),哨兵就會認為其主觀下線,是哨兵節(jié)點“主觀地” 判斷下線。
如果該節(jié)點是主節(jié)點,則哨兵會進一步判斷是否需要對其進行故障恢復(fù),具體過程如下:該哨兵節(jié)點會詢問其他哨兵節(jié)點來了解它們是否也認為該主節(jié)點已經(jīng)主觀下線,如果達到指定數(shù)量,則哨兵會認為其客觀下線,此時各哨兵節(jié)點會進行協(xié)商,選舉出一個領(lǐng)導者哨兵節(jié)點,并由該領(lǐng)導者哨兵節(jié)點對其進行故障轉(zhuǎn)移操作。
領(lǐng)導者哨兵節(jié)點執(zhí)行故障恢復(fù)可以保證同一時間內(nèi)只有一個哨兵節(jié)點在執(zhí)行故障恢復(fù),避免多個節(jié)點同時操作。選舉領(lǐng)導者哨兵的過程適用了 Raft 算法,具體的過程如下:
- 發(fā)現(xiàn)主節(jié)點客觀下線的哨兵節(jié)點(簡稱為A)向每個哨兵節(jié)點發(fā)送命令要求對方選自己成為領(lǐng)導者哨兵。
- 如果目標哨兵節(jié)點沒有選過其他哨兵,則會同意將A設(shè)置為領(lǐng)導者哨兵。
- 如果A發(fā)現(xiàn)有超過一半并且超過 quorum 參數(shù)值的哨兵節(jié)點同意選自己成為領(lǐng)導者哨兵,那么A將成為領(lǐng)導者哨兵。
- 當有多個哨兵同時參選時,有可能會出現(xiàn)沒有任何節(jié)點當選的可能。如果出現(xiàn)此種情況,那么會等待一個隨機時間重新開始下一輪參選,直到選出領(lǐng)導者哨兵為止。
選出領(lǐng)導者哨兵后,領(lǐng)導者哨兵會對主節(jié)點進行故障轉(zhuǎn)移恢復(fù)?;謴?fù)過程可以分為以下3個步驟:
- 在所有從節(jié)點中挑選一個節(jié)點作為新的主節(jié)點。挑選的基準是,首先過濾掉不健康的從節(jié)點;然后選擇優(yōu)先級最高的從節(jié)點;如果優(yōu)先級無法區(qū)分,則選擇賦值偏移量最大的從節(jié)點,如果仍無法區(qū)分,則選擇runid 最小的從節(jié)點。
- 更新主從狀態(tài)。通過 slaveof no one 命令,讓選出來的從節(jié)點成為主節(jié)點,通過 slaveof 命令讓其他節(jié)點成為其從節(jié)點。
- 將已經(jīng)停止服務(wù)的舊的主節(jié)點更新為新的主節(jié)點的從節(jié)點,當此節(jié)點恢復(fù)后,能夠自動以從節(jié)點的身份繼續(xù)服務(wù)。
二、 實驗步驟
實驗需要環(huán)境
| 操作系統(tǒng) | 配置 | IP | 主機名 | 角色 |
| 0penEuler24 | 2C4G | 192.168.10.104 | sentine101 | 哨兵節(jié)點 |
| 0penEuler24 | 2C4G | 192.168.10.105 | sentine102 | 哨兵節(jié)點 |
| 0penEuler24 | 2C4G | 192.168.10.106 | sentine103 | 哨兵節(jié)點 |
| 0penEuler24 | 2C4G | 192.168.10.101 | master | 主節(jié)點 |
| 0penEuler24 | 2C4G | 192.168.10.102 | slave0l | 從節(jié)點 |
| 0penEuler24 | 2C4G | 192.168.10.103 | slave02 | 從節(jié)點 |
1. 基礎(chǔ)環(huán)境配置(所有節(jié)點)
(1) 關(guān)閉防火墻、SELinux。
systemctl stop firewalld systemctl disable firewalld
(2) 設(shè)置主機名
- 主節(jié)點
hostnamectl set-hostname master
- 從節(jié)點 1
hostnamectl set-hostname slave01
- 從節(jié)點 2
hostnamectl set-hostname slave02
- 哨兵節(jié)點 1
hostnamectl set-hostname sentine101
- 哨兵節(jié)點 2
hostnamectl set-hostname sentine102
- 哨兵節(jié)點 3
hostnamectl set-hostname sentine103
2. 部署 Redis 主從集群
操作節(jié)點:master、slave01、slave02
2.1 Redis 服務(wù)安裝(通用步驟,三節(jié)點均執(zhí)行)
# 安裝編譯依賴 yum -y install gcc zlib-devel # 解壓&編譯安裝 tar -zxvf redis-6.2.4.tar.gz -C /usr/src/ cd /usr/src/redis-6.2.4/ make && make PREFIX=/usr/local/redis install # 配置軟鏈接 ln -s /usr/local/redis/bin/* /usr/local/bin/ # 準備配置文件目錄 mkdir /etc/redis cp /usr/src/redis-6.2.4/redis.conf /etc/redis/6379.conf
2.2 編寫 Systemd 服務(wù)腳本(通用步驟,三節(jié)點均執(zhí)行)
cat > /etc/systemd/system/redis.service << EOF [Unit] Description=Redis After=network.target [Service] Type=forking ExecStart=/usr/local/redis/bin/redis-server /etc/redis/6379.conf [Install] WantedBy=multi-user.target EOF
2.3 修改 Redis 配置文件(分節(jié)點)
(1)主節(jié)點
vim /etc/redis/6379.conf # 修改內(nèi)容: bind 127.0.0.1 192.168.10.101 port 6379 daemonize yes pidfile /var/run/redis_6379.pid loglevel notice logfile "/var/log/redis_6379.log" # 啟動服務(wù) systemctl daemon-reload systemctl start redis systemctl enable redis # 驗證端口 netstat -anpt | grep 6379
(2)從節(jié)點 1
vim /etc/redis/6379.conf # 修改內(nèi)容: bind 127.0.0.1 192.168.10.102 port 6379 daemonize yes pidfile /var/run/redis_6379.pid loglevel notice logfile "/var/log/redis_6379.log" # 啟動服務(wù) systemctl daemon-reload systemctl start redis systemctl enable redis # 驗證端口 netstat -anpt | grep 6379
(3)從節(jié)點 2
vim /etc/redis/6379.conf # 修改內(nèi)容: bind 127.0.0.1 192.168.10.103 port 6379 daemonize yes pidfile /var/run/redis_6379.pid loglevel notice logfile "/var/log/redis_6379.log" # 啟動服務(wù) systemctl daemon-reload systemctl start redis systemctl enable redis # 驗證端口 netstat -anpt | grep 6379
2.4 配置主從關(guān)系(從節(jié)點:slave01、slave02)
vim /etc/redis/6379.conf # 添加: replicaof 192.168.10.101 6379 # 重啟生效 systemctl restart redis
2.5 驗證主從狀態(tài)
(1) 主節(jié)點驗證
redis-cli 127.0.0.1:6379> info replication # 預(yù)期:role=master,connected_slaves=2(slave01、slave02)
(2) 從節(jié)點驗證
redis-cli 127.0.0.1:6379> info replication # 預(yù)期:role=slave,master_host=192.168.10.101,master_link_status=up
3. 部署 Redis 哨兵集群
操作節(jié)點:sentine101、sentine102、sentine103(步驟相同,以sentine101為例)
3.1 哨兵服務(wù)安裝(通用步驟,三節(jié)點均執(zhí)行)
# 安裝依賴(若未裝) yum -y install gcc gcc-c++ make # 解壓&編譯(同主從) tar -zxvf redis-6.2.4.tar.gz -C /usr/src/ cd /usr/src/redis-6.2.4/ make && make install # 準備配置文件 mkdir /etc/redis cp /usr/src/redis-6.2.4/redis.conf /etc/redis/6379.conf
3.2 修改哨兵配置文件(分節(jié)點,三節(jié)點均執(zhí)行)
vim /etc/redis/6379.conf # 添加: sentinel monitor master 192.168.10.101 6379 2 # 監(jiān)控主節(jié)點,quorum=2 bind 0.0.0.0 # 允許所有IP通信 daemonize yes # 后臺運行
3.3 編寫哨兵 Sytemd 服務(wù)腳本(通用步驟,三節(jié)點均執(zhí)行)
cat > /etc/systemd/system/redis.service << EOF [Unit] Description=Redis After=network.target [Service] Type=forking ExecStart=/usr/local/bin/redis-sentinel /etc/redis/6379.conf # 啟動哨兵 [Install] WantedBy=multi-user.target EOF
3.4 啟動哨兵服務(wù)(三節(jié)點均執(zhí)行)
systemctl daemon-reload systemctl start redis systemctl enable redis # 驗證進程(查看redis-sentinel) ps aux | grep redis # 預(yù)期:/usr/local/bin/redis-sentinel 0.0.0.0:6379 [sentinel]
3.5 查看哨兵狀態(tài)(任意哨兵節(jié)點執(zhí)行)
redis-cli 127.0.0.1:6379> info sentinel # 預(yù)期:sentinel_masters=1,master0=192.168.10.101:6379,slaves=2,sentinels=3
3.6 故障轉(zhuǎn)移測試 (模擬主節(jié)點故障)
(1) 停止主節(jié)點服務(wù)
systemctl stop redis
(2) 觀察哨兵自動切換
redis-cli 127.0.0.1:6379> info sentinel # 預(yù)期:原主節(jié)點降級為從,某從節(jié)點(slave01/slave02)升級為主
關(guān)鍵注意事項:
- 主機名一致性:確保所有哨兵節(jié)點的主機名嚴格為
sentine101、sentine102、sentine103,避免拼寫錯誤。 - IP 映射:所有配置中涉及主節(jié)點 IP 的地方(如
replicaof、sentinel monitor),必須替換為192.168.10.101。 - 服務(wù)腳本區(qū)分:Redis 主從和哨兵的 Systemd 腳本名稱均為
redis.service,但啟動命令不同(主從用redis-server,哨兵用redis-sentinel),需注意區(qū)分。
按此步驟執(zhí)行,即可完成 主機名修正后 的 Redis 主從 + 哨兵集群部署。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Redis使用ZSET實現(xiàn)消息隊列使用小結(jié)
這篇文章主要介紹了Redis使用ZSET實現(xiàn)消息隊列使用總結(jié),本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-03-03

