热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【Redis】哨兵模式Sentinel

哨兵模式Sentinelsentinel简介主从复制高可用存在的问题?手动故障转移、2.写能力和存储能力受限,其他节点只是主节点的副本redis

哨兵模式 Sentinel


sentinel 简介


  • 主从复制高可用存在的问题?

  1. 手动故障转移、2. 写能力和存储能力受限,其他节点只是主节点的副本

redis sentinel 分为几个节点,相当于redis的进程,不会存储数据,作用是完成redis的故障判断和故障转移,并且通知客户端的过程。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rTedTQeH-1618839534648)(D:\chencan\img\redis\redis sentinel.png)]

Sentinel其实是一个redis的服务端程序,会定时执行一些serverCron函数来获取整个集群模式下的信息,可以在无需人工干预的情况下做到故障转移Sentinel 是一个分布式系统,也就是说Sentinel本身也是可以做集群的。

Sentinel的作用是用来故障发现,故障自动转移,并且通知客户端的过程。(监控和故障转移的通知)

其中,一套sentinel可以监控多套redis的master和slave,使用master-name标识进行监控

redis sentinel 故障转移的过程步骤原理:

  1. 多个sentinel发现并确认master有问题,将连接进行中断
  2. 选举出一个sentinel作为领导
  3. 选出一个slave作为master
  4. 通知其余slave称为新的master的slave
  5. 通知客户端主从变化
  6. 如果原有的master复活了,则等待老的master复活成为新master的slave

redis sentinel的安装和配置

  1. 配置开启主从节点

  2. 配置开启sentinel监控主节点(sentinel是特殊的redis)

  3. 实际应该多机器

  4. 详细配置节点


监控机制

Sentinel具有故障转移能力,则我们必须知道redis主、从服务器运行时的信息(ip、端口号、状态等),sentinel通过三个定时监控任务完成对各个节点发现和监控。

  1. 主从节点信息监控

    每隔10秒执行info,每个Sentinel节点会向主节点和从节点发送info命令获取最新的拓扑结构。如下图(忽略psync,这个是主从复制的时候触发):

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E3jqEvSx-1618839534650)(D:\chencan\img\redis\redis_21.png)]

    作用
    1. 通过向主节点执行info命令,获取从节点的信息,这也是为什么Sentinel节点不需要显式配置监控从节点。
    2. 当有新的从节点加入时都可以立刻感知出来。
    3. 节点不可达或者故障转移后,可以通过info命令实时更新节点拓扑信息。
  2. 对主节点监控

    每隔2秒,每个Sentinel节点会向 Redis 主节点的__sentinel__:hello频道上发送该Sentinel节点对于主节点的判断以及当前Sentinel节点的信息,同时每个Sentinel节点也会订阅该频道,来了解其他Sentinel节点以及它们对主节点的判断。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FC8LCg2O-1618839534652)(D:\chencan\img\redis\redis_22.png)]

    作用
    1. 通过订阅主节点的__sentinel__:hello了解其他的Sentinel节点信息,如果是新加入的Sentinel节点将该Sentinel节点信息保存起来,并与该Sentinel节点创建连接。
    2. Sentinel节点之间交换主节点的状态,作为后面客观下线(这个后面会说)以及领导者选举的依据。
  3. 心跳检测

    每隔1秒,每个Sentinel节点会向主节点从节点、其余Sentinel节点发送一条ping命令做一次心跳检测,来确认这些节点当前是否可达。这个定时任务是节点失败判定的重要依据。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M8HodCQo-1618839534654)(D:\chencan\img\redis\redis_23.png)]


三个定时任务每10秒每个sentinel对master和slave执行info每2秒每个sentinel通过master节点的channel交换信息(pub/sub)每1秒每个sentinel对其他sentinel和redis执行ping(心跳检测)
发现slave节点通过_sentinel_:hello 频道交互心跳检测,失败判定依据
确定主从关系交互对节点的“看法”和自身信息

主观和客观下线

sentinel monitor # 建议quorum为 节点数/2 + 1 ,并且建议为奇数
sentinel monitor myMaster 127.0.0.1 6379 2
sentinel down-after-milliseconds
sentinel down-after-milliseconds myMaster 30000

主观下线:每个sentinel节点对redis节点失败的偏见

客观下线:所有sentinel节点对redis节点失败"达成共识"(超过quprum个通过)

sentinel is-master-down-by-addr :问一下其他的sentinel节点,是否你们也认为当前这个master节点是需要做一个客观下线的(slave做一个主观下线就好了)


  • 主观下线

    定时任务中有提到Sentinel节点会每隔1秒对主节点从节点其他Sentinel节点发送ping命令做心跳检测,当这些节点超过down-after-milliseconds(配置文件中的属性)没有进行有效回复,Sentinel节点就会对该节点做失败判定,这个行为叫做主观下线(站在一个Sentinel的角度上,当前Sentinel认为下线就是主观)。

  • 客观下线

    Sentinel主观下线的节点是主节点时,该 Sentinel 节点会通过sentinel is-master-down-by-addr命令向其他Sentinel节点询问对主节点的判断,当超过quorum个数,Sentinel节点认为主节点确实有问题,这时该Sentinel节点会做出客观下线的决定,这样客观下线的含义是比较明显了,也就是大部分Sentinel节点都对主节点的下线做了同意的判定,那么这个判定就是客观的。


Sentinel选举

当sentinel客观判定认为主节点下线后,是不会立即执行redis的故障转移,因为执行故障转移只需要一个sentinel来操作,那该由哪一个sentinel来执行呢?这个时候回出现一个选举leader的过程

sentinel选举过程:

  1. 每个在线的Sentinel节点都有资格成为领导者,当它确认主节点主观下线时候,会向其他Sentinel节点发送sentinel is-master-down-by-addr命令,要求将自己设置为领导者。
  2. 收到命令的Sentinel节点,如果没有同意过其他Sentinel节点的sentinelis-master-down-by-addr命令,将同意该请求,否则拒绝。
  3. 如果该Sentinel节点发现自己的票数已经大于等于num / 2 + 1 (numSentinel节点个数),那么它将成为领导者。
  4. 如果此过程没有选举出Leader,将进入下一次选举。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3VzOjXPp-1618839534655)(D:\chencan\img\redis\redis sentinel 选举.jpg)]

故障转移

Sentinel的作用就是用来做故障转移的。现在Sentinel客观下线了主节点,上面也把SentinelLeader选举出来了,最后的步骤就是通过这个Leader来操作故障转移。

大概过程如下:

  1. 选择合适的从节点 因为整个集群环境存在多个从节点,所以Sentinel 在操作故障转移过程时会有一个过滤从节点的过程,选择合适的一台从节点提升为主节点,步骤如下:
    1.1 过滤掉主观下线、5 秒内没有回复过Sentinel 节点ping 响应、与主节点失联超过down-after-milliseconds*10 秒的从节点。
    1.2 选择slave-priority (从节点优先级)最高的从节点列表,如果存在则返回,不存在则继续。
    1.3 选择复制偏移量最大的从节点(复制的最完整),如果存在则返回,不存在则继续。
    1.4 选择runid 最小的从节点。
  2. Sentinel领导者节点会对第一步选出来的从节点执行slaveof no one命令让其成为主节点。
  3. Sentinel领导者节点会向剩余的从节点发送命令,让它们成为新主节点的从节点,复制规则和parallel-syncs参数有关。
  4. Sentinel节点集合会将原来的主节点更新为从节点,并保持着对其关注,当其恢复后命令它去复制新的主节点。

Sentinel的局限性


  • 部署麻烦、原理复杂、浪费资源,从节点作为备份节点不提供服务。

  • 不支持读写分离,实现起来相对复杂。

  • 只支持对主节点的故障转移,不支持对从节点的故障转移。

  • 存储的数据量有限,因为Sentinel的基础是主从复制,所有主节点和从几点都包含了 Redis 全量的数据。


总结

主要把上面的监控机制、SentinelLeader选举、故障转移概念和流程搞清楚问题就不大。

参考:慕课课程(Redis从入门到高可用 分布式实践)


推荐阅读
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • PHP预处理常量详解:如何定义与使用常量 ... [详细]
  • 本文详细介绍了如何在 Linux 系统上安装 JDK 1.8、MySQL 和 Redis,并提供了相应的环境配置和验证步骤。 ... [详细]
  • 思科IOS XE与ISE集成实现TACACS认证配置
    本文详细介绍了如何在思科IOS XE设备上配置TACACS认证,并通过ISE(Identity Services Engine)进行用户管理和授权。配置包括网络拓扑、设备设置和ISE端的具体步骤。 ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • Keepalived 提供了多种强大且灵活的后端健康检查机制,包括 HTTP_GET、SSL_GET、TCP_CHECK、SMTP_CHECK 和 MISC_CHECK 等多种检测方法。这些健康检查功能确保了高可用性环境中的服务稳定性和可靠性。通过合理配置这些检查方式,可以有效监测后端服务器的状态,及时发现并处理故障,从而提高系统的整体性能和可用性。 ... [详细]
  • 小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限
    小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 在使用 SQL Server 时,连接故障是用户最常见的问题之一。通常,连接 SQL Server 的方法有两种:一种是通过 SQL Server 自带的客户端工具,例如 SQL Server Management Studio;另一种是通过第三方应用程序或开发工具进行连接。本文将详细分析导致连接故障的常见原因,并提供相应的解决策略,帮助用户有效排除连接问题。 ... [详细]
  • 本文详细介绍了在 Ubuntu 系统上搭建 Hadoop 集群时遇到的 SSH 密钥认证问题及其解决方案。通过本文,读者可以了解如何在多台虚拟机之间实现无密码 SSH 登录,从而顺利启动 Hadoop 集群。 ... [详细]
author-avatar
mobiledu2502886633
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有