数据库系列之GoldenDB高可用技术
分布式核心数据库的高可用是保证业务连续性的基础,本文主要介绍GoldenDB的快同步技术以及各个组件节点的高可用技术实现,加深对GoldenDB分布式数据库高可用实现的理解。
1、GoldenDB高可用
1.1 GoldenDB同步技术
1.1.1 MySQL半同步复制
主从复制的完成通过以下三个进程实现的
主库 binary log dump 线程:当从库连接主库时,主库会创建一个log dump 线程,用于发送bin-log的内容。在读取bin-log中的操作时,此线程会对主库上的bin-log加锁,当读取完成,甚至在发动给从库之前,锁会被释放。 从库I/O线程:当从库执行start slave命令之后,从库会创建一个I/O线程用来连接主库,请求主库中更新的bin-log。I/O线程接收到主库binlog dump 进程发来的更新之后,保存在本地relay-log中。
从库SQL线程:SQL线程负责读取relay log中的内容解析成具体的操作并执行,终保证主从数据的一致性。
半同步复制必须在主库和从库两端同时开启,如果在主库上没打开,或者从库上没有开启,主库都会使用异步方式复制
从库在连接到主库时会询问主库是不是配置了半同步
如果半同步复制主库从库节点都开启了,那么此时主库的事务线程在提交时会被阻塞并等待,会出现两种情况:至少一个从库节点ack通知主库已经收到了所有这个事务的Binlog日志;或者一直等待直到超过配置的超时参数rpl_semi_sync_master_timeout,这种情况下半同步复制将自动关闭,转换为异步复制
从库节点只有在接收到某一个事务的所有Binlog,将其写入并Flush到Relay Log文件之后,才会ack通知对应主库上面的等待线程。
如果在等待过程中,等待时间已经超过了设置的超时时间,没有任何一个从节点通知当前事务,那么此时主库会自动转换为异步复制,当至少一个半同步从节点赶上来时,主库便会自动转换为半同步方式的复制。
在MySQL中安装半同步模块并设置参数rpl_semi_sync_master_enabled开启半同步复制:
mysql> set global rpl_semi_sync_master_enabled = 1;mysql> set global rpl_semi_sync_master_timeout = 2000;
1.1.2 GoldenDB中的快同步
1)并行复制
原生MySQL中binlog dump thread和SQL thread是单线程的,在GoldenDB中使用多线程对此进行了优化。
2)线程池
减少线程重复创建和销毁开销,提高性能
线程池预先创建一定数量的线程,在监听到新的连接请求时,线程池直接从现有线程中分配线程提供服务。服务结束后该线程不会直接销毁,而是去处理其它请求,避免了线程和内存对象的频繁创建和销毁,减少了上下文切换,提高了资源利用率。
系统保护,防止DB雪崩
线程池技术同时也限制了并发线程数,即限制了MySQL运行的线程数。当连接或请求超过设置的大线程数时候,新的请求需要排队,防止DB出现雪崩,保护底层DB。
3)机房间的数据同步方式
本地机房和同城机房数据采用快同步复制
本地机房和同城机房元数据采用快同步复制
本地机房/同城机房和异地机房间数据采用异步复制
本地机房/同城机房和异地机房间元数据采用快同步复制
同城机房GTM采用实时同步复制,异地机房GTM不从主机房同步数据
1.2 GoldenDB分组技术
数据节点集群由多个分片组成,其中一个分片失效,只影响该分片,其它分片中的事务不受影响
GTM集群由一个分片组成,该分片可由多个team组成,每个team内有多个GTM节点
DB节点按照区域进行分组,比如本地两个team、同城1个team,team数以及team内的分片节点数可以自由设置
主节点根据team响应进行回应,一个team内只要有不少于配置的响应分片数予以回应,则认为这个team的节点是正常的
team响应策略可以保证只要team内有一份完整的数据即可保证数据零丢失,同时也可以保证分组间RPO=0
1)分组配置中有几点需要注意
异地机房备节点不参与分组响应策略
分组team响应数是集群级别的设置,不能为每个team单独设置响应数
主节点计数配置,在本地一主一备的配置下,如果设置主节点计数并且team响应数为1,则无法保证本地备节点的数据完整性;如果设置主节点不计数并且team响应数为1,在一主一备的配置下,当本地备节点出现响应延迟,则水位线会降低(高低水位见下一部分内容),降低水位的过程中对该分片的业务会有影响
2)分组策略的配置
大保护策略:所有分组均需要返回响应
高性能策略:无需分组响应
高可用策略:分组响应数大于所配置的小分组响应数(即低水位)
其中高可用策略是以低代价保障RPO为0,在保障数据一致性的前提下大程度的兼顾了服务高可用及同步性能。
1.3 GoldenDB高低水位
以3组为例,不同用户配置的影响
1.3.1 数据节点高低水位
当有效team数为2时,该分片满足高水位运行条件,分片运行在高水位之上
当有效team数为1时,该分片满足低水位运行条件,分片运行在高低水位之间,系统有低于高水位的告警
当有效分片数小于1时,该分片不满足低水位运行条件,分片运行在低水位之下,系统有低于低水位的告警,分片为只读状态
注:当由高水位降为低水位的时候,分片会出现短暂的交易TPS降为0的现象,该暂停对外提供服务窗口的时间和Innodb的半同步参数rpl_semi_sync_master_timeout有关。
本地同城和异地的高低水位配置
数据节点的高低水位配置中,本地同城和异地使用不同的配置策略,本地和同城使用一台、异地使用另外一套。当系统运行在本地或同城的时候,只有本地同城的高低水位生效,异地的高低水位不会生效。当系统切换到异地后,异地的高低水位才会生效。
1.3.2 GTM节点高低水位
GTM主节点所在的team中GTM默认是不计数的
GTM高低水位信息存储在本地机房的GTM内存中,该信息没有同步到异地
与数据节点不同的是,异地高低水位与本地同城共用一套
1.4 GoldenDB节点高可用
1.4.1 DB数据节点高可用
1.4.2 GTM事务节点高可用
1.4.3 管理节点高可用
GoldenDB支持通过HA或Zookeeper两种方案实现管理节点高可用。
1)管理节点HA方案
管理节点同机房内采用HA方案,本地和同城机房通过快同步方式同步数据。
2)管理节点zookeeper方案
Zookeeper方案中的zookeeper集群建议使用奇数,防止出现脑裂
Zookeeper集群的每台服务器都会在内存中维护当前服务器的状态,并且每台机器间都相互保持通信,当存在一半的机器能够正常工作,整个集群都能正常对外服务
在管理节点切换的过程中,可能会存在zookeeper主节点和RDB主节点不在一台服务器上的情况
1.4.4 计算节点高可用
1.5 GoldenDB组件异常切换
1.5.1 DB数据节点异常切换
主节点的DBagent和ClusterManager链接断开(默认是丢3个心跳)
主节点上所有备节点和主节点的IO线程断开链接
将主节点停止服务,将该分片所有的DB设置为只读,等待所有备机回放完成(默认60s)
通过脚本获得高低水位信息
获取所有备机的GTID,超过60s则认为备机异常,设置该备机异常
当出现多点故障时,需判断
低于低水位时,DB不能故障切换
高低水位之间,存在FAM_S或FAM_D的DB不能切换
高水位时,存在多个FAM_D不能切换
如果可以切换则进行下一步,否则不满足一致性切换则切换失败
具备切换条件后,将GTID大的节点置为新主,并解除只读,修正备机的主备关系
注:DB数据节点切换优先切换本地节点,如果跨机房切换设置没打开,当本地副本不可用时,切换会失败。
1.5.2 GTM事务节点异常切换
GTM主机器异常,由操作系统通过系统链路告知MDS,GTM异常了,触发故障主备切换流程,且MDS告警
GTM主断网或者网络延迟,操作系统无法感知,MDS通过OS每隔2s检测一次链路,检测8次链路均异常,MDS再等5s后看GTM是否恢复,如果16+5秒后GTM主仍没有恢复,则触发主备切换流程,且MDS告警
MDS设置原主GTM为不可用状态,并通知PM(PM通知proxy)、CM禁用GTM
MDS收到PM、CM禁用GTM的响应消息后通知所有备GTM停止服务,并选择一个GTM作为新主(先本地备再同城备,异地备不参与选主)
所有备GTM清除与原主的链路,并向MDS回停服响应,MDS收到停服响应后,更新GTM元数据中主从信息
MDS通过OS链路通知所有可用状态的GTM启动服务和主从切换结果
从GTM收到启动服务请求后向新的主GTM建立链路
主GTM收到启动服务请求后向备GTM全量同步GTID和sequence数据
主GTM给MDS回复主从切换应答;新的主GTM确认有一台从GTM全量同步完成后升级为active状态;
MDS通知PM(通知proxy)、CM启用GTM并下发新的主GTM信息;(proxy收到启动服务请求后创建与主GTM链路、CM收到启动服务请求后创建与主GTM链路)
MDS给OMM回应主从切换应答,刷新OMM,主从切换成功
1.5.3 管理节点异常切换
根据一直运行的脚本获取高低水位信息,在切换开始时检验是否低于高水位,
如果低于高水位,不触发切换逻辑;高于高水位时,杀本地管理节点及OMM
等待所有备机回放完成
查询所有参与选主的管理节点:根据是否允许跨机房切换来确定参与选主的管理节点,返回参与选主管理节点的信息
判断参与选主管理节点中有无一致性副本
如无一致性副本,则选取gtid大且优先级高的管理节点为主;如有一致性副本,则选取一致性副本中优先级高的作为新主
选出新主后根据标志位判断新主是否需要拉数据,如果无一致性副本,则需要向新主拉数据
确保新主数据大后,启动新主的OMM、管理节点,建立RDB主备关系
校验RDB主备一致性,若成功则返回新主ip并提供服务
管理节点中的组件(MDS、CM、PM和OMM)其中一个状态异常会触发整体切换
管理组件和RDB是不同的切换逻辑,当管理组件异常时会触发管理组件的主切换,但是RDB的主备没有发生切换,所以会出现管理组件的主和RDB的主不在同一个节点的情况
Zookeeper作为管理组件和RDB状态的管理者,RDB主备之间还是通过快同步方式同步
到这里,GoldenDB有关的高可用技术已经介绍完毕,中间个人理解可能出现错漏。
参考资料:
MySQL半同步复制技术:https://www.cnblogs.com/zero-gg/p/9057092.html
GoldenDB高可用技术介绍
相关文章