# Redis中哨兵的原理是什么
## 一、哨兵模式概述
Redis Sentinel(哨兵)是Redis官方提供的高可用性(HA)解決方案,主要用于管理Redis主從架構中的故障自動轉移。哨兵系統本質上是一個分布式系統,由多個Sentinel節點組成,共同監控Redis主從節點的健康狀態,并在主節點故障時自動完成故障檢測和轉移。
### 1.1 基本功能
- **監控**:持續檢查主從節點是否正常運行
- **通知**:當被監控節點出現問題時向管理員報警
- **自動故障轉移**:主節點故障時自動將從節點升級為主節點
- **配置提供者**:為客戶端提供服務發現功能
### 1.2 典型架構
+————+ +————+ +————+ | Sentinel 1 |<—–>| Sentinel 2 |<—–>| Sentinel 3 | +————+ +————+ +————+ | | | v v v +————+ +————+ +————+ | Master |<—–>| Replica 1 |<—–>| Replica 2 | +————+ +————+ +————+
## 二、核心工作原理
### 2.1 監控機制
#### 2.1.1 定期檢查
每個Sentinel節點以每秒一次的頻率向所有主從節點和其他Sentinel節點發送PING命令:
```python
def sentinel_ping():
while True:
for node in monitored_nodes:
response = send_ping(node)
if not response or response.timeout:
mark_node_as_down(node)
sleep(1)
當Sentinel節點發現某節點超過down-after-milliseconds(默認30秒)未響應,會將該節點標記為”主觀下線”。
當足夠數量的Sentinel(由quorum參數決定)都將某主節點標記為主觀下線時,該節點會被標記為”客觀下線”。
SENTINEL is-master-down-by-addr命令請求成為領導者領導者Sentinel根據以下規則選擇新主節點:
1. 排除不健康的從節點(連接斷開、響應慢等)
2. 優先選擇slave-priority高的從節點
3. 選擇復制偏移量(repl_offset)最大的從節點
4. 選擇run_id字典序最小的節點(最終裁決條件)
SLAVEOF NO ONE命令INFO命令確認其已切換為主節點SLAVEOF命令指向新主節點哨兵通過發布/訂閱功能自動傳播配置變更:
# 訂閱所有哨兵消息
PSUBSCRIBE *
當故障轉移完成后,哨兵會在__sentinel__:hello頻道發布新主節點信息,所有客戶端和哨兵都會收到更新。
每個Sentinel與每個Redis節點建立兩個連接:
- 命令連接:用于發送PING等命令
- 訂閱連接:用于接收__sentinel__:hello頻道的消息
Sentinel節點間通過Gossip協議交換信息:
1. 每2秒通過SENTINEL hello命令向監控同一主節點的其他Sentinel廣播信息
2. 信息包含:
- Sentinel自身信息
- 主節點信息
- 其他已知Sentinel信息
{
"src_sentinel_id": "a1b2c3d4",
"src_ip": "10.0.0.1",
"src_port": 26379,
"master_name": "mymaster",
"master_ip": "10.0.0.5",
"master_port": 6379,
"master_config_epoch": 12
}
# sentinel.conf示例
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
參數說明:
- quorum:判定客觀下線所需哨兵數量
- down-after-milliseconds:判定主觀下線的超時時間
- parallel-syncs:故障轉移后同時同步的從節點數
- failover-timeout:故障轉移超時時間(毫秒)
哨兵會自動重寫配置文件以保存當前狀態:
+------------------------+
| 原始配置文件 |
| sentinel monitor ... |
+------------------------+
|
v
+------------------------+
| 運行時內存配置 |
| master1: { |
| ip: 10.0.0.1, |
| port: 6379, |
| slaves: [...] } |
+------------------------+
|
v
+------------------------+
| 重寫后的配置文件 |
| sentinel known-slave...|
| sentinel config-epoch...|
+------------------------+
SENTINEL get-master-addr-by-name命令當發生故障轉移時:
// 偽代碼示例
try {
executeCommand();
} catch (ConnectionException e) {
// 重新查詢主節點地址
newMaster = sentinel.getMasterAddr();
reconnect(newMaster);
retryCommand();
}
down-after-milliseconds值(網絡環境決定)腦裂問題:
- 現象:網絡分區導致出現多個主節點
- 解決方案:配置min-slaves-to-write和min-slaves-max-lag
配置不一致:
- 定期檢查sentinel ckquorum命令輸出
- 使用sentinel flushconfig強制重寫配置
// redis-sentinel.c
struct sentinelState {
dict *masters; // 監控的主節點字典
int tilt; // 是否處于TILT模式
uint64_t current_epoch; // 當前配置紀元
};
struct sentinelRedisInstance {
int flags; // 角色標識(主/從/哨兵)
char *name; // 實例名稱
sentinelAddr *addr; // 網絡地址
dict *sentinels; // 監控同一主節點的其他哨兵
};
哨兵主要事件處理流程:
1. 定時執行sentinelTimer函數
2. 處理命令請求和網絡事件
3. 執行定期任務(PING、INFO收集等)
| 特性 | Sentinel模式 | Cluster模式 |
|---|---|---|
| 數據分片 | 不支持 | 支持 |
| 讀寫分離 | 支持 | 有限支持 |
| 故障檢測速度 | 秒級 | 秒級 |
| 客戶端復雜度 | 簡單 | 較復雜 |
| 擴展性 | 垂直擴展 | 水平擴展 |
Redis哨兵通過分布式監控、自動故障轉移和配置傳播機制,為Redis主從架構提供了完善的高可用解決方案。其核心價值在于:
在實際生產中,合理配置的哨兵系統可以將Redis的可用性提升到99.99%以上,是構建可靠Redis服務的基石。 “`
這篇文章共計約2500字,詳細介紹了Redis哨兵的原理、工作機制和實現細節,采用Markdown格式編寫,包含代碼塊、表格等元素,可直接用于技術文檔發布。需要調整字數或補充細節可隨時告知。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。