一、概述
1.1 背景介紹
Redis 主從復(fù)制解決了讀擴展和數(shù)據(jù)冗余問題,但主節(jié)點故障時需要人工介入切換,這在生產(chǎn)環(huán)境中是不可接受的。Sentinel(哨兵)模式在主從架構(gòu)之上增加了自動故障檢測和故障轉(zhuǎn)移能力,是 Redis 高可用的標準方案之一。
Sentinel 本質(zhì)上是一組獨立進程,持續(xù)監(jiān)控 Redis 主從節(jié)點的健康狀態(tài),在主節(jié)點不可用時自動完成新主節(jié)點選舉和客戶端重定向。Redis 8.x 對 Sentinel 的穩(wěn)定性和性能做了進一步優(yōu)化,但核心機制與 7.x 保持一致。
1.2 技術(shù)特點
自動故障轉(zhuǎn)移:主節(jié)點宕機后無需人工干預(yù),Sentinel 集群自動完成切換,通常在 30 秒內(nèi)完成
服務(wù)發(fā)現(xiàn):客戶端通過 Sentinel 獲取當前主節(jié)點地址,屏蔽了主從切換的地址變化
配置傳播:故障轉(zhuǎn)移完成后,Sentinel 自動更新所有從節(jié)點的復(fù)制配置
多 Sentinel 協(xié)作:通過 quorum 機制避免單點誤判,防止網(wǎng)絡(luò)抖動觸發(fā)不必要的切換
1.3 適用場景
數(shù)據(jù)量在單機可承載范圍內(nèi)(通常 < 100GB),不需要數(shù)據(jù)分片
對寫入可用性要求高,能接受切換期間約 30 秒的寫入中斷
讀寫比高,通過從節(jié)點分擔讀流量
不需要 Cluster 的水平擴展能力,但需要比單主更高的可用性
1.4 環(huán)境要求
| 組件 | 版本要求 | 說明 |
|---|---|---|
| Redis | 8.x | 主從節(jié)點和 Sentinel 版本保持一致 |
| 操作系統(tǒng) | Linux(內(nèi)核 4.x+) | 需要穩(wěn)定的網(wǎng)絡(luò)棧 |
| 節(jié)點數(shù)量 | 最少 3 個 Sentinel | 保證 quorum 投票的奇數(shù)原則 |
| 網(wǎng)絡(luò)延遲 | < 10ms(Sentinel 節(jié)點間) | 延遲過高影響故障檢測準確性 |
二、詳細步驟
2.1 Sentinel 工作原理
2.1.1 主觀下線與客觀下線
理解這兩個概念是正確配置 Sentinel 的基礎(chǔ)。
主觀下線(SDOWN,Subjectively Down):單個 Sentinel 實例認為某節(jié)點不可用。判斷依據(jù)是在down-after-milliseconds時間內(nèi)沒有收到節(jié)點的有效響應(yīng)(PING 返回 PONG 或錯誤響應(yīng))。SDOWN 只是單個 Sentinel 的主觀判斷,不會觸發(fā)故障轉(zhuǎn)移。
客觀下線(ODOWN,Objectively Down):多個 Sentinel 實例都認為主節(jié)點不可用,且達到 quorum 數(shù)量。只有主節(jié)點才有 ODOWN 狀態(tài),從節(jié)點和 Sentinel 節(jié)點只有 SDOWN。ODOWN 是觸發(fā)故障轉(zhuǎn)移的前提條件。
Sentinel A: PING master → 無響應(yīng) → 標記 master SDOWN Sentinel A: 詢問 Sentinel B、C →"你們也認為 master 掛了嗎?" Sentinel B:"是的,我也收不到響應(yīng)" Sentinel C:"我也是" 達到 quorum=2 → Sentinel A 標記 master ODOWN → 開始 Leader 選舉
2.1.2 故障轉(zhuǎn)移流程
Leader 選舉:Sentinel 集群通過 Raft 協(xié)議選出一個 Leader,由 Leader 負責執(zhí)行故障轉(zhuǎn)移
新主節(jié)點選擇:Leader 從可用從節(jié)點中按以下優(yōu)先級選擇新主節(jié)點:
replica-priority(slave-priority)值最小的優(yōu)先(0 表示永不成為主節(jié)點)
復(fù)制偏移量最大的優(yōu)先(數(shù)據(jù)最新)
Run ID 字典序最小的優(yōu)先(決勝條件)
執(zhí)行切換:向選中的從節(jié)點發(fā)送REPLICAOF NO ONE,使其成為新主節(jié)點
重新配置:通知其他從節(jié)點復(fù)制新主節(jié)點,更新 Sentinel 配置文件
通知客戶端:通過 Pub/Sub 頻道+switch-master發(fā)布切換事件
2.2 3節(jié)點 Sentinel 集群配置
2.2.1 節(jié)點規(guī)劃
節(jié)點角色 IP 端口 Redis 主節(jié)點 10.0.1.10 6379 Redis 從節(jié)點1 10.0.1.11 6379 Redis 從節(jié)點2 10.0.1.12 6379 Sentinel 1 10.0.1.10 26379 Sentinel 2 10.0.1.11 26379 Sentinel 3 10.0.1.12 26379
Sentinel 和 Redis 節(jié)點共用機器是常見的部署方式,節(jié)省資源。但要確保 Sentinel 進程和 Redis 進程的故障是獨立的——Redis 掛了不代表 Sentinel 也掛。
2.2.2 Redis 主節(jié)點配置
# 文件路徑:/etc/redis/redis.conf(主節(jié)點 10.0.1.10) bind 10.0.1.10 127.0.0.1 port 6379 daemonize yes pidfile /var/run/redis/redis-server.pid logfile /var/log/redis/redis-server.log dir /var/lib/redis # 持久化配置 save 900 1 save 300 10 save 60 10000 appendonly yes appendfsync everysec # 認證密碼(主從和 Sentinel 必須一致) requirepass "Redis@Secure2024!" masterauth "Redis@Secure2024!" # 內(nèi)存配置 maxmemory 8gb maxmemory-policy allkeys-lru # 腦裂防護:至少 1 個從節(jié)點同步才接受寫入 min-replicas-to-write 1 min-replicas-max-lag 10
2.2.3 Redis 從節(jié)點配置
# 文件路徑:/etc/redis/redis.conf(從節(jié)點 10.0.1.11 和 10.0.1.12) bind 10.0.1.11 127.0.0.1 # 10.0.1.12 節(jié)點改為對應(yīng) IP port 6379 daemonize yes logfile /var/log/redis/redis-server.log dir /var/lib/redis # 指定主節(jié)點 replicaof 10.0.1.10 6379 # 認證 requirepass "Redis@Secure2024!" masterauth "Redis@Secure2024!" # 從節(jié)點只讀(默認已是 yes,顯式聲明更清晰) replica-read-only yes # 從節(jié)點優(yōu)先級(數(shù)值越小越優(yōu)先成為新主節(jié)點) # 10.0.1.11 設(shè)為 100,10.0.1.12 設(shè)為 200,優(yōu)先選 .11 作為新主 replica-priority 100 # 持久化 appendonly yes appendfsync everysec
2.2.4 Sentinel 配置
三個 Sentinel 節(jié)點使用相同的配置文件,只有bind地址不同:
# 文件路徑:/etc/redis/sentinel.conf # 三個節(jié)點分別修改 bind 為各自 IP bind 10.0.1.10 127.0.0.1 # 節(jié)點1;節(jié)點2改為10.0.1.11;節(jié)點3改為10.0.1.12 port 26379 daemonize yes pidfile /var/run/redis/redis-sentinel.pid logfile /var/log/redis/sentinel.log dir /var/lib/redis # 監(jiān)控主節(jié)點,quorum=2 表示需要 2 個 Sentinel 同意才能觸發(fā)故障轉(zhuǎn)移 sentinel monitor mymaster 10.0.1.10 6379 2 # 主節(jié)點認證密碼 sentinel auth-pass mymaster Redis@Secure2024! # 主節(jié)點超過 5000ms 無響應(yīng),標記為 SDOWN sentinel down-after-milliseconds mymaster 5000 # 故障轉(zhuǎn)移超時時間:3 分鐘內(nèi)未完成則認為失敗 sentinel failover-timeout mymaster 180000 # 故障轉(zhuǎn)移后,同時向新主節(jié)點同步的從節(jié)點數(shù)量 # 設(shè)為 1 表示逐個同步,避免所有從節(jié)點同時不可讀 sentinel parallel-syncs mymaster 1 # Sentinel 自身的訪問密碼(Redis 6.2+ 支持) requirepass "Sentinel@Secure2024!" sentinel sentinel-pass Sentinel@Secure2024!
2.2.5 啟動順序
# 1. 先啟動主節(jié)點 systemctl start redis-server # 10.0.1.10 # 2. 啟動從節(jié)點 systemctl start redis-server # 10.0.1.11 和 10.0.1.12 # 3. 驗證主從復(fù)制狀態(tài) redis-cli -h 10.0.1.10 -p 6379 -a'Redis@Secure2024!'info replication # 預(yù)期輸出關(guān)鍵字段: # role:master # connected_slaves:2 # slave0:ip=10.0.1.11,port=6379,state=online,offset=xxx,lag=0 # slave1:ip=10.0.1.12,port=6379,state=online,offset=xxx,lag=0 # 4. 啟動 Sentinel(三個節(jié)點都要啟動) redis-sentinel /etc/redis/sentinel.conf # 或 systemctl start redis-sentinel # 5. 驗證 Sentinel 狀態(tài) redis-cli -h 10.0.1.10 -p 26379 -a'Sentinel@Secure2024!'sentinel masters
2.3 驗證故障轉(zhuǎn)移
# 模擬主節(jié)點故障 redis-cli -h 10.0.1.10 -p 6379 -a'Redis@Secure2024!'DEBUG sleep 30 # 在另一個終端觀察 Sentinel 日志 tail -f /var/log/redis/sentinel.log # 預(yù)期日志序列: # +sdown master mymaster 10.0.1.10 6379 # +odown master mymaster 10.0.1.10 6379#quorum2/2 # +try-failover master mymaster 10.0.1.10 6379 # +elected-leader master mymaster 10.0.1.10 6379 # +selected-slave slave 10.0.1.11:6379 mymaster 10.0.1.10 6379 # +promoted-slave slave 10.0.1.11:6379 mymaster 10.0.1.10 6379 # +switch-master mymaster 10.0.1.10 6379 10.0.1.11 6379 # 故障轉(zhuǎn)移完成后,查詢新主節(jié)點 redis-cli -h 10.0.1.10 -p 26379 -a'Sentinel@Secure2024!'sentinel get-master-addr-by-name mymaster
三、示例代碼和配置
3.1 客戶端接入 Sentinel
客戶端不能直連 Redis 主節(jié)點 IP,必須通過 Sentinel 獲取當前主節(jié)點地址,否則主從切換后客戶端無法自動重連。
3.1.1 Python(redis-py)
importredis
fromredis.sentinelimportSentinel
# 連接 Sentinel 集群
sentinel = Sentinel(
[
('10.0.1.10',26379),
('10.0.1.11',26379),
('10.0.1.12',26379),
],
socket_timeout=0.5,
sentinel_kwargs={'password':'Sentinel@Secure2024!'}
)
# 獲取主節(jié)點連接(自動處理故障轉(zhuǎn)移后的地址變更)
master = sentinel.master_for(
'mymaster',
socket_timeout=0.5,
password='Redis@Secure2024!',
db=0,
retry_on_timeout=True
)
# 獲取從節(jié)點連接(讀操作)
slave = sentinel.slave_for(
'mymaster',
socket_timeout=0.5,
password='Redis@Secure2024!',
db=0
)
# 寫操作走主節(jié)點
master.set('key','value', ex=3600)
# 讀操作走從節(jié)點
value = slave.get('key')
3.1.2 Java(Jedis)
importredis.clients.jedis.JedisSentinelPool; importredis.clients.jedis.Jedis; importredis.clients.jedis.JedisPoolConfig; importjava.util.HashSet; importjava.util.Set; // 配置連接池 JedisPoolConfig poolConfig =newJedisPoolConfig(); poolConfig.setMaxTotal(50); poolConfig.setMaxIdle(10); poolConfig.setMinIdle(5); poolConfig.setTestOnBorrow(true); // Sentinel 節(jié)點集合 Setsentinels =newHashSet<>(); sentinels.add("10.0.1.10:26379"); sentinels.add("10.0.1.11:26379"); sentinels.add("10.0.1.12:26379"); // 創(chuàng)建 Sentinel 連接池 JedisSentinelPool sentinelPool =newJedisSentinelPool( "mymaster", sentinels, poolConfig, 2000, // connectionTimeout 2000, // soTimeout "Redis@Secure2024!", // Redis 密碼 0, // database null, // clientName 0, // sentinelConnectionTimeout 0, // sentinelSoTimeout "Sentinel@Secure2024!", // Sentinel 密碼 null // sentinelClientName ); // 使用連接 try(Jedis jedis = sentinelPool.getResource()) { jedis.set("key","value"); String value = jedis.get("key"); }
3.2 Sentinel 監(jiān)控腳本
#!/bin/bash
# 文件名:/opt/redis/scripts/sentinel_check.sh
# 功能:檢查 Sentinel 集群健康狀態(tài),輸出關(guān)鍵指標
SENTINEL_HOSTS=("10.0.1.10""10.0.1.11""10.0.1.12")
SENTINEL_PORT=26379
SENTINEL_PASS="Sentinel@Secure2024!"
MASTER_NAME="mymaster"
echo"===== Sentinel 集群狀態(tài)檢查 ====="
echo"時間:$(date)"
echo""
# 檢查每個 Sentinel 節(jié)點
forhostin"${SENTINEL_HOSTS[@]}";do
echo"--- Sentinel:${host}:${SENTINEL_PORT}---"
# 獲取當前主節(jié)點地址
master_info=$(redis-cli -h"${host}"-p"${SENTINEL_PORT}"
-a"${SENTINEL_PASS}"--no-auth-warning
sentinel get-master-addr-by-name"${MASTER_NAME}"2>/dev/null)
if[ $? -eq 0 ];then
master_ip=$(echo"${master_info}"| head -1)
master_port=$(echo"${master_info}"| tail -1)
echo" 當前主節(jié)點:${master_ip}:${master_port}"
else
echo" [ERROR] 無法連接 Sentinel"
continue
fi
# 獲取 Sentinel 詳細信息
sentinel_info=$(redis-cli -h"${host}"-p"${SENTINEL_PORT}"
-a"${SENTINEL_PASS}"--no-auth-warning
sentinel masters 2>/dev/null)
# 提取關(guān)鍵字段
num_slaves=$(echo"${sentinel_info}"| grep -A1"num-slaves"| tail -1)
num_sentinels=$(echo"${sentinel_info}"| grep -A1"num-other-sentinels"| tail -1)
quorum=$(echo"${sentinel_info}"| grep -A1"quorum"| tail -1)
flags=$(echo"${sentinel_info}"| grep -A1"^flags$"| tail -1)
echo" 從節(jié)點數(shù)量:${num_slaves}"
echo" 其他 Sentinel 數(shù)量:${num_sentinels}"
echo" Quorum:${quorum}"
echo" 主節(jié)點狀態(tài):${flags}"
echo""
done
3.3 腦裂防護配置詳解
腦裂(Split-Brain)是 Sentinel 模式最危險的場景:主節(jié)點因網(wǎng)絡(luò)分區(qū)與 Sentinel 失聯(lián),Sentinel 誤判主節(jié)點宕機并選出新主節(jié)點,此時集群中存在兩個主節(jié)點,客戶端寫入數(shù)據(jù)后,網(wǎng)絡(luò)恢復(fù)時舊主節(jié)點的數(shù)據(jù)會被覆蓋丟失。
# 在主節(jié)點 redis.conf 中配置 # 含義:至少有 1 個從節(jié)點在線且復(fù)制延遲不超過 10 秒,才接受寫入 # 當主節(jié)點與所有從節(jié)點斷開(網(wǎng)絡(luò)分區(qū)場景),主節(jié)點自動拒絕寫入 min-replicas-to-write 1 min-replicas-max-lag 10
這個配置的代價是:當從節(jié)點全部宕機或網(wǎng)絡(luò)延遲超過 10 秒時,主節(jié)點會拒絕寫入,業(yè)務(wù)會報錯。這是一個可用性和一致性之間的權(quán)衡,對數(shù)據(jù)一致性要求高的場景(金融、訂單)應(yīng)該開啟,對可用性優(yōu)先的場景(緩存、會話)可以不開啟。
四、最佳實踐和注意事項
4.1 最佳實踐
4.1.1 Sentinel 節(jié)點部署
奇數(shù)原則:Sentinel 節(jié)點數(shù)量必須是奇數(shù)(3、5、7),quorum 設(shè)為(n/2)+1。3 節(jié)點集群 quorum=2,允許 1 個 Sentinel 故障;5 節(jié)點集群 quorum=3,允許 2 個故障。不要部署 2 個 Sentinel,quorum=2 時任意一個故障都會導(dǎo)致無法完成故障轉(zhuǎn)移。
跨機架部署:3 個 Sentinel 節(jié)點分布在 3 個不同的物理機架或可用區(qū),避免單機架故障導(dǎo)致 Sentinel 集群失去 quorum。
Sentinel 與 Redis 分離:資源充足時,Sentinel 進程部署在獨立機器上,避免 Redis 進程消耗大量內(nèi)存時影響 Sentinel 的心跳響應(yīng)。
4.1.2 故障轉(zhuǎn)移參數(shù)調(diào)優(yōu)
down-after-milliseconds直接決定故障檢測速度和誤判率之間的平衡:
設(shè)置過小(< 3000ms):網(wǎng)絡(luò)抖動、GC 停頓、系統(tǒng)負載高峰都可能觸發(fā)誤判
設(shè)置過大(> 30000ms):真實故障的檢測時間過長,業(yè)務(wù)中斷時間延長
推薦值:5000-10000ms,結(jié)合業(yè)務(wù)對中斷時間的容忍度決定
4.1.3 持久化配置
Sentinel 模式下主從節(jié)點都應(yīng)開啟 AOF 持久化,appendfsync設(shè)為everysec。如果主節(jié)點關(guān)閉持久化,主節(jié)點重啟后會以空數(shù)據(jù)集啟動,從節(jié)點同步后數(shù)據(jù)全部丟失——這是一個經(jīng)典的數(shù)據(jù)丟失場景。
4.2 注意事項
4.2.1 配置注意事項
警告:Sentinel 在完成故障轉(zhuǎn)移后會自動修改sentinel.conf文件。如果用配置管理工具(Ansible、Chef)管理該文件,必須排除 Sentinel 自動寫入的字段,否則下次配置推送會覆蓋 Sentinel 的狀態(tài)記錄,導(dǎo)致集群狀態(tài)混亂。
不要在 Sentinel 運行時手動編輯sentinel.conf
主從節(jié)點的requirepass和masterauth必須設(shè)置為相同的密碼
故障轉(zhuǎn)移完成后,原主節(jié)點恢復(fù)時會自動降級為從節(jié)點,不需要手動干預(yù)
4.2.2 常見錯誤
| 錯誤現(xiàn)象 | 原因分析 | 解決方案 |
|---|---|---|
| Sentinel 持續(xù)出現(xiàn)+sdown但不觸發(fā)故障轉(zhuǎn)移 | quorum 未達到,部分 Sentinel 節(jié)點無法通信 | 檢查 Sentinel 節(jié)點間的網(wǎng)絡(luò)連通性和防火墻規(guī)則 |
| 故障轉(zhuǎn)移后客戶端仍連接舊主節(jié)點 | 客戶端硬編碼了主節(jié)點 IP | 改造客戶端使用 Sentinel 連接池 |
| 從節(jié)點復(fù)制延遲持續(xù)增大 | 主節(jié)點寫入量超過從節(jié)點同步能力 | 增大repl_backlog_size,檢查網(wǎng)絡(luò)帶寬 |
| Sentinel 選舉超時,故障轉(zhuǎn)移失敗 | failover-timeout 設(shè)置過小 | 增大failover-timeout,檢查 Sentinel 節(jié)點網(wǎng)絡(luò) |
4.3 Sentinel vs Cluster 選型
選 Sentinel 的場景:數(shù)據(jù)量在單機內(nèi)存范圍內(nèi)、寫入 QPS < 10 萬、需要強一致的 Lua 腳本或事務(wù)操作。
選 Cluster 的場景:數(shù)據(jù)量超過單機內(nèi)存、寫入 QPS 超過單主節(jié)點瓶頸、需要線性擴展寫入能力。
五、故障排查和監(jiān)控
5.1 故障排查
5.1.1 日志查看
# 實時查看 Sentinel 日志 tail -f /var/log/redis/sentinel.log # 查看最近的故障轉(zhuǎn)移記錄 grep"switch-master|failover|odown"/var/log/redis/sentinel.log | tail -50 # 查看主節(jié)點復(fù)制狀態(tài) redis-cli -h 10.0.1.10 -p 6379 -a'Redis@Secure2024!'info replication # 查看復(fù)制延遲(lag 字段,單位秒) redis-cli -h 10.0.1.10 -p 6379 -a'Redis@Secure2024!' info replication | grep"slave[0-9]"
5.1.2 常見問題排查
問題一:Sentinel 無法發(fā)現(xiàn)從節(jié)點
# 檢查 Sentinel 已知的從節(jié)點列表 redis-cli -h 10.0.1.10 -p 26379 -a'Sentinel@Secure2024!' sentinel slaves mymaster # Sentinel 通過主節(jié)點的 INFO 命令發(fā)現(xiàn)從節(jié)點 # 如果從節(jié)點未出現(xiàn),檢查從節(jié)點的 replicaof 配置是否正確 redis-cli -h 10.0.1.11 -p 6379 -a'Redis@Secure2024!'info replication
問題二:故障轉(zhuǎn)移后舊主節(jié)點無法加入集群
# 舊主節(jié)點恢復(fù)后,檢查其角色 redis-cli -h 10.0.1.10 -p 6379 -a'Redis@Secure2024!'info replication # 如果仍顯示 role:master,手動設(shè)置為從節(jié)點 redis-cli -h 10.0.1.10 -p 6379 -a'Redis@Secure2024!' replicaof 10.0.1.11 6379
5.2 性能監(jiān)控
5.2.1 監(jiān)控指標說明
| 指標名稱 | 正常范圍 | 告警閾值 | 說明 |
|---|---|---|---|
| 復(fù)制延遲(lag) | 0-1 秒 | > 10 秒 | 從節(jié)點數(shù)據(jù)落后主節(jié)點的時間 |
| connected_slaves | 等于從節(jié)點數(shù) | < 預(yù)期數(shù)量 | 在線從節(jié)點數(shù)量 |
| Sentinel 響應(yīng)時間 | < 5ms | > 100ms | Sentinel 進程健康狀態(tài) |
| master_last_io_seconds_ago | < 5 | > 30 | 主從最后通信時間間隔 |
| repl_backlog_active | 1 | 0 | 復(fù)制積壓緩沖區(qū)是否活躍 |
5.3 備份與恢復(fù)
#!/bin/bash
# 從從節(jié)點備份,避免影響主節(jié)點性能
SLAVE_HOST="10.0.1.11"
REDIS_PASS="Redis@Secure2024!"
BACKUP_DIR="/opt/redis/backups"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p"${BACKUP_DIR}"
# 觸發(fā)從節(jié)點 BGSAVE
redis-cli -h"${SLAVE_HOST}"-p 6379 -a"${REDIS_PASS}"--no-auth-warning BGSAVE
# 等待完成
sleep 5
# 復(fù)制 RDB 文件
cp /var/lib/redis/dump.rdb"${BACKUP_DIR}/dump_${DATE}.rdb"
echo"備份完成:${BACKUP_DIR}/dump_${DATE}.rdb"
# 保留最近 7 天
find"${BACKUP_DIR}"-name"dump_*.rdb"-mtime +7 -delete
六、總結(jié)
6.1 技術(shù)要點回顧
SDOWN vs ODOWN:單個 Sentinel 的主觀判斷不觸發(fā)切換,需要達到 quorum 數(shù)量的 Sentinel 共同確認才進入客觀下線狀態(tài)
quorum 配置:3 節(jié)點集群設(shè)為 2,是可用性和防誤判的最佳平衡點
腦裂防護:min-replicas-to-write讓主節(jié)點在網(wǎng)絡(luò)分區(qū)時主動拒絕寫入,避免數(shù)據(jù)丟失
客戶端接入:必須通過 Sentinel 發(fā)現(xiàn)主節(jié)點地址,不能硬編碼 Redis 主節(jié)點 IP
replica-priority:通過優(yōu)先級控制故障轉(zhuǎn)移時的新主節(jié)點選擇
6.2 進階學習方向
Redis Cluster:當單主節(jié)點無法承載數(shù)據(jù)量或?qū)懭雺毫r,Cluster 是下一步演進方向
Sentinel 與 Proxy 結(jié)合:在 Sentinel 前部署 Twemproxy 或 Codis,對客戶端屏蔽 Sentinel 發(fā)現(xiàn)邏輯
Redis 持久化深度優(yōu)化:AOF rewrite 策略、RDB 與 AOF 混合持久化對故障恢復(fù)時間的影響
6.3 參考資料
Redis Sentinel 官方文檔
Redis 8.x Release Notes
Redis 高可用架構(gòu)設(shè)計
附錄
A. 命令速查表
# 查詢當前主節(jié)點地址 redis-cli -p 26379 -a'pass'sentinel get-master-addr-by-name mymaster # 查看所有主節(jié)點信息 redis-cli -p 26379 -a'pass'sentinel masters # 查看從節(jié)點列表 redis-cli -p 26379 -a'pass'sentinel slaves mymaster # 查看其他 Sentinel 節(jié)點 redis-cli -p 26379 -a'pass'sentinel sentinels mymaster # 手動觸發(fā)故障轉(zhuǎn)移(測試用) redis-cli -p 26379 -a'pass'sentinel failover mymaster # 重置 Sentinel 狀態(tài) redis-cli -p 26379 -a'pass'sentinel reset mymaster
B. 配置參數(shù)詳解
| 參數(shù) | 默認值 | 說明 |
|---|---|---|
| down-after-milliseconds | 30000 | 節(jié)點無響應(yīng)多少毫秒后標記為 SDOWN |
| failover-timeout | 180000 | 故障轉(zhuǎn)移超時時間(毫秒) |
| parallel-syncs | 1 | 故障轉(zhuǎn)移后同時同步的從節(jié)點數(shù)量 |
| quorum | 需手動設(shè)置 | 觸發(fā) ODOWN 所需的最少 Sentinel 數(shù)量 |
| min-replicas-to-write | 0 | 主節(jié)點接受寫入所需的最少在線從節(jié)點數(shù) |
| min-replicas-max-lag | 10 | 從節(jié)點復(fù)制延遲超過此值(秒)視為不可用 |
C. 術(shù)語表
| 術(shù)語 | 英文 | 解釋 |
|---|---|---|
| 主觀下線 | SDOWN (Subjectively Down) | 單個 Sentinel 認為節(jié)點不可用 |
| 客觀下線 | ODOWN (Objectively Down) | 多個 Sentinel 共同確認節(jié)點不可用 |
| 仲裁數(shù) | Quorum | 觸發(fā)故障轉(zhuǎn)移所需的最少 Sentinel 同意數(shù) |
| 腦裂 | Split-Brain | 網(wǎng)絡(luò)分區(qū)導(dǎo)致集群中出現(xiàn)兩個主節(jié)點的場景 |
| 復(fù)制積壓 | Replication Backlog | 主節(jié)點保存的最近寫命令緩沖區(qū),用于斷線重連后的增量同步 |
-
集群
+關(guān)注
關(guān)注
0文章
142瀏覽量
17659 -
組件
+關(guān)注
關(guān)注
1文章
572瀏覽量
19016 -
Redis
+關(guān)注
關(guān)注
0文章
392瀏覽量
12185
原文標題:Redis哨兵模式詳解:自動故障檢測與主從切換實戰(zhàn)
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
機器在自動循環(huán)和手動模式下的切換
詳解Redis主從復(fù)制和哨兵機制
Redis的四種模式復(fù)制、哨兵、Cluster以及集群模式
談?wù)?b class='flag-5'>Redis怎樣配置實現(xiàn)主從復(fù)制?
什么是Redis主從復(fù)制
mysql主從復(fù)制三種模式
redis查看主從節(jié)點命令
redis的哨兵和集群有什么區(qū)別
Redis使用重要的兩個機制:Reids持久化和主從復(fù)制
Redis Cluster之故障轉(zhuǎn)移
Redis實戰(zhàn)筆記
Redis哨兵模式的自動故障檢測與主從切換實戰(zhàn)
評論