概述:
利用主从复制 +GTID 的个性实现异地数据同步与读写拆散。上面是实现细节与不同于惯例计划的个性。
实现背景
是为了将分属两个不同集群的实例,建设同步关系。备实例会主动抉择主实例中提早较小的备机建设同步,当该主实例备机产生故障时,会主动与另一个备机建设同步关系。DCN 同步建设后,主实例可写,备实例只读。这可作为一种异地容灾计划,也可作为一种异地读写计划。
DCN 技术分为两步:
第一局部:
在主机房一主两备中,master 提交事务后,写入 binlog,通过 mysql 主从复制协定,master 机将 binlog 传输到任意 slave 机,而后 slave 机回放 relaylog,最终实现主从复制。第二局部:如图 1,主备机房实现建设 DCN 同步后,备机房的 master 机会从主机房中主备提早最小的 slave 机上的拉取 binlog,随后回放 binlog。
第二局部:
如果主机房以后曾经建设 DCN 同步的 slave 机器故障了,会主动与另一个备机建设同步关系如图 2
主从同步的形式实现异地容灾计划比拟成熟,但仍须要解决一些外围问题。
- 因为存在“级联复制”的状况,那么如何筹备的计算提早?
- 如果实例须要进行扩容时,同步关系是否收到影响,作为异地读写拆散的场景,级联节点数据提早扩充如何解决?
针对上述问题:
1. 计算提早
a) 不采纳 Seconds_Behind_Master 的值作为提早根据,主机 agent 不停地向主机数据库写入带有以后工夫戳的记录,这些记录会同步到备机数据库中备机的 agent 依据数据库中最新的记录与机器以后工夫戳,就能够计算出实时延迟时间了,而后备机 agent 再将这些信息(包含实时提早与提早的主机信息)写入到 zk 中,告知其它模块,而这些信也息作为 scheduler 仲裁扩容的根据。
b) 如下图提早的计算过程,在扩容的同步数据步骤中 M 每写入一条工夫戳记录,指标实例中的所有节点都会同步到该条记录,而后上报到 zk 中,当 scheduler 发现所有节点的提早小于 5 秒,且 delayip 都是 M(这点次要是避免异样)时,进入到下一个流程
2. 实例进行扩容的时候,集群具备自动更新 dcn 同步关系的性能,并且在扩容过程中不须要人为染指,缩小了提早得影响。由程序染指,并 分拆为三步:
a) 建设原实例与指标实例的同步关系
b) 检测指标实例与原实例之间的提早,当提早小于 5S 时,设置原实例只读,回绝掉新的写入
c) 检测指标实例与原实例之间的 gtid,当 gtid 无差别时,断开原实例与指标实例之间的同步关系,并将 Proxy 路由切换到指标实例
d) 下图示意利用 DCN 进行集群扩容的流程:
i. MM 示意主实例的主机,MS 示意主实例备机,MSET 示意主实例。SM 示意备实例主机,SS 示意备实例备机,SSET 示意备实例。EMM 示意主实例扩容的指标实例的主机,EMS 示意主实例扩容的指标实例的备机,EMSET 示意主实例扩容的指标实例。ESM 示意备实例扩容的指标机器的主机,ESS 示意备实例扩容的指标机器的备机,ESSET 示意备实例扩容的指标实例
扩容流程:
(1)建设 EMSET 与 MSET 之间的扩容同步关系。
(2)检测到 EMSET 与 MSET 之间的提早小于 5 秒时,断开 SSET 与 MSET 之间的 DCN 同步关系。(提前断开是为了避免后续 SSET 的 GTID 的信息不被 EMSET 的 GTID 列表蕴含,这里的差别信息可能是 MM 节点与 EMSET 断开后新写入 ZK 的工夫戳记录)
(3)确认 SSET 与 MSET 之间的 DCN 同步关系断开后,设置 MSET 为隔离状态(此时网关会回绝掉所有新的连贯),并向 EMM 节点的 agent 发送扩容解决工作。
(4)当 EMM 节点的 agent 接管到 scheduler 发送的扩容解决后,设置 MM 节点只读,并计算 EMM 与 MM 节点 gtid 的差值,当 gtid 无差值时,反馈 scheduler 工作解决胜利。如果期间设置只读失败,反馈 sheduler 解决失败。
(5)Scheduler 依据 agent 反馈进行辨别解决,反馈胜利进入步骤 6,反馈失败进入步骤 7。
(6)断开 EMSET 与 MSET 之间的扩容同步关系,返回扩容胜利,并建设 EMSET 与 SSET 之间的 DCN 同步关系。
(7)把 MSET 设置为失常状态(网关失常接管新连贯),返回扩容失败,并重建 MSET 与 SSET 之间的 DCN 关系。