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分布式版,支持一键拉起使用,方便各位开发者学习使用。
相关文章
|
4月前
|
存储 关系型数据库 分布式数据库
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)。
|
4月前
|
存储 关系型数据库 分布式数据库
PolarDB产品使用问题之可以通过什么操作来监听从库的binlog
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
4月前
|
存储 关系型数据库 Serverless
PolarDB产品使用问题之要获取并解析Binlog,该如何操作
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
4月前
|
存储 关系型数据库 分布式数据库
PolarDB产品使用合集之怎么关闭Binlog
PolarDB是阿里云推出的一种云原生数据库服务,专为云设计,提供兼容MySQL、PostgreSQL的高性能、低成本、弹性可扩展的数据库解决方案,可以有效地管理和优化PolarDB实例,确保数据库服务的稳定、高效运行。以下是使用PolarDB产品的一些建议和最佳实践合集。
|
5月前
|
DataWorks 关系型数据库 MySQL
DataWorks产品使用合集之在DataWorks中,如何通过PolarDB for MySQL来查看binlog日志
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
119 1
|
5月前
|
关系型数据库 分布式数据库 数据库
在PolarDB怎么关闭Binlog?
在PolarDB怎么关闭Binlog?
91 0
|
NoSQL 关系型数据库 分布式数据库
RDS、PolarDB、Redis、MongoDB、DAS中执行一条修改语句为啥要开binlog呢
RDS、PolarDB、Redis、MongoDB、DAS中执行一条修改语句为啥要开binlog呢
152 1
|
6天前
|
关系型数据库 MySQL 分布式数据库
零基础教你用云数据库PolarDB搭建企业网站,完成就送桌面收纳桶!
零基础教你用云数据库PolarDB搭建企业网站,完成就送桌面收纳桶,邀请好友完成更有机会获得​小米Watch S3、小米体重称​等诸多好礼!
零基础教你用云数据库PolarDB搭建企业网站,完成就送桌面收纳桶!
|
1月前
|
关系型数据库 MySQL Serverless
探索PolarDB MySQL版:Serverless数据库的灵活性与性能
本文介绍了个人开发者对阿里云PolarDB MySQL版,特别是其Serverless特性的详细评测体验。评测涵盖了产品初体验、性能观测、Serverless特性深度评测及成本效益分析等方面。尽管试用过程中遇到一些小问题,但总体而言,PolarDB MySQL版表现出色,提供了高性能、高可用性和灵活的资源管理,是个人开发者和企业用户的优秀选择。
|
2月前
|
关系型数据库 MySQL 分布式数据库
PolarDB 与传统数据库的性能对比分析
【8月更文第27天】随着云计算技术的发展,越来越多的企业开始将数据管理和存储迁移到云端。阿里云的 PolarDB 作为一款兼容 MySQL 和 PostgreSQL 的关系型数据库服务,提供了高性能、高可用和弹性伸缩的能力。本文将从不同角度对比 PolarDB 与本地部署的传统数据库(如 MySQL、PostgreSQL)在性能上的差异。
153 1

相关产品

  • 云原生数据库 PolarDB