Redis哨兵模式(Sentinel)高可用方案介绍与配置实践

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

相关推荐
liuc03177 小时前
AI下调用redis并调用deepseek
数据库·redis·mybatis
遇见火星7 小时前
Redis主从复制深度解析:数据高可用与负载均衡的核心方案
数据库·redis·缓存·负载均衡
哈里谢顿10 小时前
MySQL + Redis 协同 示例
redis·mysql
哈里谢顿13 小时前
redis实现排行榜功能
redis
Ahtacca14 小时前
Redis 五大常用数据类型详解及 Java 客户端(RedisTemplate)操作实战
java·数据库·redis·学习·缓存
rchmin17 小时前
Redis集群扩容数据迁移方案分析
redis·缓存
最贪吃的虎17 小时前
Redis 除了缓存,还能干什么?
java·数据库·redis·后端·缓存
哈里谢顿1 天前
redis常见问题分析
redis
MySQL实战1 天前
Redis 7.0 新特性之maxmemory-clients:限制客户端内存总使用量
数据库·redis
蜂蜜黄油呀土豆1 天前
Redis 底层实现深度解析:从 ListPack 到哈希表扩容
数据结构·redis·zset·sds·listpack·哈希表扩容