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

分布式框架之高性能:Redis哨兵模式

要实现Redis的真正高可用,我们需要完成主从架构下的故障自动转移。Redis官方提供了一套RedisSentinel机制,用于当主节点出现故障时,自动完成

本文首发于Ressmix个人站点:https://www.tpvlog.com

我们在搭建Redis的主从架构时,主节点一旦由于故障不能提供服务,需要人工将从节点晋升为主节点,同时还要通知应用方更新主节点地址,对于很多应用场景这种故障处理的方式是无法接受的。

要实现Redis的真正高可用,我们需要完成主从架构下的故障自动转移。Redis官方提供了一套Redis Sentinel机制,用于当主节点出现故障时,自动完成故障发现故障转移

一、基本架构

哨兵模式下,我们需要配置一些哨兵节点(为了保证哨兵自身高可用,至少部署3个哨兵节点),这些哨兵节点构成了一个集群,监控着普通的主从节点的状态:

Redis Sentinel包含了若干个Sentinel节点,这样做也带来了两个好处:①对于节点的故障判断是由多个Sentinel节点共同完成,这样可以有效地防止误判;②即使个别Sentinel节点不可用,整个Sentinel集群依然是可用的。

哨兵模式提供了以下核心功能:

  • 监控:每个Sentinel节点会对数据节点(Redis master/slave 节点)和其余Sentinel节点进行监控;

  • 通知:Sentinel节点会将故障转移的结果通知给应用方;

  • 故障转移:实现slave晋升为master,并维护后续正确的主从关系;

  • 配置中心:在Redis Sentinel模式中,客户端在初始化的时候连接的是Sentinel节点集合,从中获取主节点信息。

二、基本原理

2.1 监控

Sentinel节点需要监控master、slave以及其它Sentinel节点的状态。这一过程是通过Redis的pub/sub系统实现的。Redis Sentinel一共有三个定时监控任务,完成对各个节点发现和监控:

  1. 监控主从拓扑信息:每隔10秒,每个Sentinel节点,会向master和slave发送 INFO
    命令获取最新的拓扑结构;

  2. Sentinel节点信息交换:每隔2秒,每个Sentinel节点,会向Redis数据节点的 __sentinel__:hello
    频道上,发送自身的信息,以及对主节点的判断信息。这样,Sentinel节点之间就可以交换信息;

  3. 节点状态监控:每隔1秒,每个Sentinel节点,会向master、slave、其余Sentinel节点发送 PING
    命令做心跳检测,来确认这些节点当前是否可达。

2.2 主观下线(sdown)

每个Sentinel节点,每隔1秒会对数据节点发送 ping
命令做心跳检测,当这些节点超过 down-after-milliseconds
没有进行有效回复时,Sentinel节点会对该节点做失败判定,这个行为叫做主观下线。

2.3 客观下线(odown)

客观下线,是指当大多数Sentinel节点,都认为master节点宕机了,那么这个判定就是客观的,叫做客观下线。

Sentinel认为主观下线之后通过发送 sentinelis-master-down-by-addr*
来确认主节点是否客观下线。

参数意义
ip/port当前认为下线的主节点的ip和端口
current_epoch配置纪元
run_id*标识仅用于查询是否下线
有值标识该哨兵节点希望对方将自己设置为leader
询问时用*,选举时用run_id

那么这个大多数是指多少呢?

这其实就是分布式协调中的quorum判定了,大多数就是过半数,比如哨兵数量是3,那么大多数就是3/2+1=2个,哨兵数量是5,大多数就是5/2+1=3个。Redis有一个参数 quorum
用于配置这个大多数数量。

Sentinel节点的数量至少为3个,否则不满足quorum判定条件。

2.4 哨兵选举

如果发生了客观下线,那么哨兵节点会选举出一个Leader来进行实际的故障转移工作。Redis使用了Raft算法来实现哨兵领导者选举,大致思路如下:

  1. 每个Sentinel节点都有资格成为领导者,当它认为主节点客观下线后,会向其他Sentinel节点发送 sentinelis-master-down-by-addr
    命令,携带 run_id
    要求自己成为领导者;

  2. 收到命令的Sentinel节点,如果没有同意过其他Sentinel节点的 sentinelis-master-down-by-addr
    命令,将同意该请求,否则拒绝(每个Sentinel节点只有1票);

  3. 如果该Sentinel节点发现自己的票数已经大于等于 MAX(quorum,num(sentinels)/2+1)
    ,那么它将成为领导者;

  4. 如果此过程没有选举出领导者,将进入下一次选举。

2.5 故障转移

选举出的Leader Sentinel节点将负责故障转移,也就是进行master/slave节点的主从切换。故障转移,首先要从slave节点中筛选出一个作为新的master,主要考虑以下slave信息:

  1. 跟master断开连接的时长:如果一个slave跟master的断开连接时长已经超过了 down-after-milliseconds
    的10倍,外加master宕机的时长,那么该slave就被认为不适合选举为master;

  2. slave的优先级配置: slave priority
    参数值越小,优先级就越高;

  3. 复制offset:当优先级相同时,哪个slave复制了越多的数据(offset越靠后),优先级越高;

  4. run id:如果offset和优先级都相同,则哪个slave的run id越小,优先级越高。

接着,筛选完slave后, 会对它执行 slaveofnoone
命令,让其成为主节点。最后,Sentinel领导者节点会向剩余的slave节点发送命令,让它们成为新的master节点的从节点,复制规则与 parallel-syncs
参数有关。

Sentinel节点集合会将原来的master节点更新为slave节点,并保持着对其关注,当其恢复后命令它去复制新的主节点。

Leader Sentinel节点,会从新的master节点那里得到一个 configuration epoch
,本质是个version版本号,每次主从切换的version号都必须是唯一的。其他的哨兵都是根据vetsion来更新自己的master配置。

三、总结

本章,我介绍了Redis哨兵模式的原理。在生产环境中,哨兵模式非常常用,一般都会按照一主多从+哨兵模式来部署Redis。




推荐阅读
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 阿里巴巴终面技术挑战:如何利用 UDP 实现 TCP 功能?
    在阿里巴巴的技术面试中,技术总监曾提出一道关于如何利用 UDP 实现 TCP 功能的问题。当时回答得不够理想,因此事后进行了详细总结。通过与总监的进一步交流,了解到这是一道常见的阿里面试题。面试官的主要目的是考察应聘者对 UDP 和 TCP 在原理上的差异的理解,以及如何通过 UDP 实现类似 TCP 的可靠传输机制。 ... [详细]
  • 在《Linux高性能服务器编程》一书中,第3.2节深入探讨了TCP报头的结构与功能。TCP报头是每个TCP数据段中不可或缺的部分,它不仅包含了源端口和目的端口的信息,还负责管理TCP连接的状态和控制。本节内容详尽地解析了TCP报头的各项字段及其作用,为读者提供了深入理解TCP协议的基础。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限
    小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限 ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 独家解析:深度学习泛化理论的破解之道与应用前景
    本文深入探讨了深度学习泛化理论的关键问题,通过分析现有研究和实践经验,揭示了泛化性能背后的核心机制。文章详细解析了泛化能力的影响因素,并提出了改进模型泛化性能的有效策略。此外,还展望了这些理论在实际应用中的广阔前景,为未来的研究和开发提供了宝贵的参考。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 如何撰写适应变化的高效代码:策略与实践
    编写高质量且适应变化的代码是每位程序员的追求。优质代码的关键在于其可维护性和可扩展性。本文将从面向对象编程的角度出发,探讨实现这一目标的具体策略与实践方法,帮助开发者提升代码效率和灵活性。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
author-avatar
仔仔衰才_887
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有