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模式的搭建配置。