Redis Sentinel 是 Redis 官方提供的高可用性(HA)解決方案,用于管理 Redis 主從架構中的故障檢測和故障轉移。通過 Redis Sentinel,可以實現 Redis 主從集群的自動故障恢復,確保服務的高可用性。本文將詳細介紹Redis Sentinel的原理、配置方法以及實踐步驟。
1 Redis Sentinel簡介
1.1 什么是Redis Sentinel
Redis Sentinel是一個分布式系統,用于監控Redis主從節點的健康狀態,并在主節點發生故障時自動將從節點提升為新的主節點。它還可以通知客戶端主從節點的變化。
1.2 Redis Sentinel的核心功能
- 監控:持續監控主從節點的健康狀態
- 通知:當 Redis 實例出現故障時,通知管理員或其他應用程序
- 自動故障轉移:當主節點故障時,自動將從節點提升為新的主節點
- 配置提供者:為客戶端提供最新的主節點地址
1.3 Redis Sentinel的優勢
- 高可用性:自動故障轉移,減少人工干預
- 無縫切換:客戶端可以自動感知主從節點的變化
- 易于擴展:支持多個Sentinel節點,避免單點故障
2 Redis Sentinel工作原理
1. Sentinel節點
- Sentinel是一個獨立的進程,可以部署在多個服務器上,每個Sentinel節點會監控Redis主從節點的狀態
2. 故障檢測
- Sentinel 會定期向 Redis 主從節點發送ping命令,檢測其是否正常運行
- 如果主節點在指定時間內未響應,Sentinel會將其標記為“主觀下線”
- 多個Sentinel節點會通過投票機制確認主節點是否“客觀下線”
3. 故障轉移
- 當主節點被確認為“客觀下線”后,Sentinel會選舉一個從節點作為新的主節點
- Sentinel會向其他從節點發送peplicaof命令,使其復制新的主節點
- Sentinel會更新客戶端的配置,使其連接到新的主節點
4. 客戶端連接
- 客戶端通過 Sentinel 獲取當前的主節點地址,并在主從切換后自動更新連接
3 Redis Sentinel配置與實踐
3.1 環境裝備
主機IP | 角色 | 端口 | 說明 |
192.168.10.32 | Redis Master + Sentinel | 6379/26379 | 主節點及哨兵節點1 |
192.168.10.31 | Redis Slave + Sentinel | 6379/26379 | 從節點及哨兵節點2 |
192.168.10.30 | Redis Slave + Sentinel | 6379/26379 | 從節點及哨兵節點3 |
3.2 Redis主從復制配置
3.2.1 主節點配置
vim /usr/local/redis/redis.conf
# 編輯/usr/local/redis/redis.conf文件,修改如下項的內容
bind 0.0.0.0
protected-mode no
requirepass lahmy1c@
daemonize yes
logfile /var/log/redis-server.log# 修改完如上內容后重啟服務
ps -ef |grep redis|grep -v grep |awk '{print $2}'|xargs kill -9
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
3.2.2 從節點配置
vim /usr/local/redis/redis.conf
# 編輯/usr/local/redis/redis.conf文件,修改如下項的內容
bind 0.0.0.0
protected-mode no
requirepass lahmy1c@
replicaof 192.168.10.32 6379
masterauth lahmy1c@
daemonize yes
logfile /var/log/redis-server.log# 修改完如上內容后重啟服務
ps -ef |grep redis|grep -v grep |awk '{print $2}'|xargs kill -9
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
3.2.3 查看主從復制狀態
# 主節點
[root@node3 redis]# /usr/local/redis/bin/redis-cli -a lahmy1c@ info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.10.31,port=6379,state=online,offset=210,lag=0
slave1:ip=192.168.10.30,port=6379,state=online,offset=210,lag=1
master_failover_state:no-failover
master_replid:ca76bcd56c1d7aec579fc0976d630857da32b34c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:210
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:210
[root@node3 redis]# # 從節點
[root@node2 redis]# /usr/local/redis/bin/redis-cli -a lahmy1c@ info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:slave
master_host:192.168.10.32
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_read_repl_offset:224
slave_repl_offset:224
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:ca76bcd56c1d7aec579fc0976d630857da32b34c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:224
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:224
[root@node2 redis]# [root@node1 redis]# /usr/local/redis/bin/redis-cli -a lahmy1c@ info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:slave
master_host:192.168.10.32
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_read_repl_offset:224
slave_repl_offset:224
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:ca76bcd56c1d7aec579fc0976d630857da32b34c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:224
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:224
[root@node1 redis]#
3.3 Sentinel配置(所有節點)
3.3.1 編輯sentinel.conf文件
# 處理sentinel.conf配置文件
grep -v '^$\|#' /root/tool/redis-6.2.9/sentinel.conf > /usr/local/redis/sentinel.conf# 編輯/usr/local/redis/sentinel.conf,修改或者增加如下內容
port 26379
daemonize yes
pidfile /var/run/redis/redis-sentinel.pid
logfile /var/log/redis-sentinel.log
dir /tmp
sentinel monitor mymaster 192.168.10.32 6379 2
sentinel auth-pass mymaster lahmy1c@
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 15000
sentinel parallel-syncs mymaster 1
關鍵參數說明:
- sentinel monitor:監控主節點(名稱、IP、端口、quorum數)
- sentinel auth-pass:主節點認證密碼
- sentinel down-after-milliseconds:判定節點不可達的超時時間(毫秒)
- sentinel failover-timeout:故障轉移超時時間(毫秒)
- sentinel parallel-syncs:故障轉移后并行同步的從節點數
3.3.2 啟動sentinel服務
# 在所有節點執行如下命令
/usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel.conf
?3.3.3 檢查sentinel狀態
/usr/local/redis/bin/redis-cli -p 26379 info sentinel[root@node3 bin]# /usr/local/redis/bin/redis-cli -p 26379 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.10.32:6379,slaves=2,sentinels=3
[root@node3 bin]#
3.3.4 查看主從狀態
# 查看主節點狀態
/usr/local/redis/bin/redis-cli -p 26379 sentinel master mymaster[root@node3 bin]# /usr/local/redis/bin/redis-cli -p 26379 sentinel master mymaster1) "name"2) "mymaster"3) "ip"4) "192.168.10.32"5) "port"6) "6379"7) "runid"8) "2c673d7bcd9757ef165bce5aa7a835801318ccb9"9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "180"
19) "last-ping-reply"
20) "181"
21) "down-after-milliseconds"
22) "5000"
23) "info-refresh"
24) "4149"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "546489"
29) "config-epoch"
30) "0"
31) "num-slaves"
32) "2"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "15000"
39) "parallel-syncs"
40) "1"
[root@node3 bin]# # 查看從節點狀態
/usr/local/redis/bin/redis-cli -p 26379 sentinel slaves mymaster[root@node2 redis]# /usr/local/redis/bin/redis-cli -p 26379 sentinel slaves mymaster
1) 1) "name"2) "192.168.10.30:6379"3) "ip"4) "192.168.10.30"5) "port"6) "6379"7) "runid"8) "e2204c7b72ceee7476f532226824bbeabcf0fd3d"9) "flags"10) "slave"11) "link-pending-commands"12) "0"13) "link-refcount"14) "1"15) "last-ping-sent"16) "0"17) "last-ok-ping-reply"18) "885"19) "last-ping-reply"20) "885"21) "down-after-milliseconds"22) "5000"23) "info-refresh"24) "6055"25) "role-reported"26) "slave"27) "role-reported-time"28) "668938"29) "master-link-down-time"30) "0"31) "master-link-status"32) "ok"33) "master-host"34) "192.168.10.32"35) "master-port"36) "6379"37) "slave-priority"38) "100"39) "slave-repl-offset"40) "137279"41) "replica-announced"42) "1"
2) 1) "name"2) "192.168.10.31:6379"3) "ip"4) "192.168.10.31"5) "port"6) "6379"7) "runid"8) "80996e2f4e6bfbcc2470431e05cb45bdd105ab36"9) "flags"10) "slave"11) "link-pending-commands"12) "0"13) "link-refcount"14) "1"15) "last-ping-sent"16) "0"17) "last-ok-ping-reply"18) "885"19) "last-ping-reply"20) "884"21) "down-after-milliseconds"22) "5000"23) "info-refresh"24) "6056"25) "role-reported"26) "slave"27) "role-reported-time"28) "668943"29) "master-link-down-time"30) "0"31) "master-link-status"32) "ok"33) "master-host"34) "192.168.10.32"35) "master-port"36) "6379"37) "slave-priority"38) "100"39) "slave-repl-offset"40) "137279"41) "replica-announced"42) "1"
[root@node2 redis]#
4 模擬故障轉移
4.1 模擬主節故障
/usr/local/redis/bin/redis-cli -p 6379 -a lahmy1c@ shutdown
4.2 觀察Sentinel日志
# /var/log/redis-sentinel.log日志將記錄選舉新主節點的過程
54489:X 18 Mar 2025 15:22:23.593 # +sdown master mymaster 192.168.10.32 6379
54489:X 18 Mar 2025 15:22:23.733 # +new-epoch 1
54489:X 18 Mar 2025 15:22:23.740 # +vote-for-leader 255e219ef39458216f990a50b89de6b41e739ec4 1
54489:X 18 Mar 2025 15:22:24.675 # +odown master mymaster 192.168.10.32 6379 #quorum 3/2
54489:X 18 Mar 2025 15:22:24.676 # Next failover delay: I will not start a failover before Tue Mar 18 15:22:54 2025
54489:X 18 Mar 2025 15:22:24.814 # +config-update-from sentinel 255e219ef39458216f990a50b89de6b41e739ec4 192.168.10.32 26379 @ mymaster 192.168.10.32 6379
54489:X 18 Mar 2025 15:22:24.814 # +switch-master mymaster 192.168.10.32 6379 192.168.10.31 6379
54489:X 18 Mar 2025 15:22:24.818 * +slave slave 192.168.10.30:6379 192.168.10.30 6379 @ mymaster 192.168.10.31 6379
54489:X 18 Mar 2025 15:22:24.819 * +slave slave 192.168.10.32:6379 192.168.10.32 6379 @ mymaster 192.168.10.31 6379
54489:X 18 Mar 2025 15:22:29.829 # +sdown slave 192.168.10.32:6379 192.168.10.32 6379 @ mymaster 192.168.10.31 6379
4.3 驗證新主節點
/usr/local/redis/bin/redis-cli -p 6379 -a lahmy1c@ info replication# 此時主節點已經轉移到了master_host:192.168.10.31
[root@node1 redis]# /usr/local/redis/bin/redis-cli -p 6379 -a lahmy1c@ info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:slave
master_host:192.168.10.31
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_read_repl_offset:232120
slave_repl_offset:232120
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:124c2940281b400d9240f9237c660db96b23166a
master_replid2:ca76bcd56c1d7aec579fc0976d630857da32b34c
master_repl_offset:232120
second_repl_offset:184978
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:232120
[root@node1 redis]#
5 總結
通過如上步驟,我們就完成了redis sentinel模式的搭建配置。