张西来 阿里云智能GTS-SRE团队 技术服务经理

曾就职于某国产数据库厂商,有10多年数据库技术支持工作经验,精通多款数据库产品,为国内多个大中银行核心数据库提供技术支持。目前就职于阿里云智能GTS-SRE团队,负责云数据库的高效运维和管理工作。

上期本文介绍了MySQL如何保证主从一致。阿里云RDS是以一主一备或一主多备的形式部署,目的是为了防止主库发生故障后的高可用,主备库之间使用同步或半同步的方式进行实时数据同步,HA模块负责监测主备之间的状态,当出现问题时也是由这个模块发起故障切换的动作。本文将简单介绍HA模块的功能。

1.健康检查

健康检查是用来检测实例主备状态,HA使用update语句通过VIP、物理机IP地址对主库进行检测,这样检测的优点为可以探测出整条链路的可用性,同时配合检测备库IO线程的健康状况,避免HA与主库间网络故障时的误判。每次update 成功时,HA都将主库的时间戳记录到HA当中,同时更新主备库的心跳表,让备库同步主库写入的时间戳,当发生切换时,对比HA中与实例备库中保存的时间戳,可以得到备库大致的延迟。作为主备延迟的判断依据之一。

2.正常切换

当发生实例版本升级,规格升级,刷新实例参数等情况时,需要对实例做主备切换。切换基本步骤如下:

(1)预检查主备延迟,如果延迟较大,那么直接退出切换,等待下次切换。

(2)如果延迟在一定范围内,那么进入切换流程,调用proxy api 切换VIP 指向备库。Proxy 此时会hold 住用户新的连接和请求,不会访问备库。

(3)kill主库连接,设置read_only参数为ON。等待主库瞬间连接上来的事务结束。

(4)读取主库master binlog 的位点信息,等待备库同步到该位点,由于之前进行过预等待所以此步骤不会等待很长时间,根据实际运行中数据观察可以控制在数秒以内。

(5)备库打开read_only 为OFF

(6)调用proxy api 放开用户连接的请求。整个切换过程不会超过10S,用户会感觉到服务器卡住一小段时间后,恢复正常。

3.故障切换

RDS实例发生故障的场景多种多样,这里仅以主备库使用异步复制模式,且主库所在主机故障导致的切换为例来讲解基本的故障切换流程。

当主库发生故障时,HA探测主库,返回的错误类型是连接超时,或者收到主库返回的rst包,那么进入切换流程。

(1)检查备库SQL线程延迟,如果有延迟,那么不切换,等待备库应用relaylog。

(2)当备库SQL线程没有延迟后,尝试连接主库,获取主库master binlog,如果能够获取,等待备库追上主库。如果不能获取(一般都是如此),那么对比主备库时间戳,如果时间戳在一定范围内,那么根据用户指定的策略决定是否切换。

(3)如果用户指定可用性优先,那么HA会将用户连接切换至备库,数据可能丢失,已经通报给用户。

(4)如果用户指定可靠性优先,那么不会切换VIP,人工介入重启主库或主实例,或拷贝redo log,修复数据,确保主备一致后,提供服务。