崔校郡
(对外经济贸易大学统计学院,北京 100029)
云计算框架可以为数据库集群提供基础环境操作系统、网络、存储、计算单元可弹性配置的容器,越来越多的企业部署轻量级云计算框架[1]。IAAS层使用OpenStack方案[2],PaaS层CloudDB数据库集群单实例采用MySQL内核,每个集群由主库带多个从库对业务提供数据读写服务,但当主库故障的时候会对阻塞业务的写入造成业务写中断,尤其是在金融场景中带来交易中断等严重事故,因此必须提供高可用方案,实现故障切换并且在切换过程中确保数据不丢失,保障故障切换过程在可控的时间内完成,高可用技术方案是数据库集群最核心的技术之一,本文就高可用方案进行分析和实现。
针对传统架构的流量接入层故障,应用和管控程序是无状态的,开源云计算框架识别与恢复较容易[3],但无法根据容器内数据库实例的状态进行调度,状态与调度策略需要因业务变化而定,这是开源框架无法通过标准协议解决的问题,而且容器内数据库版本差异和状态参数也不相同,因此对数据库实例并不能简单地容器故障转移来实现高可用,开源云计算框架应对数据库高可用功能显得力不从心。
首先确认高可用要解决的问题,当提供读写服务的实例发生故障时,其故障导致无法写入,需快速对其进行处理,如果实例故障恢复环节由人工参与,由于故障的时间难预测,其故障发生时人员到位时间不可控,人工操作恢复时间较长,且受到数据库实例个数的和人工切换熟练程度的限制,当数据不一致的时候,其直接影响到服务,或者即使切换程序由系统程序实现,但程序高可用切换策略不可调整,这些因素都直接影响到服务的可用性,尤其对于金融类业务来说影响更大,因此设计动态可配置可调整的高可用功能,自动化对主库故障进行处理,快速适配不同环境业务场景需求。
实例故障切换模块目标在于保证数据服务的稳定性,其主要包括以下几方面的功能,集群故障感知:能对集群的实例故障进行快速识别,并且通过组合判断条件从库之间的状态,来识别出主实例故障;集群高可用切换:其主要包括集群主库故障切换和例行切换两部分,主库故障切换是指主库故障直接影响到服务的可用性,其需要在主库故障情况下,快速进行数据补齐、选取新主等操作,从而保证服务的可正常运行;例行主从切换:是指其在主库机器过保、非故障类异常情况下,能够通过例行的切换操作来将主库进行替换,替换后对原实例所在机器进行下线处理后续操作;所有的故障感知条件和切换步骤可配置可定制;
故障感知小于10秒,切换小于10秒,无数据丢失,故障恢复小于30秒,在数据库故障切换周期内读服务不受影响,故障实例数据恢复后能在30秒内作为从库上线提供只读服务。
高可用管控功能主要由以下组件构成:
agent:其主要对服务器或者虚机、容器内的数据库实例和数据库代理实例进行托管,负责所托管实例的创建、监控数据采集,日志管理,定时任务处理,集群拓扑收敛;
zookeeper:拓扑库,集群状态协调者与单点切换协调,主要存储单点切换的节点、拓扑相关的信息,包括节点静态信息存储:节点的网址、端口、切换权值、角色等配置、拓扑信息:集群主库、从库、备库等,协调整个故障切换的状态,对切换加锁等,防止切换过程中出现脏信息,对节点的存活状态信息进行监控;
haproxy:访问代理用于应用连接拓扑时的网址配置,应用只需要连接一个网址,而不用关心数据库拓扑具体网络配置。
主要对MySQL实例进行故障检测,由agent进行,通过重试连接数过多,识别判断机器压力大,防止出现误判;通过硬盘检测,识别出硬件故障;
通过读写请求来识别数据库压力;判断完毕实例故障后,根据实例角色触发对应的处理流程,当单实例是从库时,对写并不造成影响,摘除该实例的读服务,如果实例是主库,则需要进行故障切换,故障感知策略可配置,所有配置均放置于拓扑库中。
agent能对其托管的数据库实例进行故障感知,但是当主库机器自身异常时,其需要通过其他从库实例的状态来联合判断出主库状态,通过从库的主从状态来对集群的主库存活进行判断,如果所有从库的主从状态均异常,此时认为主库状态异常,进入单点切换流程,所有从库主从状态正常,此时需要进行二次判断,从库通过使用同步账户来重试连接主库,如果均连接失败,则认为主库状态异常,以上每个故障感知方法可以配置,每个环节的顺序和环节数可以配置、调整。
在上述联合判断出主库故障后,仍然要根据前后故障感知和当前集群副本数来进行二次判断,防止集群因为频繁切换导致雪崩,或者因为容量不足导致集群切换后仍然无法使用的情况,该流程对整个集群的切换状态进行二次判断,其主要包括两类:两次切换时间间隔,防止因为网络频繁抖动,或者因为业务流量暴增导致主库频繁故障,此时如果频繁进行切换,导致雪崩无主库可用;集群当前副本数:当集群的副本数少于期望的容量副本数时,其不进行切换,防止切换后,读写请求容量不足导致整个集群异常,以上集群拓扑变化感知策略可配置。
拓扑库在单点切换过程中主要进行拓扑信息存储和状态协调,具体包括五种信息,分别是静态节点信息,主库存活标识,单点切换标识,又处于正常、切换、故障三种状态,动态节点信息,拓扑信息。
旧主库设置只读->所有从库设置只读,并且判断是否完成同步,未完成数据同步则继续等待,判断的依据是根据事务编号与主库的最大事务编号进行比较判断,事务日志格式采用的是ROW格式,如果同步完成则停掉与主库的数据同步进程->新主库给所有从库新增同步账户授权并设置可写->动态修改代理配置文件->所有从库建立到新主库同步连接,如果有错误应从拓扑中删除该从库节点->完成切换。
所有从库设置只读,并检查所有从库的事务编号,从所有从库的事务编号中找到最大值作为数据最多的从库实例,并记录该实例作为期望新主库->补齐数据,所有从库中其他从库从数据最多的实例中同步数据,数据同步方法采用原生的主从同步方法,待所有从库事务编号一致后,数据补齐步骤完成->选取数据库量最多节点为主库->动态修改代理配置文件->所有从库建立到新主库同步连接,如果有错误应从拓扑中删除该从库节点->完成切换。
保障数据不丢失是切换过程的首要任务,不同的数据库实例获取事务日志后回放事务日志的速度可能不尽相同,必须保障所有的从库都能回放事务完成后再进行新主库的开写,所有的从库与新主库的事务编号差异对比,通过事务编号比较,获取到差异集合后,从库获取这些差异的事务编号所在的事务日志文件并回放,经过多次切换的集群事务编号可能由多段字符串组成,这样需要获取到每段的事务编号对应的事务日志进行回放,如果新主库的事务编号对应的事务日志文件已经由于过期而不存在了,则未回放完毕的从库造成数据同步中断,这时候会导致切换过程中断无法继续后续进程,为了避免数据不一致默认是不跳过这些差异事务的回放,而是通过在线拉取主库数据副本,拉取的时间可能会导致切换时间变长,但保障了数据的一致性。
本文提出并实现了轻量级CloudDB高可用方案,采用可配置的故障检测策略和高可用故障切换策略,能够保障在实例故障时,业务在无感知或者阻塞写入极短的时间内恢复业务的写入操作,切换过程数据无丢失,整个流程均是可配置,能够快速的适配多个场景,可以使用在单机房、同城双活、异地容灾、两地三中心等多个场景中,可以是小型私有云,公有云,也可以是混合云,在提供云计算服务的服务栈中,可以部署在客户业务的服务中,也可以部署在系统支撑的服务中。