PolarDB-X 全局Binlog解读之HA篇

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 本篇对PolarDB-X 全局binlog系统的高可用机制以及稳定性相关的内容进行介绍,主要以FAQ的方式展开,并对核心问题进行重点描述。

本篇对PolarDB-X 全局binlog系统的高可用机制以及稳定性相关的内容进行介绍,主要以FAQ的方式展开,并对核心问题进行重点描述。

总体架构


1.jpg

全局binlog系统的部署架构如上图所示,支持三种部署模式:

单机部署

只需要一个节点,即可运行全局binlog系统,该节点上会运行一个Daemon进程、一个FinalTask进程和一个Dumper进程。单机部署模式下,系统并没有HA的能力,借此小节主要对这几个进程的功能定位进行一下介绍

Daemon(后台进程) Daemon进程是一个后台进程,虽然不直接参与全局binlog的生产,但是其为整个系统的大脑。每个节点上都会运行一个Daemon进程,其中会有一个进程抢占为leader,承担一些全局总控的任务。Daemon的核心功能主要有: 集成HTTP服务,提供运维接口 详情 收集metrics信息 详情管理异常事件 详情 维护运行时拓扑 详情监测工作进程健康状态 详情 监测和清理历史数据 详情 * 维护TSO心跳 详情

FinalTask(工作进程) FinalTask进程属于工作进程,承担了全局binlog生产链路中最核心的业务逻辑,其核心功能主要有: 物理binlog解析 事务排序和合并 元数据解析和维护 binlog数据整形(DDL)

Dumper(工作进程) Dumper进程属于工作进程,处于全局binlog生产链路的末端,在非单机部署模式下,可以有Master和Slave两个角色,Master负责拉取FinalTask的数据,并构建全局binlog文件,Slave则负责复制Master的binlog文件,在发生故障时实现HA快速切换。Dumper的核心功能主要有: 构建终态binlog event 本地binlog文件的维护 提供dump接口 binlog文件的备份和恢复(Dumper主备复制和备份本地文件到中心化存储)

标准部署

去掉上图中虚线标识的部分,便是标准部署模式对应的形态,其主要特点有: 需要两个节点(容器),每个节点上都有一个dumper进程,一个为Master,一个为Slave 为达到负载均衡,FinalTask和Dumper Master会分署不同节点 * 该模式主要用来适配DN规模不太大的集群(<=64),FinalTask直接对接所有DN节点

多级部署

上图中虚线标识的部分展示的是多级部署形态,所谓多级指的是进程级的多级归并,其主要特点有: 至少两个节点(容器),节点数量可任意伸缩 每个节点上都有一个dumper进程,一个为Master,其它为Slave(slave数量可自定义) Task分为两层,RelayTask直接对接DN承接部分DN的流量,FinalTask对接所有RelayTask实现最终事务归并 RelayTask的核心功能和FinalTask基本一致,主要差异在于层级不同,其均匀分布在所有节点上 * 该模式主要用来适配DN规模比较大的集群(大于64),通过进程级的多级归并保障数据链路的性能

HA场景

下面罗列一下会导致系统发生自动重启、故障转移或HA切换的主要场景

CDC节点数量变更

每个CDC节点上都会运行一个Daemon进程,每个Daemon进程会在系统表binlog_node_info中注册一条记录,并实时更新心跳时间戳。Daemon中的Leader进程负责监测binlog_node_info表的信息变化,当监测到有新的节点加入或某个节点退出时(正常退出或宕机,Daemon的心跳会出现超时,默认的超时时间是5s),会触发Rebalance,即重新构建运行时拓扑。新版本拓扑构建完成后,所有对应上一版本拓扑的正在运行的工作进程会被Daemon进程Stop,或主动感知到拓扑信息的变化自动退出执行,然后Daemon进程会依据新版本的拓扑信息分别拉起各自负责管理的工作进程,完成状态变更。示意图如下:

2.jpg

DN节点数量变更

支持在线扩缩容是分布式数据库的必备能力,想体验PolarDB-X的扩缩容能力?可参见文章《实践教程之如何对PolarDB-X集群做动态扩缩容》进行实操演练。CDC通过汇聚各个DN节点的物理binlog来生产全局binlog,当DN节点进行扩容和缩容时,CDC运行时拓扑会自动自行重新构建,整个流程如下图所示

3.jpeg

DN节点发生HA

不管是主动对DN集群发起HA切换,还是由于DN Leader节点发生Crash被动触发HA切换,都会导致Task进程和DN之间的连接中断,Task需要重新向新的DN Leader发起重连。全局binlog系统目前采用了进程级的重连机制,即通过触发一次Task进程的重启实现重连,而非进程内的线程级的重连。进程级重连相比线程级重连更容易实现资源的清理,前者通过一次重启实现资源的重新初始化,简单直接,后者需要通过代码显式进行资源的清理,相对复杂和容易出现漏洞。进程级重连相比线程级重连,会额外触发下游工作进程的重连动作,总体的恢复速度会慢几秒钟的时间。

4.jpeg

重点问题

工作进程发生crash后如何实现自动recovery?完成recovery的RTO是什么水平?

  • 工作进程发生crash后会由Daemon进程进行拉起,Daemon进程会定期探测它所管理的工作进程的健康状态,探测间隔默认为1秒钟。
  • 工作进程会维护一个心跳线程,默认每1秒钟更新一次心跳,当Daemon发现工作进程出现心跳超时时会触发主动拉起动作,默认超时时间是2秒钟。
  • 工作进程发生crash并重启后,会导致binlog生产链路的重启,链路的RTO不是恒定的,主要受两个因素的影响,元数据的数据量和需要回溯的物理binlog的大小,一般情况下恢复时间为10s左右

DN节点如果发生crash,在其未完成恢复前,是否意味着全局binlog也是不可用的?

  • 是的,单个DN节点不可用会触发全局binlog链路的block
  • 按照CAP理论来理解,全局binlog采用的是CP模型,即优先保证一致性而不是可用性。
  • DN节点可以保证RTO<30s, DN节点发生crash的场景,全局binlog一般可以保证RTO<60s

全局binlog是异步消费DN上的binlog的,DN上的binlog在被消费前如果被清理了,应该如何处理?

  • 会导致链路中断且无法恢复,只能进行reset,然后从binlog.000001开始重新构建链路。
  • 应尽量调大DN上binlog文件的保留时间,保证在发生消费延迟或其它异常情况时,数据链路能够正常恢复

如果部分CDC节点发生不可用,系统的恢复流程和恢复速度如何?

  • 恢复流程可参见上文所述的“CDC节点数量变更”,当部分节点不可用时,问题节点上的Daemon进程会出现心跳超时,系统会通过触发新一轮的rebalance自动完成故障转移
  • 恢复时间相比于工作进程发生Crash的场景,会增加5s左右

如果全部CDC节点发生不可用,且无法原地恢复,系统是否还具备恢复能力?恢复时间如何?

  • 具备。如果是全部节点出现不可用且无法原地恢复,待新的节点被拉起后,本地并没有binlog文件,此时进行链路恢复有两种策略

恢复策略一: 如果开启了远端备份,系统会将远端存储的binlog文件下载到本地,然后发起链路恢复;当然并不是下载所有的binlog文件,而是下载临近的几个binlog文件,并支持参数控制,方便在恢复速度和恢复文件数量之间做权衡


5.jpg

恢复策略二: 如果没有开启远端备份,系统会基于binlog_oss_record表,选择一个合适的binlog文件,发起链路恢复;所谓合适的binlog文件是指已经完成写入的、临近一段时间内的某个binlog文件(倒数第n个),并支持参数控制,方便在恢复速度和恢复文件数量之间做权衡


6.jpg

  • 恢复时间 = 新节点被拉起的时间 + binlog文件的恢复时间 新节点被拉起的时间取决于管控平台的能力,如k8s。binlog文件的恢复时间主要取决于需要恢复的文件数量:对于恢复策略一,需要恢复的文件数量越多,则需要seek的物理binlog文件的数量越多,耗时也就越长;对于恢复策略二,需要恢复的文件数量越多,则需要下载的数据量越大,耗时也就越长

CDC节点访问CN节点,是通过SLB保证高可用的吗?

不是。为了减少外部依赖并提供更高的灵活性,CDC访问CN节点,自行实现了一套高可用方案,想了解细节可参见DataSourceWrapper

系统发生重启、HA转移等动作后,是如何保证全局binlog文件中的数据不重、不丢、不乱的?

相比MySQL原生binlog,PolarDB-X在全局binlog中为每个事务额外附加了TSO信息,当系统发生重启、HA转移等动作后,会从编号最大的binlog文件中定位到最后一个事务的TSO和File Position,以该TSO为基准发起链路恢复,通过边界判断和幂等判断,控制数据不重、不丢、不乱。

20230322101506.jpg

Daemon发生脑裂是否会导致一致性问题?Dumper发生脑裂是否会导致一致性问题?

Daemon进程通过定时向GMS发送SELECT GET_LOCK('xxx')进行Leader的抢占,当出现网络分区等异常情况时,可能会出现短暂的“双Leader"场景,对此,系统主要通过乐观锁、幂等判断等方式进行并发冲突处理。

Dumper Master是Daemon在构建运行时拓扑时指定的,当运行时拓扑发生变更时,Dumper Master也可能发生变化,可能会出现之前的Master进程还未退出、新的Master进程已经启动的“双Master”场景,对此,系统主要通过加锁和对比运行时版本号来控制并发冲突。该方案不仅适用于Dumper,同时也适用于FinalTask,在运行时拓扑发生变更时,同样可能出现“双FinalTask”的场景。

20230322101547.jpg

Dumper主备节点上的binlog是完全一样的吗?如果发生主备切换,基于文件名+位点继续进行消费是否是安全的?

CDC的Master节点和Slave节点之间会进行全局binlog文件的复制,并保证两边数据完全一致,即下游按照filename + position的方式进行消费订阅,当CDC发生主从切换时,不用担心文件名和位点会发生变化。

Dumper生成的全局binlog文件会保存在本地磁盘,系统是否提供了自动清理机制?

系统提供了自动清理机制,涉及文件清理的参数有

参数名 参数描述
binlog.cleaner.clean.enable 是否自动清理本地binlog文件,默认true
binlog.cleaner.clean.threshold 触发清理本地binlog文件的阈值,超过inst_disk*阈值后会触发自动清理,inst_disk参数指定了binlog文件可用的磁盘容量的大小
binlog.cleaner.check.interval 检测频率,默认1分钟

本地磁盘上的binlog文件被清理后,是否支持通过mysql dump协议直接消费远端存储(如OSS)上的文件?

支持。CDC会优先把构建好的binlog文件保存在本地磁盘,并支持实时上传到远端存储(如OSS),本地磁盘上的文件一般具有较短的存活周期,远端存储上的文件具有较长的存活周期(如15天)。针对远端存储上的文件,CDC提供了透明消费能力,即屏蔽了本地和远端的存储差异,下游系统无需为访问远端存储上的binlog数据做任何额外适配。


v2-6df47a9a93cb02648a9b17e62a641b65_r.jpeg

Daemon进程如果发生Crash,是如何被拉起的?Daemon进程发生Crash,是否就意味着所在节点不可用了?

Daemon进程负责管理工作进程,Daemon进程发生Crash后靠cron定时任务进行拉起。Daemon发生Crash,并不代表所在节点就不可用了,当该节点SSH端口可用,且分配给该节点的工作进程都正常时,即使Daemon发生Crash,也不会触发运行时拓扑的Rebalance。

总结

本文对全局binlog系统的高可用稳定性相关的内容进行了详细的介绍,下面对系统的RTO能力进行汇总

HA场景 RTO(单位:s) 说明
工作进程Crash <= 15s TRT = PST + PRT
DN HA <= 45s TRT = DRT + PST + PRT
DN扩缩容 <= 20s TRT = RBT + PST + PRT
CDC节点部分不可用 <= 20s TRT = RBT + PST + PRT
CDC节点全部不可用 <= (20s + CNRT + BFRT) TRT = RBT + PST + PRT + CNRT + BFRT


各类型恢复时间的简称定义如下

  • TRT(total recovery time)
    总的链路恢复时间
  • PST(process start time)
    进程拉起时间,从Daemon检测到需要启动进程,到触发启动的时间,一般2~3s
  • PRT(process recovery time)
    进程恢复完成时间,如恢复元数据、定位恢复位点等,一般5~10s
  • DRT(datanode recovery time)
    DN节点发生HA转移后的恢复时间,恢复时间和恢复的数据量强相关,一般小于30s
  • RBT(rebalance during time)
    Daemon监测是否需要进行运行时拓扑重建并完成重建的时间,一般5s
  • CNRT(cdc node recovery time)
    CDC节点发生物理不可用,新节点被拉起的时间,取决于管控平台的能力
  • BFRT(binlog file recovery time)
    本地binlog file为空时,恢复指定数量binlog文件的时间,恢复5个binlog文件,一般30s左右

本文来源:PolarDB-X知乎号

相关实践学习
快速体验PolarDB开源数据库
本实验环境已内置PostgreSQL数据库以及PolarDB开源数据库:PolarDB PostgreSQL版和PolarDB分布式版,支持一键拉起使用,方便各位开发者学习使用。
相关文章
|
6月前
|
存储 关系型数据库 分布式数据库
PolarDB操作报错合集之修改了binlog的存储时间为1小时,但在重启后发现仍有90GB的binlog文件未被删除,是什么原因
在使用阿里云的PolarDB(包括PolarDB-X)时,用户可能会遇到各种操作报错。下面汇总了一些常见的报错情况及其可能的原因和解决办法:1.安装PolarDB-X报错、2.PolarDB安装后无法连接、3.PolarDB-X 使用rpm安装启动卡顿、4.PolarDB执行UPDATE/INSERT报错、5.DDL操作提示“Lock conflict”、6.数据集成时联通PolarDB报错、7.编译DN报错(RockyLinux)、8.CheckStorage报错(源数据库实例被删除)、9.嵌套事务错误(TDDL-4604)。
|
6月前
|
存储 关系型数据库 分布式数据库
PolarDB产品使用问题之可以通过什么操作来监听从库的binlog
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
6月前
|
存储 关系型数据库 Serverless
PolarDB产品使用问题之要获取并解析Binlog,该如何操作
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
6月前
|
存储 关系型数据库 分布式数据库
PolarDB产品使用合集之怎么关闭Binlog
PolarDB是阿里云推出的一种云原生数据库服务,专为云设计,提供兼容MySQL、PostgreSQL的高性能、低成本、弹性可扩展的数据库解决方案,可以有效地管理和优化PolarDB实例,确保数据库服务的稳定、高效运行。以下是使用PolarDB产品的一些建议和最佳实践合集。
|
7月前
|
DataWorks 关系型数据库 MySQL
DataWorks产品使用合集之在DataWorks中,如何通过PolarDB for MySQL来查看binlog日志
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
130 1
|
7月前
|
关系型数据库 分布式数据库 数据库
在PolarDB怎么关闭Binlog?
在PolarDB怎么关闭Binlog?
121 0
|
NoSQL 关系型数据库 分布式数据库
RDS、PolarDB、Redis、MongoDB、DAS中执行一条修改语句为啥要开binlog呢
RDS、PolarDB、Redis、MongoDB、DAS中执行一条修改语句为啥要开binlog呢
159 1
|
16天前
|
存储 SQL 关系型数据库
mysql 的ReLog和BinLog区别
MySQL中的重做日志和二进制日志是确保数据库稳定性和可靠性的关键组件。重做日志主要用于事务的持久性和原子性,通过记录数据页的物理修改信息来恢复未提交的事务;而二进制日志记录SQL语句的逻辑变化,支持数据复制、恢复和审计。两者在写入时机、存储方式及配置参数等方面存在显著差异。
|
3月前
|
canal 消息中间件 关系型数据库
Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
【9月更文挑战第1天】Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
811 4
|
4月前
|
SQL 关系型数据库 MySQL
【揭秘】MySQL binlog日志与GTID:如何让数据库备份恢复变得轻松简单?
【8月更文挑战第22天】MySQL的binlog日志记录数据变更,用于恢复、复制和点恢复;GTID为每笔事务分配唯一ID,简化复制和恢复流程。开启binlog和GTID后,可通过`mysqldump`进行逻辑备份,包含binlog位置信息,或用`xtrabackup`做物理备份。恢复时,使用`mysql`命令执行备份文件,或通过`innobackupex`恢复物理备份。GTID模式下的主从复制配置更简便。
523 2

热门文章

最新文章

相关产品

  • 云原生数据库 PolarDB
  • 下一篇
    DataWorks