Vastbase G100核心技术介绍之高可用软件实现原理
导语
为解决Vastbase数据库的单点问题,海量数据设计了一套高可用解决方案,为此引入了Vastbase高可用软件(下文简称HAS),本文围绕HAS实现原理进行说明。
高可用解决方案
Vastbase高可用解决方案包含三个组件,分别是DCS、HAS、Vastbase;基于该方案,可以实现一个Vastbase一主多备的高可用集群(多8个备库),以下分别说明三个组件的作用。
01
DCS
DCS是一个键值存储系统,主要应用于共享配置和实现服务发现的分布式、一致性,其底层使用的是 raft 算法(一种共识算法,有兴趣的读者请自行查阅其他资料,本文不进行详细介绍)来实现多副本数据的强一致复制。
在本方案内,我们部署一个3节点的DCS,这样既能避免了DCS的单点问题,又能避免脑裂问题。对于同一个路径的键,raft共识算法能保证只有一个客户端能成功创建该键值的路径,这是HAS实现选择主节点的关键技术,在HAS成为主节点时,会在DCS内一个创建特定路径的键并写入一个标识主节点的值,这个键我们称为leader key,我们称创建leader key这个动作为获取leader key,HAS成为创建leader key并成为主节点我们定义为持有leader key。
02
Vastbase
Vastbase提供数据读写访问的功能以及主备节点间基于wal流复制功能。本方案基于Vastbase的流复制功能实现数据冗余,即主库把wal发送到备库,备库通过回放wal实现主备节点之间的数据复制。基于wal的流复制功能本文不作详细介绍,请读者自行查询其他资料。
03
HAS
HAS是一个周期性运行的Vastbase状态监控软件,它在每个周期内自动检测本地Vastbase数据库可用性状态,并且当主库不可用时自动计算并选择合适备库,并把该备库提升为主库。当一个节点异常后重新加入集群时,它会先修复该节点然后再加入高可用集群。
上图是一个典型的一主两备的Vastbase高可用部署方案,每个HAS进程都监控着本地Vastbase数据库进程。
HAS实现原理
HAS需要解决两个问题:
01
保证集群的正常
在说明HAS如何保证集群正常前,我们先明确如何判断一个集群是否正常。实际上我们的判断条件非常简单,就是集群内是否有节点持有leader key。
需要说明的是,集群正常并不等于集群能提供正常的数据库服务,例如当数据库打开同步提交(synchronous_commit=on)但是大可用模式关闭(most_available_sync=off),当集群内只有一个主节点并且该节点持有leader key,此时对于HAS来说,集群状态是正常的,但由于不存在同步备库,数据库在写操作时会被阻塞。根据上述说明,我们得知保证集群正常的主要任务就是,保证集群内有节点持有leader key,这就是如何选择主节点的问题。
一个节点被选择为主节点必须符合两个条件:
本地数据库是集群内健康的节点;
HAS持有leader key。
当集群出现故障(即主库不可用或不存在主库),HAS则先判断自身监控的Vastbase数据库是否健康的节点,判断逻辑是通过对比所有节点的LSN(Log Sequence Number,即Vastbase数据库当前已产生或接收的wal日志的大小),如果本数据库节点的LSN大,则说明是健康节点,如果是健康节点,则尝试获取leader key,并设置leader key的租期(设置租期的目的在主库宕机后能够自动释放leader key,此时其它节点就能获取leader key,触发集群故障自动处理)。
获取leader key成功后,执行Vastbase数据库的failover命令(vb_ctl failover)把数据库提升为主库。
02
保证副本的正常
在高可用集群内,备库是主库的一个副本,可以在主库不可用时被提升为主库,因此备库是否正常运行也是非常重要的。
HAS判断备库是否故障的依据是判断Vastbase进程的pid文件存在以及记录的pid进程是否存在。对备库故障的处理,监控程序先执行Vastbase数据库的build命令(vb_ctl build)build命令先增量build,增量build失败后执行全量build,build完成后启动备库即可。
HAS运行流程
HAS在每一个周期内运行如上图所示的处理流程,描述如下:
HAS访问DCS进程,检查leader key是否存在,如果存在,进入步骤2,否则进入步骤5;
HAS判断自身是否持有leader key,如果是,说明本节点是集群的主节点,结束本次循环,否则进入步骤3;
HAS检测Vastbase数据库是否健康(即Vastbase数据库进程是否正常运行),如果Vastbase数据库健康,Vastbase数据库继续以备库的方式运行,HAS结束本次循环,否则进入步骤4;
HAS执行Vastbase数据库提供的vb_ctl build命令修复Vastbase数据库实例,Vastbase数据库以备库的方式运行,HAS结束本次循环;
HAS判断Vastbase数据库是否集群内健康的节点(通过比对集群内所有节点的Vastbase数据库的LSN,LSN大的即为健康),如果Vastbase数据库是健康节点,则进入步骤6,否则进入步骤7;
HAS访问DCS进程,尝试获取leader key(即在DCS内创建leader key路径的键),如果获取leader key成功,执行Vastbase数据库提供的vb_ctl failover命令把Vastbase数据库提升为主库,HAS结束本次循环,否则进入步骤7;
HAS等待集群内新的leader产生,当新的leader产生后,HAS执行Vastbase数据库提供的vb_ctl build修复备库,Vastbase数据库以备库的方式运行,HAS结束本次循环。
实现效果
在上文已经提及过,本方案中Vastbase提供数据读写访问的功能以及主备节点间基于wal流复制功能。在没有实施本高可用方案前,基于wal流复制搭建Vastbase一主多备时面临以下三个问题:
无法快速检查到Vastbase数据库是否发生故障,这会造成数据库服务有可能长时间无法提供服务;
当存在多个备库时,选择哪个备库作为新主库合适;
failover需要人工操作,存在一定的误操作可能性。
该高可用集群方案,可以自动检测数据库的可用性状态,并且当主库不可用时,尽可能快地选择适合的备库作为新主库,从而极大提高了数据库服务的可用性,并且避免了人工误操作。
原文链接:https://mp.weixin.qq.com/s/j48vHLSlIeUDmBUeuBpxfQ
相关文章