#YashanDB高可用概述
高可用( High Availability ),简称HA, 通常是指通过各种技术手段减少系统不能提供服务的时间,保障业务连续性。如果系统每运行100个时间单位中有1个时间单位无法提供服务,则系统的可用性是99%,实际场景中,大多数企业追求的系统可用性目标是尽量接近100%,即7*24小时不间断运行。
YashanDB的高可用架构主要从以下几方面设计,以助力企业达到上述目标:
- 主备部署,主备实例部署在不同主库上,连接到同一交换机,确保网络低时延,保证高可用避免单点故障。
- 级联备部署,部署在异地的异步备库,减少主库带宽负载,保证高可用实现异地容灾。
- 主库节点不可用时,从备库节点自动选举升主,实现发生故障时的自动切换。
- 共享集群部署中,多实例采用多活部署方式,通过客户端TAF技术和服务端故障自动切换能力,保证集群数据库高可用。
- 共享集群的主备部署,主备集群部署在不同地点,构建集群容灾环境。
- 备份恢复,作为数据库管理的日常手段,保障数据库的数据安全性,是最基础的高可用能力。
# 主备部署
主备复制是数据库最主要的高可用手段,通过将主库上的数据实时复制到备库来实现。主库是执行业务的数据库实例,备库是复制主库数据的数据库实例。当主库发生故障时,业务可以转移到备库上继续执行,降低故障对业务的影响,提高数据库的可用性。
主库:
数据库主节点,当前提供在线数据库服务,读写模式。
备库:
数据库副节点,从主库接收日志并回放,只读模式,主库故障时从备库状态切换为主库状态,一个主库可以多个备库。
共享集群部署中,上述主备库被扩展为主备集群的概念,主集群多实例同时提供在线服务,并同时向备集群的1号实例传送日志,备集群的1号实例上启动多线程接收主集群所有实例日志并回放。
# 主备复制链路
主库向备库的实时数据复制通过传送redo日志来实现,如下图:
主备库复制链路:
主备集群复制链路:
1.日志发送
包括SYNC同步传送和ASYNC异步传送两种模式:
- SYNC同步传送:主库从Log Cache中读取数据发送至备库,性能较高。
- ASYNC异步传送:主库从redo文件读取数据发送至备库,一般适用于异地备库。
日志发送采取SYNC还是ASYNC模式,由系统自动选择。
2.日志回放
备库通过重演主库发送过来的redo日志来恢复数据页面,以达到和主库的及时同步。
当在Log Cache和redo文件中均未找到需要的数据时,将启动线程同步主库的归档日志文件到备库并从中查找所需数据,最大程度保障主备库的数据一致性。
# 保护模式
主备复制基于网络传输,势必存在一定的延迟和不稳定性,YashanDB提供三种不同的保护模式供选择配置,由用户根据自身对性能或是对数据安全的偏好来决策采用合适的主备复制模式。
最大保护模式
此种模式下,主库事务提交后,必须等待同步备库将对应日志刷盘后,才能向客户端返回事务提交成功。该模式的优点为,如果主库故障,同步备库升主后可以保证数据不丢失;缺点为,如果同步备库断网或故障,将阻塞主库业务。
最大性能模式
此种模式下,主库事务提交无需等待备库复制结果,提交后即向客户端返回事务提交成功。该模式的优点为,主库性能较高,且备库断网或故障不会影响主库业务;缺点为,如果主库故障,备库升主后可能发生数据丢失。
最大可用模式
此种模式下,当任意同步备库连接正常时,采取最大保护模式,当所有同步备库断网或故障时,采取最大性能模式。最大可用模式提供尽可能的数据保护,和主数据库的可用性,但也存在数据丢失风险。
Note:
分布式部署中的MN组固定使用最大保护模式(最大支持一主四备),最大程度地保障数据不丢失,无需用户配置。
# 主备切换
YashanDB支持在主备库均正常的情况下执行Switchover,也支持在主库异常的情况下执行Failover。
Switchover
Switchover在备库上执行,执行时要求主库和备库的网络连接正常,且主库和备库实例均处于OPEN状态。
启动Switchover后系统执行流程如下:
Failover
Failover在备库上执行,执行时要求备库实例处于OPEN状态,此时由于主库故障,备库的redo日志可能没有完全与主库同步,从而丢失数据,所以Failover后需要重置redo时间线,以便区别旧主库和新主库的redo日志。
启动Failover后系统执行流程如下:
# 级联备部署
级联备,即备库的备库,它和普通备库的区别是,普通备库从主库接收日志,而级联备从其上级备库接收日志。
当某个级联备的上级备库升为主库后,该级联备转为普通备库;当主库切换为备库后,它的备库将变成级联备。
级联备一般被应用到异地容灾部署中,如下图:
一个备库最多可连接32个级联备,级联备可以继续向下连接级联备,没有层数限制,但不可以成环连接。
级联备模式适用于单机部署,分布式/共享集群部署中无此种模式。
主备切换
由于级联备未直接与主库连接,因此不能对其执行Switchover,只能执行Failover。但如果级联备的上级备库执行了Switchover,则该级联备的角色将发生变化,而主备切换以系统中当前的角色状态为准,如下图:
# 自动选主
自动选主是在分布式集群节点组和单机一主多备(大于一个备库)部署形态下,当主库节点发生异常不能对外服务时候,系统通过一定机制,在多个备库节点间选举一个节点提升为主库,其余节点依然为备库,旧的主库降级为备库。
在YashanDB中,是否启用自动选主通过开关控制,关闭时,主备切换由用户自行选择一个备库执行Switchover或者Failover;打开时,用户仍可自行选择一个备库执行Switchover,而当主库故障时,则由系统启动自动选主并执行Failover。
自动选主机制
YashanDB的自动选主基于Raft协议实现,采用Raft一致性算法中的选举算法:
- 每个Leader都有任期(Term),在没有故障时,任期是无限期的;
- Leader周期性向Follower发送心跳消息;
- Follower在一个选举超时时间内没有收到Leader的心跳消息则成为PreCandidate,发起预选举;
- 当PreCandidate发现它能够获得大多数数据库的选票时,将会切换到Candidate,发起选举并增加任期;
- Candidate的投票请求被多数数据库通过(赞成票)之后,将自己提升为主节点;
- Candidate投票未通过则进入下一轮选举直至当选为Leader或其它节点被选为Leader;
- 如果Leader接收到大于自己任期的心跳消息或投票请求,则降为Follower。
实现流程如下图所示:
Quorum机制
YashanDB的Raft选举算法在最大保护模式下启用了Quorum机制进行选主,投票规则为:
- 节点LFN(Log Flush Number)大于等于自身,向该节点投赞成票。
- 节点任期(Term)大于等于自身,向该节点投赞成票。
节点优先级
- 满足Quorum机制的前提下,节点优先级(HA_ELECTION_PRIORITY)大于等于自身,向该节点投赞成票。
选主规则为:
- QUORUM_SYNC_STANDBY配置为MAJORITY时:
- Candidate需要收到多数派节点
(N/2 +1)
的赞成票才能成为主节点。
- Candidate需要收到多数派节点
- QUORUM_SYNC_STANDBY配置为指定同步的备库数量时:
- 当syncNum >=
[N/2]
时,Candidate 需要收到(N/2 +1)
的赞成票才能成为主库。 - 当syncNum <
[N/2]
时,Candidate 需要收到(N - syncNum)
的赞成票才能成为主库。
- 当syncNum >=
其中N为节点数量,syncNum为用户定义的同步备数量。
拓展能力
- 自动降备(HA_ELECTION_LEADER_LEASE_ENABLED),在开启自动选主场景下,主节点在未收到多数派备库心跳响应时主动降备的功能。通过HA_ELECTION_LEADER_LEASE_ENABLED参数控制开关。
- 自动换主(HA_ELECTION_AUTO_PRIMARY_SWITCH),在开启自动选主场景下,主节点在发现高节点优先级节点时主动降备,让高节点优先级节点升主的功能。通过HA_ELECTION_AUTO_PRIMARY_SWITCH参数控制开关。
上述机制下,主备多节点构成了一个Raft集群,该集群需按指定要求预先搭建。
# yasom仲裁选主
yasom仲裁选主是在分布式集群节点组和单机一主一备部署形态下,当主库发生异常不能对外服务时,系统通过yasom仲裁,将备库升为主库,并将原主库降为备库。
开启仲裁选主后,仅支持用户通过yasboot node switchover
命令切换主备;当主库出现故障时,将由yasom自动切换主备,用户无需且无法执行Failover。
可根据需要选择是否启用yasom仲裁选主。
# CN多活部署
分布式部署中,在CN组部署多个节点,同时提供在线服务,可以提高CN服务的可靠性,当某个节点出现异常时,其他节点仍可用,对系统整体不构成影响。
同时,YashanDB支持对CN组进行在线扩缩容,让用户根据业务负载和资源状况对CN多节点能力进行灵活调整。
# 备库在线扩缩容
当某个备库由于本身故障或网络问题等因素导致不可用时,会影响HA的正常运行。因此YashanDB支持在线增删备库,可踢出问题节点,保障HA正常使用。
# 并行build备库
YashanDB支持在备库上发起build操作,进行备库的初始化。当新建一主多备,或者在线增加多个备库时,使用并行build可以大大提升部署效率。
并行build由主库指定多台备库发起build操作,主库同时向多台备库发送数据(满足主备部署允许的最大备库数据量限制),多台备库同时执行restore。级联备的并行build则由其上级备库发起。