首页 > 数据库 >Redis从入门到放弃(8):哨兵模式

Redis从入门到放弃(8):哨兵模式

时间:2023-08-04 09:46:21浏览次数:41  
标签:入门 Redis 模式 哨兵 故障 Sentinel 节点

在前面的文章中介绍了Redis的主从复制,但主从复制存在一定的缺陷。如果Master节点宕机,因为不具备自动恢复功能,需要人工干预,那么在这个干预过程中Redis将不可用。

为了解决这一问题,Redis官方推荐一种高可用方案:哨兵模式(Sentinel)。

1、什么是哨兵模式?

哨兵模式是Redis的高可用解决方案之一,它旨在提供自动故障转移和故障检测的功能。在传统的Redis部署中,单个Redis节点可能成为单点故障,一旦该节点宕机,整个系统将不可用。为了解决这个问题,哨兵模式引入了多个Redis节点,其中一个节点被选为主节点,其他节点作为从节点。

2、工作原理

Redis为哨兵模式提供了专属的命令及配置文件,是以独立进程运行,先来看看单哨兵模式:

在上面模式中,哨兵主要有几个作用:

  • 监控状态:会向所有监控对象每秒发送ping命令,通过是否有响应来判断master和所有slave节点状态。
  • 故障转移:当一旦发现Master节点异常,它将尝试进行故障转移,选择新的slave节点为master节点,并通过发布订阅的方式通知其他slave节点修改配置。

但在上面的模式中,哨兵节点也存在单点故障。因此,为防止Sentinel发生意外,Sentinel也需要实现集群高可用。

上图就构成了多哨兵模式,实现了哨兵节点的高可用。

  • Sentinel不只是监控Redis节点,各Sentinel节点之间也会互相监控

3、哨兵模式的特点

哨兵模式具有以下特点:

3.1、自动检测及故障转移

当主节点宕机时,哨兵模式可以自动检测到宕机事件,并从从节点中选举出新的主节点,确保系统的持续可用性。

3.2、主观下线和客观下线

主观下线是指一个哨兵节点认为主节点不可用,但它并不确定其他哨兵节点是否也认为主节点不可用。当一个哨兵节点在一定时间(配置参数:down-after-milliseconds)内无法与主节点通信(比如发送PING命令没有收到响应),它会认为主节点下线。但在这个阶段,其他哨兵节点并不知道这个节点的状态,仅有一个哨兵主观地认为主节点宕机。

客观下线是指一个主节点被多数哨兵节点认定为不可用。当一个哨兵节点认为主节点宕机后,它会向其他哨兵节点询问对主节点的状态,并请求其他哨兵进行确认。如果多数(大多数至少需要半数加1)的哨兵节点都认为主节点不可用,那么主节点就会被判定为客观下线。客观下线意味着主节点的状态在整个哨兵集群中得到了确认。

主观下线和客观下线的引入是为了避免误判。如果只有一个哨兵节点认为主节点下线,那么很可能是网络抖动等原因导致的,此时并不应该进行故障转移。只有多数的哨兵节点都确认主节点下线,才能确保故障转移的正确性,保证整个集群的稳定性。

哨兵模式使用主观下线和客观下线状态的组合来实现可靠的主节点故障检测和故障转移,从而确保Redis集群的高可用性。

3.3、投票选举

在多Sentinel模式下,各节点会相互监控主从节点的健康状态。当主节点发生故障时,首先由Sentinel节点之间基于Raft算法进行投票选举,按照谁发现主节点故障谁去处理的原则,选举出一个领头Sentinel节点(Leader Sentinel)。这个领头Sentinel节点负责进行故障转移操作。

故障转移过程中,领头Sentinel节点会根据一定的规则在所有从节点中选择一个最优的从节点作为新的主节点(Master)。一般会选择复制偏移量最大且优先级较高的从节点作为新的主节点。然后,领头Sentinel节点通过发布订阅功能,通知其他从节点更改配置文件,将它们的连接从原来的主节点转移到新的主节点上。

对于客户端来说,连接Redis集群时首先连接到Sentinel节点,通过Sentinel节点查询主节点的地址。一旦主节点发生故障并进行了故障转移,Sentinel节点会将最新的主节点地址告知客户端。这样,客户端无需重启,就可以自动连接到新的主节点,实现高可用性的数据交互。

4、如何使用哨兵模式?

要使用哨兵模式,我们需要在sentinel.conf配置文件中指定Master节点的信息,并启动哨兵进程。当哨兵进程启动后,它会自动发现并监控Redis节点的状态。

以下是一个简单的配置文件示例:

sentinel monitor monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 10000
  • sentinel monitor <master-name> <ip> <redis-port> <quorum>:让 sentinel 监控地址为 ip:port 的Master,master-name 可以自定义;<quorum> 表示当有多少个 sentinel 认为主服务器宕机时,它才算真正的宕机掉,通常数量为半数或半数以上数量设置。
  • sentinel down-after-milliseconds <master-name> <milliseconds>:在指定的毫秒数内,若主节点没有应答哨兵的 PING 命令,此时哨兵认为服务器主观下线,默认时间为 30 秒。
  • parallel-syncs <master-name> <number> :指定可以有多少个 Redis 服务同步新的主机,一般而言,这个数字越小同步时间越长,而越大,则对网络资源要求就越高。
  • failover-timeout <master-name> <milliseconds>:指定故障转移允许的毫秒数,若超过这个时间,就认为故障转移执行失败,默认为 3 分钟。

启动命令:

./src/redis-sentinel sentinel.conf

5、 哨兵模式的局限性

虽然哨兵模式提供了一定程度的高可用性,但它仍然有一些局限性:

  • 故障转移可能会引起数据丢失。在故障转移期间,可能会丢失尚未同步到从节点的数据。

  • 哨兵模式的多维护了一套配置,维护成本相对较高。

6、结论

本文介绍了Redis的哨兵模式,它是一种提供高可用性的解决方案。我们了解了哨兵模式的特点、使用方法以及其局限性。在实际应用中,要根据需求和现有技术栈来选择合适的高可用解决方案。

希望本文对你理解Redis的哨兵模式有所帮助。下一篇文章中,我们将继续探讨Redis的集群。敬请期待!

标签:入门,Redis,模式,哨兵,故障,Sentinel,节点
From: https://www.cnblogs.com/myshare/p/17605054.html

相关文章

  • 植物大战僵尸修改器制作--从入门到入土
    目录基础准备基址偏移表常规项目卡槽植物种植无冷却无限阳光浓雾透视基本原理HOOK除雾代码种植植物基本原理远程线程注入dll函数远程线程卸载dll函数关键dll函数失败代码远程线程代码注入(推荐)种植僵尸基本原理种植僵尸函数--dll注入版远程代码注入版完整代码参考资料基础准备......
  • pyspark 环境搭建和相关操作redis ,es
    一.环境搭建1.创建虚拟环境,指定python包2.切换到虚拟环境,安装你所需要的python相关模块包3.把整个虚拟环境打成.zip4.将zip上传的hadfs5.spark-submit指定python包的路径可以参考 https://dandelioncloud.cn/article/details/1589470996832964609二.pyspark数据r......
  • C++入门到放弃(08)——类成员:const 和 static用法
    ​1.常量成员const类的常量成员,具备以下特性:1.1.const成员必须被初始化1.2.const成员只能在初始化列表中赋值1.3.const成员不能在构造函数原型中赋值1.4.const成员初始化之后无法更改classConstMember{public:ConstMember(intnum=0):m_num(num)......
  • Redis持久化
    RDB持久化Redis可以通过创建快照来获得存储在内存里面的数据在 某个时间点 上的副本。Redis创建快照之后,可以对快照进行备份,可以将快照复制到其他服务器从而创建具有相同数据的服务器副本(Redis主从结构,主要用来提高Redis性能),还可以将快照留在原地以便重启服务器的时候使......
  • A07、redis
    review#Spring全家桶#Spring#中间件回顾1.springboot特性版本锁定继承官方的parent起步依赖完成某个功能的坐标集合体自动装配可以通过默认规则创建对象2.yml配置文件简单对象/map集合3.整合junit4.整合ssm5.整合日志今日目标1.掌握......
  • 【Java基础】Java 入门第一步
    ......
  • Redis从入门到放弃(6):持久化
    文章目录1、引言2、RDB持久化2.1、手动触发2.2、自动触发3、AOF持久化3.1、触发方式3.2、AOF重写4、混合持久化5、RDB与AOF的优缺点对比5.1、RDB5.2、AOF1、引言Redis作为一种高性能的内存数据存储系统,常被用作缓存、会话存储、消息队列等多种应用场景。然而,由于其数据存储在内......
  • Redis从入门到放弃(5):事务
    文章目录1、事务的定义2、事务命令3、事务错误处理4、事务的冲突问题4.1、悲观锁(PessimisticLock)4.2、乐观锁(OptimisticLocking)5、总结:事务三特性1、事务的定义Redis的事务提供了一种“将多个命令打包,然后一次性、按顺序地执行”的机制。redis事务的主要作用就是串联多个命令......
  • Redis从入门到放弃(4):3种新数据类型
    文章目录1、介绍2、Bitmaps(位图)2.1、特性2.2、原理2.3、应用场景2.4、代码3、HyperLogLog(基数统计)3.1、特性3.2、原理3.3、应用场景3.4、代码4、Geospatial(地理位置)4.1、特性4.2、原理4.3、应用场景4.4、代码5、总结1、介绍前面的文章已经介绍了redis的5种基本数据类型,redis6中......
  • Redis从入门到放弃(3):发布与订阅
    文章目录1、介绍2、如何使用发布订阅2.1、订阅频道2.2、发布消息2.3、取消订阅2.4、模式订阅2.5、取消模式订阅3、使用案例(伪代码)4、Redis的发布订阅与ActiveMQ、RocketMQ区别1、介绍Redis是一个快速、开源的内存数据库,支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。......