redis之sentinel模式

Redis Sentinel是Redis的高可用性解决方案,负责监控、故障转移和配置更新。Sentinel系统由多个Sentinel实例组成,监视主服务器及从服务器,当主服务器下线时执行故障转移,选择新的主服务器并更新从服务器的复制关系。Sentinel通过发送PING命令检测服务器状态,当主观下线转为客观下线时,Sentinel们会选举出一个领导者执行故障转移操作,确保服务的连续性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

往期回顾

redis之数据结构与对象篇(一)
redis之数据结构与对象篇(二)
redis之数据结构与对象篇(三)
redis之数据结构与对象篇(终章)
redis之单机数据库杂谈
redis持久化的秘密
redis的复制实现
redis之发布与订阅


Sentinel(哨兵)是Redis的高可用性解决方案:由一个或者多个Sentinel实例组成Sentinel系统可以见识多个主服务器,以及这些主服务器属下的所有从服务器,并在被见识的主服务器进入下线状态时,自动将主服务器属下的从服务器升级为主服务器,然后由新的主从服务器代替已经下线的主服务器继续处理命令请求

下图展示了一个Sentinel系统监视服务器的例子
在这里插入图片描述

  • 双环图案表示的是当前的主服务器server1
  • 单环图表示的是主服务器的三个从服务器server2,server3,server4
  • 三个从服务器正在复制主服务器server1,而Sentinel系统正在监视四个服务器

假设这时,从服务器server1进入下线状态,那么从服务器server2,server3,server4对主服务器的复制操作将被终止,并且Sentinel系统会察觉到server1已经下线在这里插入图片描述
当server1的下线时长超过用户设定的下线时长上线时,Sentinel系统就会对server1执行故障转移操作:

  • 首先,Sentinel系统会挑选server1属下的其中一个从服务器,将这个被选中的从服务器升级为新的主服务器
  • 之后,Sentinel系统会向server1属下的所有从服务器发送新的复制指令,让他们成为新的主服务器的从服务器,当所有从服务器都开始复制新的主服务器时,故障转移操作完成
  • Sentinel系统会继续监视已经下线的server1,在server1重新上线时,将它设置为新的主服务器的从服务器

启动并初始化Sentinel

启动一个Sentinel可以使用命令:

$ redis-sentinel /path/you/sentinel.conf

当一个Sentinel启动时,它需要执行以下步骤:

  1. 初始化服务器
  2. 将普通的Redis服务器代码替换为Sentinel专有代码
  3. 初始化Sentinel状态
  4. 根据给定的配置文件,初始化Sentinel的监视服务器列表
  5. 创建连向主服务器的网络连接

初始化服务器

Sentinel本质上是一个运行在特殊模式下的Redis服务器,所以启动的第一步就是初始化一个Redis服务器。Sentinel的作用和普通的Redis服务器不同,所以初始化过程也不相同

例如,普通服务器在初始化时会载入RDB文件或者AOF文件来还原数据库状态,但是Sentinel并不使用数据库,所以初始化Sentinel时就不会载入RDB文件或者AOF文件

Sentinel模式下,服务器的主要功能使用情况。

功能
### Redis Sentinel 模式的配置与工作原理 #### 1. Redis Sentinel 的基本概念 Redis Sentinel 是一种高可用性解决方案,主要用于监控 Redis 主从实例的状态,并在主节点发生故障时执行自动故障转移。这种机制可以显著提高系统的可靠性,确保即使在单点故障的情况下,服务仍能正常运行[^3]。 #### 2. 工作原理详解 Redis Sentinel 的核心功能包括以下几个方面: - **监控 (Monitoring)** Sentinel 节点会持续不断地检查主服务器和从服务器是否按预期工作。如果发现主服务器不可用,则触发后续操作[^1]。 - **通知 (Notification)** 当被监控的某个 Redis 实例出现问题时,Sentinel 可以向管理员或其他应用程序发送警报,以便及时采取措施[^2]。 - **自动故障转移 (Automatic Failover)** 如果主服务器无法继续工作,Sentinel 将启动选举流程,选择一个合适的从服务器升级为主服务器,并更新客户端连接信息。 - **配置提供者 (Configuration Provider)** 客户端可以通过 Sentinel 获取当前最新的主服务器地址,从而动态调整自己的连接目标。 #### 3. 配置方法 以下是 Redis Sentinel 的典型配置过程及其关键参数说明: ##### (1)安装与初始化 假设已经部署好 RedisSentinel 所需环境,创建 `sentinel.conf` 文件来定义哨兵的行为规则。以下是一个简单的配置文件示例: ```bash port 26379 # 设置 Sentinel 运行的端口号 daemonize yes # 后台运行 logfile "/var/log/redis/sentinel.log" # 日志路径 dir /tmp # 数据存储目录 # 监控名为 mymaster 的主从集群,其中 master 地址为 127.0.0.1:6379, # 至少需要 2 个 Sentinel 协议确认才能判定主节点下线 sentinel monitor mymaster 127.0.0.1 6379 2 # 故障切换超时时间设置为 180 秒 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 180000 ``` 上述配置中: - `sentinel monitor`: 表明要监视哪个主库(名称、IP、端口),以及至少多少个 Sentinel 认可该判断才生效。 - `down-after-milliseconds`: 设定多长时间未收到回复视为断开链接。 - `failover-timeout`: 控制整个故障转移的最大允许耗时时长。 ##### (2)启动多个 Sentinel 实例 为了增强健壮性,通常建议在同一网络环境下部署三个或更多 Sentinel 实例形成多数派决策机制。每个 Sentinel 使用相同的配置文件即可独立运行。 命令如下所示: ```bash redis-sentinel /path/to/sentinel.conf ``` #### 4. 自动故障转移的具体流程 当主服务器宕机后,Sentinel 群体会按照既定逻辑完成以下步骤: 1. 多数 Sentinel 达成一致意见认为原 Master 不再可达; 2. 在存活 Slave 中挑选最适合作为新 Master 的候选对象; 3. 更新所有 Client 对应的新 Master IP 和 Port; 4. 修改其他 Slaves 关联关系使其同步到新的 Master 上。 --- ### 示例代码:验证 Sentinel 功能的小型 Python 应用程序 下面展示如何利用 redis-py 库编写一段脚本测试 Sentinel 是否成功接管失败的服务。 ```python import redis from redis.sentinel import Sentinel def connect_to_redis_sentinel(): sentinel = Sentinel([('localhost', 26379)], socket_timeout=0.1) master = sentinel.master_for('mymaster', db=0, password=None, socket_timeout=0.1) try: result = master.set('test_key', 'value') value = master.get('test_key').decode() print(f"Successfully set key with value {value}") except Exception as e: print("Error occurred:", str(e)) if __name__ == "__main__": connect_to_redis_sentinel() ``` 此段代码展示了通过 Sentinel API 来获取当前有效的 Master 并尝试写入数据的过程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值