Redis搭建哨兵集群實踐
一、前言:為什么需要哨兵集群?
在生產(chǎn)環(huán)境中,單點 Redis 主節(jié)點一旦宕機,整個寫服務(wù)將中斷。
手動切換不僅慢(幾分鐘),還容易出錯。
Redis Sentinel(哨兵)集群 可以實現(xiàn):
- ? 自動監(jiān)控主從節(jié)點健康狀態(tài)
- ? 主節(jié)點宕機時自動選舉新主
- ? 通知客戶端更新連接地址
- ? 全程無需人工干預(yù)!
本文將帶你從零搭建一個 1 主 + 2 從 + 3 哨兵 的高可用 Redis 架構(gòu),并驗證故障轉(zhuǎn)移效果。
二、環(huán)境準(zhǔn)備
2.1 服務(wù)器規(guī)劃(可單機模擬)
| 角色 | IP 地址 | 端口 | 說明 |
|---|---|---|---|
| Master | 192.168.1.10 | 6379 | 主節(jié)點 |
| Slave1 | 192.168.1.11 | 6379 | 從節(jié)點1 |
| Slave2 | 192.168.1.12 | 6379 | 從節(jié)點2 |
| Sentinel1 | 192.168.1.10 | 26379 | 哨兵1(可與 Master 同機) |
| Sentinel2 | 192.168.1.11 | 26379 | 哨兵2(可與 Slave1 同機) |
| Sentinel3 | 192.168.1.12 | 26379 | 哨兵3(可與 Slave2 同機) |
單機測試:可在同一臺機器用不同端口模擬(如 6380、6381)
2.2 軟件要求
- Redis 6.0+(推薦 7.x)
- Linux / macOS(Windows 僅限 WSL)
三、第一步:搭建 Redis 主從復(fù)制
3.1 配置主節(jié)點(master.conf)
# /etc/redis/master.conf port 6379 bind 0.0.0.0 daemonize yes logfile "/var/log/redis/master.log" dir /var/lib/redis requirepass "your_strong_password" # 建議設(shè)置密碼
啟動主節(jié)點:
redis-server /etc/redis/master.conf
3.2 配置從節(jié)點(slave1.conf & slave2.conf)
# /etc/redis/slave1.conf port 6379 bind 0.0.0.0 daemonize yes logfile "/var/log/redis/slave1.log" dir /var/lib/redis # 關(guān)鍵:指向主節(jié)點 replicaof 192.168.1.10 6379 masterauth "your_strong_password" # 主節(jié)點密碼
注意:Redis 5.0+ 使用 replicaof 替代 slaveof
啟動兩個從節(jié)點:
redis-server /etc/redis/slave1.conf redis-server /etc/redis/slave2.conf
3.3 驗證主從同步
# 在主節(jié)點寫入 redis-cli -h 192.168.1.10 -a your_strong_password SET hello world # 在從節(jié)點讀取 redis-cli -h 192.168.1.11 GET hello # 應(yīng)返回 "world"
四、第二步:配置哨兵集群
4.1 創(chuàng)建哨兵配置文件(sentinel.conf)
所有哨兵節(jié)點使用相同配置(除日志路徑外)
# /etc/redis/sentinel.conf port 26379 bind 0.0.0.0 daemonize yes logfile "/var/log/redis/sentinel.log" dir /var/lib/redis # 監(jiān)控名為 mymaster 的主節(jié)點 # quorum=2:至少 2 個哨兵同意才判定主節(jié)點宕機 sentinel monitor mymaster 192.168.1.10 6379 2 # 主節(jié)點密碼(必須配置!) sentinel auth-pass mymaster your_strong_password # 判定主觀下線時間(毫秒) sentinel down-after-milliseconds mymaster 30000 # 故障轉(zhuǎn)移超時(毫秒) sentinel failover-timeout mymaster 180000 # 故障轉(zhuǎn)移后,并行同步從節(jié)點數(shù) sentinel parallel-syncs mymaster 1
關(guān)鍵參數(shù)說明:
mymaster:主節(jié)點邏輯名稱(客戶端通過此名稱查詢)quorum=2:3 節(jié)點集群中,需 2 個哨兵同意才觸發(fā) ODOWNauth-pass:必須配置,否則哨兵無法操作帶密碼的主節(jié)點
4.2 啟動三個哨兵節(jié)點
# 在三臺機器分別執(zhí)行 redis-sentinel /etc/redis/sentinel.conf
單機測試:復(fù)制三份配置,修改 port 為 26379/26380/26381,分別啟動
五、第三步:驗證哨兵集群狀態(tài)
5.1 查看哨兵監(jiān)控信息
redis-cli -p 26379 SENTINEL MASTER mymaster
關(guān)鍵字段:
num-slaves: 2(應(yīng)有 2 個從節(jié)點)num-other-sentinels: 2(其他哨兵數(shù)量)flags: 正常應(yīng)為master,宕機后變?yōu)?nbsp;odown, sdown
5.2 查看所有哨兵共識
redis-cli -p 26379 SENTINEL SENTINELS mymaster
→ 應(yīng)顯示另外兩個哨兵的信息
5.3 客戶端獲取主節(jié)點地址
redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster # 返回:1) "192.168.1.10" 2) "6379"
六、第四步:模擬故障轉(zhuǎn)移(實戰(zhàn)驗證)
6.1 手動停止主節(jié)點
# 在主節(jié)點機器執(zhí)行 redis-cli -a your_strong_password shutdown
6.2 觀察哨兵日志
# /var/log/redis/sentinel.log +sdown master mymaster 192.168.1.10 6379 # 主觀下線 +odown master mymaster ... # 客觀下線 +new-epoch 1 +try-failover master mymaster ... +vote-for-leader abc123 1 # 投票 +elected-leader master mymaster ... +failover-state-select-slave master mymaster ... +selected-slave slave 192.168.1.11:6379 # 選出新主 +failover-state-send-slaveof-noone ... +switch-master mymaster 192.168.1.10 6379 192.168.1.11 6379 # 切換完成!
6.3 驗證新主節(jié)點
# 查詢當(dāng)前主節(jié)點 redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster # 返回:1) "192.168.1.11" 2) "6379" # 寫入新主 redis-cli -h 192.168.1.11 -a your_strong_password SET test_key new_value # 從節(jié)點(原主恢復(fù)后)應(yīng)能同步 redis-cli -h 192.168.1.10 GET test_key # 若原主已重啟
6.4 原主恢復(fù)后自動變?yōu)閺墓?jié)點
重啟原主:
redis-server /etc/redis/master.conf
查看其角色:
redis-cli -h 192.168.1.10 ROLE # 返回:1) "slave" 2) "192.168.1.11" ...
? 成功!整個過程全自動,無需人工干預(yù)。
七、客戶端連接示例(Spring Boot)
# application.yml
spring:
redis:
sentinel:
master: mymaster
nodes:
- 192.168.1.10:26379
- 192.168.1.11:26379
- 192.168.1.12:26379
password: your_strong_password應(yīng)用會自動連接當(dāng)前主節(jié)點,切換時可能短暫報錯,重試即可。
八、生產(chǎn)環(huán)境最佳實踐
必須遵守
- 至少 3 個哨兵節(jié)點(部署在不同物理機/可用區(qū))
- 哨兵與 Redis 實例盡量分離部署(避免資源競爭)
- 主從節(jié)點必須設(shè)置密碼,并在哨兵中配置
auth-pass - 監(jiān)控哨兵日志與
+switch-master事件
推薦配置
down-after-milliseconds: 10000~30000(根據(jù)網(wǎng)絡(luò)質(zhì)量)quorum: 3 節(jié)點設(shè) 2,5 節(jié)點設(shè) 3- 從節(jié)點設(shè)置
replica-priority控制升主順序
九、常見問題排查
問題:哨兵無法發(fā)現(xiàn)從節(jié)點
- 原因:主節(jié)點未正確配置
replicaof,或網(wǎng)絡(luò)不通 - 解決:檢查
INFO REPLICATION輸出
問題:故障轉(zhuǎn)移后客戶端連不上
- 原因:客戶端未使用 Sentinel 模式,或未配置密碼
- 解決:確保使用
JedisSentinelPool或 Spring Boot Sentinel 配置
問題:哨兵日志報NOAUTH
- 原因:未配置
sentinel auth-pass - 解決:在
sentinel.conf中添加主節(jié)點密碼
十、總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Redis 操作多個數(shù)據(jù)庫的配置的方法實現(xiàn)
本文主要介紹了Redis 操作多個數(shù)據(jù)庫的配置的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
Caffeine實現(xiàn)類似redis的動態(tài)過期時間設(shè)置示例
這篇文章主要為大家介紹了Caffeine實現(xiàn)類似redis的動態(tài)過期時間示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08
阿里Tair分布式鎖與Redis分布式鎖的實現(xiàn)區(qū)別
本文給大家介紹阿里Tair分布式鎖與Redis分布式鎖的實現(xiàn)區(qū)別解析,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2026-04-04

