千家信息网

玩转Redis搭建集群之Sentinel详解

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,前言Redis作为内存数据库,需要具备高可用的特点,不然如果服务器宕机,还在内存里的数据就会丢失。我们最常用的高可用方法就是搭建集群,master机器挂了,可以让slave机器顶上,继续提供服务。但是
千家信息网最后更新 2026年11月01日玩转Redis搭建集群之Sentinel详解

前言

Redis作为内存数据库,需要具备高可用的特点,不然如果服务器宕机,还在内存里的数据就会丢失。我们最常用的高可用方法就是搭建集群,master机器挂了,可以让slave机器顶上,继续提供服务。但是Redis集群是不会自动进行主从切换的,也就是说,如果主节点非常不争气的在凌晨3点挂了,那么运维同学就要马上起床,把从节点改成主节点,这样的操作是非常繁琐低效的。为此,Redis官方提供了一种解决方案:Redis Sentinel

简介

Redis Sentinel集群通常由3到5个节点组成,如果个别节点挂了,集群还可以正常运作。它负责监控Redis集群的健康情况。如果主节点挂掉,Sentinel集群会通过投票选择一个新的主节点。当原来的主节点恢复时,它会被当做新的主节点的从节点重新加入Redis集群。

基本原理

Sentinel集群通过指定的配置文件发现master,对其进行监控,并且会发送info指令获取master的从节点信息。Sentinel集群中的节点通过向其监控的主从节点发送hello信息(包含Sentinel本身的ip、端口和id等内容)来向其他Sentinel宣告自己的存在。

Sentinel集群通过订阅连接来接收其他Sentinel的hello信息。

Sentinel集群通过ping命令来检查监控的实例状态,如果在指定时间内没有返回,则认为该实例下线。

Sentinel触发failover主从切换后,并不会马上进行,只有指定(quorum)Sentinel授权后,master节点被标记为ODOWN状态。这时才真正开始投票选择新的master。

Sentinel选择新的master的原则是:首先判断优先级,选择优先级较小的;如果优先级相同,查看复制下标,选择复制数据较多的;如果复制下标也相同,就选择进程ID较小的。

Sentinel被授权后,它将会获得宕掉的master的一份最新配置版本号(config-epoch),当failover执行结束以后,这个版本号将会被用于最新的配置,通过广播形式通知其它Sentinel,其它的Sentinel则更新对应master的配置。

基本使用

我们以Python为例,简单说明一下在客户端如何使用Sentinel

from redis.sentinel import Sentinelif __name__ == '__main__': sentinel = Sentinel(['localhost', 26379], socket_timeout=0.1) print(sentinel.discover_master('mymaster')) print(sentinel.discover_slaves('mymaster')) master = sentinel.master_for('mymaster', socket_timeout=0.1) slave = sentinel.slave_for('mymaster', socket_timeout=0.1) master.set('follow', 'Jackeyzhe2018') follow = slave.get('follow') print(follow)

master_for和slave_for方法会从连接池中拿出一个连接来使用,如果从地址有多个,则会采用轮询的方法。

当redis发生了主从切换时,客户端如何知道地址已经变更了呢?我们从redis-py的源码里找一找答案。

可以看到,redis在创建一个新的连接时,会调用get_master_address方法来获取主节点地址。get_master_address方法中,客户端先查询主节点地址,然后与内存中的地址进行比较。如果不一致,则会断开连接,然后使用新的地址重新进行连接。

如果主节点没有挂,而Sentinel主动进行了主从切换,对于这种情况redis-py也做了处理。就是捕获一个ReadOnlyError的异常,然后断开连接,后续指令都需要重新进行连接了。当然,如果没有修改性指令,那么连接就不会切换,不过数据也不会被破坏,所以影响不大。

动手搭建

关于Sentinel的工作原理和使用方法我们已经有了大概的认识,为了加深理解,我们来自己动手搭建一套Sentinel集群。

首先搭建我们我需要的redis集群环境

安装好redis后,将redis目录下的配置文件redis.conf复制3份。分别命名为redis6379.conf,redis6380.conf,redis6381.conf。

在redis6381.conf文件中修改以下几项

bind 127.0.0.1port 6381logfile "6381.log"dbfilename "dump-6381.rdb"

在redis6379.conf中修改

bind 127.0.0.1port 6379logfile "6379.log"dbfilename "dump-6379.rdb"slaveof 127.0.0.1 6381

redis6380.conf的修改参照redis6379.conf。修改完成后,分别启动三个实例。就搭建好了我们想要的redis主从环境了。

我们连接上master节点,可以看到它的主从配置信息

接着,我们来配置Sentinel集群。这里我们同样配置三个实例。复制3份sentinel.conf文件,分别命名为sentinel-26379.conf,sentinel-26380.conf和sentinel-26381.conf。

sentinel-26379.conf文件中编辑以下内容

port 26379 daemonize yes logfile "26379.log" dir /home/xxx/redis/data sentinel monitor mymaster 127.0.0.1 6381 2sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000

sentinel-26380.conf和sentinel-26381.conf的内容与上述类似。配置好后,我们使用命令redis-sentinel来启动3个sentinel实例。

此时,我们用redis-cli命令连接26379的实例,查看sentinel的信息。

发现它已经开始监控我们的3个redis节点了。这时我们的整个集群就部署好了,接下来测试一下。

kill掉master节点,查看sentinel的日志,会发现sentinel已经按照我们前面说的步骤选择了新的master。

此时再来看sentinel信息。

此时,6380已经成了新的master。

恭喜你,以后都不需要在凌晨起床切换Redis主从实例了。

总结:

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

节点 集群 配置 主从 实例 选择 信息 地址 方法 切换 内容 文件 监控 数据 优先级 内存 命令 客户 客户端 就是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广东猪兼强互联网科技有限公司 科技互联网政务服务 互联网 科技公司 广州宏创互联网科技 西安互联网科技公司 融贸通互联网科技 互联网科技类展会 汉立互联网科技有限公司联系电话 华中科技有哪些互联网大佬 宁波青枫互联网科技有限公司 互联网科技中介 小米互联网科技园设置 黑科技闪耀互联网之光 卓翼科技产业互联网合作 城市宝互联网科技有限公司 珠海东科互联网科技有限公司 江苏互联网智能科技产品出厂价 平安好医生打造互联网科技医疗 利用互联网等科技手段 广州全民伙伴互联网科技有限公司 互联网扶贫科技 互联网科技金融 汇久创客互联网科技 新浪科技互联网 科技互联网大厂 普陀区互联网教育科技管理办法 第三届互联网大会安防黑科技 互联网科技创业计划的风险分析 互联网科技自媒体灵感 互联网科技创业有什么好项目
0