当前位置: 首页 > article >正文

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


http://www.kler.cn/a/595466.html

相关文章:

  • 数字孪生技术引领UI前端设计新风尚:跨平台与响应式设计的结合
  • 【Bluebell】项目总结:基于 golang 的前后端分离 web 项目实战
  • ue5蓝图项目转换为c++项目 遇到的问题
  • VectorBT:Python量化交易策略开发与回测评估详解
  • 如何缓解大语言模型推理中的“幻觉”(Hallucination)?
  • deepSpeed多机多卡训练服务器之间,和服务器内两个GPU是怎么通信
  • 识别并脱敏上传到deepseek/chatgpt的文本文件中的身份证/手机号
  • 单片机自学总结
  • 架构设计之自定义延迟双删缓存注解(上)
  • 【C++基础】Lambda 函数 基础知识讲解学习及难点解析
  • vscode连接本地mysql数据库
  • 解决python配置文件类configparser.ConfigParser,插入、读取数据,自动转为小写的问题
  • LLM之向量数据库Chroma milvus FAISS
  • SOFAStack-00-sofa 技术栈概览
  • ip2region与express最佳实践
  • Linux 文件系统的日志模式与性能影响
  • RC6在线加密工具
  • PaddleSpeech-语音处理-安装【超简洁步骤】
  • 关于 Redis 缓存一致
  • 北京南文观点:AI掘金术激活算法中的“沉默用户”