超大规模数据库集群保稳系列之一:高可用系统
- 00 出品人说
- 01 高可用简介
- 1.1 面临的挑战
- 1.2 发展历程
- 02 高可用部署
- 2.1 高可用架构(数据流、控制流)
- 2.2 高可用部署(HA Core、微服务、数据层)
- 03 重点模块设计
- 3.1 故障发现(减少漏判、降低误判)
- 3.2 故障选举(选举因子、选举策略)
- 3.3 数据一致性(四个风险及解决方案)
- 3.4 多机房高可用
- 3.5 配置下发(双Region下发)
- 04 未来思考
00 出品人说
在数据库集群规模迅速扩大的背景下,如果出现故障,如何快速恢复成百甚至数千个集群的数据和服务,是很多大型互联网企业面临的重要挑战。线上部署了几十万的微服务,数据库结构和拓扑随时在发生变更,系统重构、内核升级、硬件设备汰换、机房搬迁等等,也都会对数据库的稳定工作产生一定的影响。作为整个IT系统中最为重要、最为底层的服务,即便遇到了极小概率事件的冲击,也会造成非常大的影响。对美团数据库团队来说,“低垂的果实已经摘完”,我们开始着力应对这些小概率事件对业务造成的冲击。 数据库稳定性保障的破局之道:一方面是提升平均无故障间隔( MTTF ),另一方面是提升应急响应能力,即缩短平均修复时间( MTTR )。在这两个目标的指引下,美团数据库团队从能力驱动和故障驱动两个维度来构造整个稳定性保障的闭环体系。 从能力驱动的角度,我们借鉴了Google的稳定性保障体系。在最底部的三层,通过故障演练/预案建设、复盘、可观测性的维度,思考怎么缩短故障处理时长;中间四层更多的是围绕研发需求、设计、上线、变更管控来降低故障的发生概率;顶层是产品运营,即通过面向内部用户的运营,指导业务对数据库进行选型和合理的使用,不断提升产品和平台易用性,并针对业务特点提供相应的解决方案。 从故障驱动的角度来说,包含事前预防和发现,事中故障定位,事后恢复、复盘和改进等等。从事前、事中、事后的全生命周期以及软件开发的各个阶段,全面提升管控和应急响应能力。01 高可用简介
| 1.1 面临的挑战
首先分享下美团数据库高可用面临的问题和挑战,主要从3个层面进行展开: 第一个挑战是实例增长越来越快。下图1截取了2019年1月到2022年1月的数据,可以明显地看到实例规模的增长非常迅速,在大规模场景下,如何保证每一个实例的高可用性是一个非常大的挑战。大家都知道,保障几台机器稳定运行,跟保障几万台甚至几十万台机器的稳定运行,其复杂度完全不在一个量级。- “L0-L1”这两个等级侧重面向常规容灾,是实例级容灾。
- “L2-L3”这两个等级侧重面向AZ容灾,相比L1有非常大的跨越,因为既要解决“L0-L1”面临的常规容灾问题,还要解决一个很核心的问题,即整高可用自身是否能够快速恢复,以及高可用依赖的下游服务是否具备容灾切换能力。由于高可用本身是一个系统,它有数据面和控制面,有上下游依赖,所以先保证自己是可用的,才能保证数据库的RTO和RPO。
- L4,从L3到L4又有一个很大的跨越,因为L3的规模是相对可控的,而L4直接是断AZ的网络,AZ的大小不同,它的规模更大,更贴近真实的AZ故障。
| 1.2 发展历程
接下来,分享一下美团高可用系统发展历程。总的来说,美团的高可用发展历程是根据不同的阶段的矛盾和挑战,做出的相应解决策略和方案。到目前为止,有三次比较大的系统架构迭代:- 第一代架构是2015年之前,称为MMM( Multi-Master Replication Manager for MySQL ),该架构包括接入层VIP、Agent和Manager,这架构本身存在很多问题,比如VIP接入无法支持跨机房、跨网段;Agent和实例绑死,本身也没有高可用,维护起来比较困难;Manager还是单点。
- 第二代架构是2015-2019年,称为MMHA( Meituan Master High Availability ),是在MHA的基础上结合美团数据库生态定制的架构,解决了第一代架构中VIP接入和Agent误判的一些问题,但在2019年以后,由于实例规模变得很大且增长迅速,该架构管理起来异常复杂,Manager是单点没有解决自身的高可用。同时,2019年整个PAAS在演练机房故障,所以当时这个架构逐渐暴露出各种稳定性问题。
- 第三代架构是2019年,新开了基于Orchestrator定制的高可用系统,实际开始时间是2018年,2019年开始灰度。当时MGR在业界已经有些公司在使用,MGR通过分布式协议来解决高可用难题,我们对此进行了深入的思考:我们是否能引入一个类似分布式协议解决高可用系统面临的问题,本质上就是把MGR中内置的分布式协议放到高可用系统实现。
02 高可用部署
| 2.1 高可用架构(数据流、控制流)
这部分主要分两条线:控制流和数据流。- 数据流 :如果业务应用要访问数据库,它是如何拿到数据的,一个SQL过来是如何把数据返回回去的,业务应用通过访问中间件看到MySQL的拓扑,数据流比较简单,也是业界比较通用的做法。
- 控制流 :业务应用要通过访问中间件来访问到正常数据库拓扑,需要用高可用组件来解决故障转移难题。
| 2.2 高可用部署(HA Core、微服务、数据层)
下面我们围绕4个高可用组件来展开介绍一下,高可用部署在应对AZ级容灾或Region级容灾的策略。- 同步服务 :简单来说,我们的工程师在RDS申请集群或DB之后的信息会全部同步注册到HA Core服务里面去,相当于HA Core是一个“八爪鱼”,它能发现这些信息。
- 任务调度 :它也包括API Service、Scheduler和Worker,主要做状态机任务执行。这两个服务都是多Region、多机房部署,它们本身没有状态。
- 配置中心 :业务应用访问中间件和高可用之间的数据同步纽带,是MySQL的节点发现和处理的核心组件,是双Region部署,有自己的组件,比如有API、Config和Consistency。
03 重点模块设计
| 3.1 故障发现(减少漏判、降低误判)
故障发现有两个核心指标:- 第一个指标是 不要漏判 ,如果故障没有判断,那RTO其实根本就不生效。
- 第二个指标是 降低误判 ,因为我们知道RTO不可能等于0,即RTO一定对业务有影响,如果一天误判几次,那对业务是无法接受的,对业务是有损的。
| 3.2 故障选举(选举因子、选举策略)
所谓故障选举一定是多个从库,一主一从不存在选举。美团的MySQL集群现状是一主多从,所以选举异常复杂,因为我们要保证容灾N+1、多AZ甚至多Region部署,选举时选谁做主库就非常重要,主要有两个影响因素:选举因子和选举策略。选举因子+选举策略 = 决定谁是新主。 (1)选举因子是影响选举的核心要素,一次故障有20多个选举因子会共同影响如何排序。- 如图11( 主库M,从库S1、S2、S3、S4四个实例 ),S2的选举规则(promotion rule)是一票否决的Must Not,那它一定不能做主库,即使选不出来其他,它也做不了主库。
- S1和老主库是同AZ的即都是AZ1,S1比AZ2的S3和S4有更高优先级,即更大的机会作为新主。
- S4权重100,S3权重90,S4比S3权重更高,即使S4是独享容器,它也有更高的选举权。
| 3.3 数据一致性(四个风险及解决方案)
为什么要保证数据一致?在我们现在这种规模的业务场景下,可用性优先策略已经没办法覆盖所有的业务场景,但是在主从架构下面,数据丢失又无处不在,参考图12为例,数据丢失的风险点比较多:- 问题1,可能binlog未实时落盘。
- 问题2,IO线程没拿到最新数据。
- 问题3,SQL线程没有和IO线程对齐,包括从库之间binlog位点也不一样。
- 问题4,从库不完整事务问题,在主库事务提交时它是完整的,但是它通过IO线程同步给从库时不是按事务粒度去同步而是按事件event粒度同步,如果事务未完整接收也可能会产生数据丢失不一致。
- 针对问题3和问题4,其实归纳一下就是说只要有从库拿到数据,不管是否对齐,我们是有策略能够保证一致性,这个策略叫S1,只要数据同步过去了则就可以通过S1保证一致性。
- 针对问题2,就是主库Event,没有任何一个从库有获取全,这种情况必须解析老主库binlog以及计算binlog位点并获取到数据,并在切换中补齐数据,即在开放给业务写流量之前,会将数据给新主库补全保证一致性,这个策略叫S2。
- 但S1+S2也不能保证0RPO,服务器宕机时拿不到老主库binlog,没有办法计算、解析和处理,不能保证0RPO,大概有20%到30%的比例。
- 可用性优先 :可根据业务特性自定义,承诺RTO不保证RPO。
- 一致性优先 :可根据业务特性自定义,保证RPO但不会无限制,RTO会控制上限。
- 不可控因素 :事务大小、延迟、事务完整性等。
| 3.4 多机房高可用
常规场景,Leader故障后会在4秒之内快速选举一个新Leader出来继续工作,但也有一些场景,如下图15所示,MySQL Master和HA 的Leader都在AZ1,如果AZ1宕机之后怎么办?其实就出现右边这个图。老Leader在处理AZ1里的MySQL节点故障的同时,由于自身Leader也在AZ1,会中断老Leader的处理状态机并选举一个Leader,但新Leader并不知道老Leader状态机如何处理,就直接导致切换的失败。- 状态同步 :Leader实时将状态机通过Raft同步到所有的Follower节点
- 临界状态 :根据执行代价确定的状态机临界点
- 回滚 :新Leader执行状态机回滚,包括对应的操作
- 继续 :新Leader继续执行老Leader的状态机
| 3.5 配置下发(双Region下发)
由于配置服务是双Region部署,分为同Region下发和跨Region下发。同Region下发会写到存储层,而config-server会更新最新配置,将配置并推送到客户端。跨Region下发,比如说北京、上海和深圳都有业务服务节点,最终把它推送下去的时候也会走一致性服务( Consistency-Server ),即一旦某个Region更新后,我们会把数据推送到另一个Region里,Region之间的数据完全一致,如果另外一个的Region有业务服务节点,就会继续走同Region下发流程。04 未来思考
最后,分享一下对高可用未来的一些思考,主要包括以下三个方面:- 提升容灾能力,主要是AZ级容灾和Region级容灾 。这两方面我们还在建设中,AZ级容灾需要减少依赖,不能减少的需要AZ级闭环独立部署,以及提升大规模并发处理的能力等;Region级容灾方面,我们在做一些单元化的思考和方案,尽量让包括数据层等所有服务闭环,不要跨区域访问。
- 去中心化架构 。业界也有数据库把高可用内置到MySQL,如MGR,内置到MySQL有非常多的优势,但对于美团一主多从架构是现状前提。另外,MGR架构对网络抖动的容忍度较低,以及对请求延时有一些增加,导致大部分业务场景没法接受。所以,我们在做另外一种思路,即把高可用内置到Proxy进程,让Proxy自带数据库高可用的能力,跟内置到MySQL的思路类似。
- 去依赖化、集群化 。将HA的Service、Scheduler和Worker及配置中心等下游依赖去掉,希望内置到Proxy进程后,内部数据通过Raft/Gossip协议同步而不再依赖中心化服务,让它完全做集群化,这也是我们2023年在思考的策略。
---------- END ----------
推荐阅读
| 数据库异常智能分析与诊断 | 数据库全量SQL分析与审计系统性能优化之旅 | 基于AI算法的数据库异常监测系统的设计与实现