巧用 TiCDC Syncpiont 构建银行实时交易和准实时计算一体化架构

news2025/1/9 1:03:47

本文阐述了某商业银行如何利用 TiCDC Syncpoint 功能,在 TiDB 平台上构建一个既能处理实时交易又能进行准实时计算的一体化架构,用以优化其零售资格业务系统的实践。通过迁移到 TiDB 并巧妙应用 Syncpoint,该银行成功解决了原有多个 MySQL 集群所面临的数据分布复杂性和跨库关联查询的挑战,实现了数据处理效率和应用性能的显著提升,确保了实时交易的快速响应和数据分析处理的计算资源需求。


场景概述

某商业银行的零售资格业务系统专门设计用于计算和管理客户的消费积分及优惠。每当用户完成一笔交易,系统内的关键模块便会自动整合用户的历史消费数据,迅速进行积分计算,并将当前可用的优惠信息及时推送给用户,例如通知当前能够兑换的优惠或赠品,提示额外消费达到一定额度后能够获得的特定奖励等。该系统旨在通过提供实时的优惠信息和激励措施,增强客户的消费体验。

用户的消费信息按照用户 ID 进行分组,存储在 30 多个 MySQL 集群。随着业务的增长,以及需要开放第三方应用使用数据,完成资格的计算。分库分表的 MySQL 就不满足业务需求了。一方面,分库分表后数据分布复杂;另外,分库分表难以实现跨 MySQL 库的关联查询。 如果把这些 MySQL 库的数据汇聚到 HBase 等大数据平台,即不能保障用户交易以事务的粒度同步到大数据平台,也很难保证数据的时效性(大数据通常都只做 T+1 的计算)。

为了优化应用性能和数据处理效率,行方决定将应用迁移到 TiDB 平台,并采取策略将实时交易和准实时计算分配到两个不同的 TiDB 数据库集群中。资格落地模块用来完成准实时资格的计算。因为落地数据计算量大,并且有准实时性的要求,为了不影响实时业务,落地计算是通过 TiDB 备集群 2 进行计算,该集群的数据来自 TiCDC 从实时集群同步过来的准实时数据。

这样的架构设计旨在平衡交易的即时性和数据处理的计算需求,确保实时交易的快速响应,同时为数据分析和处理提供足够的计算资源。

TiCDC 和 Syncpoint 特性简介

本文以商业银行零售资格业务系统为例,向大家介绍怎样通过 TiCDC 的 Syncpiont 功能,来确定目标端的同步进度,并且以此为依据,计算每笔业务对用户资格数据的贡献。

图 1:实时交易和准实时计算一体化架构

“TiDB 主集群”为实时集群;“TiDB 备集群 2”是专门为资格落地准备的准实时集群;“TiDB 备集群 1”是容灾集群

众所周知,在业界,几乎所有的变更数据捕获(CDC)产品都通过异步方式进行数据同步,这导致主集群与备集群之间不可避免地会出现数据延迟。TiCDC 采用分布式架构设计,也会受到主备之间延迟的影响,不能保证目标端的事务提交顺序和源端的事务提交顺序完全一致,无法动态地获取主备集群的一致性关系。

行方原先考虑在源端提交以后,等待一分钟左右时间,再去备集群计算,但是,如果遇到大的事务,或者集群因为某些原因提交缓慢,即使等待 N 分钟,也不能保证备集群能完成同步。

图 2:TiCDC 分布式同步架构

在使用 TiCDC 构建 TiDB 主从集群的过程中,有时需要在不中断数据同步的情况下,进行数据的一致性快照读取或验证。由于 TiCDC 采用的是分布式架构,其标准同步模式仅确保数据的最终一致性,而不能保证在同步过程中的数据一致性。这就使得对实时变化的数据进行一致性读取变得具有挑战性。为了解决这个问题,TiCDC 引入了 Syncpoint 功能,它允许用户在特定时间点获取数据的一致性视图,从而进行一致性读取和数据验证,满足了对数据一致性有严格要求的业务场景。

Syncpoint 通过利用 TiDB 提供的 snapshot 特性,让 TiCDC 在同步过程中维护了一个上下游具有一致性 snapshot 的 ts-map。把校验动态数据的一致性问题转化为了校验静态 snapshot 数据的一致性问题,达到了接近数据一致性实时校验的效果。当启用 Syncpoint 功能后,就可以使用一致性快照读和数据一致性校验。

巧用 Syncpoint

要开启 Syncpoint 功能,只需在创建同步任务时把 TiCDC 的配置项 enable-sync-point 设置为 true。开启 Syncpoint 功能后,TiCDC 会向下游 TiDB 集群写入如下信息:

在数据的同步过程中,TiCDC 会定期(使用 sync-point-interval 参数配置)对齐上下游的快照,并将上下游的 TSO 的对应关系保存在下游的 tidb_cdc.syncpoint_v1 表中。

同步过程中,TiCDC 还会定期(使用 sync-point-interval 参数配置)通过执行 SET GLOBAL tidb_external_ts = @@tidb_current_ts ,在备用集群中设置已复制完成的一致性快照点。

Syncpoint 表结构如下:

select * from tidb_cdc.syncpoint_v1;
+------------------+-------------+--------------------+--------------------+--------------------+
| ticdc_cluster_id |  changefeed | primary_ts         | secondary_ts       | created_at         | 
+------------------+-------------+--------------------+--------------------+--------------------+ 
|  default         | test-2      | 435953225454059520 | 435953235516456963 | 2022-09-1308:40:15 | 
+------------------+-------------+--------------------+--------------------+--------------------+

ticdc_cluster_id:插入该条记录的 TiCDC 集群的 ID。

changefeed:插入该条记录的 Changefeed 的 ID。通过 ticdc_cluster_id 和 Changefeed 的 ID 来确 认一个 Changefeed 所插入的 ts-map。

primary_ts:上游数据库 snapshot 的时间戳。

secondary_ts:下游数据库 snapshot 的时间戳。

created_at:插入该条记录的时间。

通过查询 ts-map 的方式选取之前的时间点进行快照读。syncpoint_v1 中的 primary_ts,就代表备集群,当前已经完成的事务,对应到主集群的时间戳。

资格应用在实时集群完成一笔业务后,只需要记下业务完成时的时间戳,然后在备集群中去查询 tidb_cdc.syncpoint_v1 中 max(primary_ts),如果获取到的 primary_ts 大于当时业务记录的完成时间戳,就代表该业务已经在备集群完成,应用就可以针对该笔业务,计算用户当前的资格。

因为资格下游集成了很多子系统,并且 syncpoint_v1 是按照一定的时间间隔更新的,所以没有必要每笔交易、下游子系统都查询一次 tidb_cdc.syncpoint_v1,这样会对数据库造成性能影响,所以根据业务需求,资格系统将以一定时间间隔读取 tidb_cdc.syncpoint_v1,缓存 primary_ts,通过缓存提供给下游业务使用。具体流程如下图所示:

图 3:启用 Syncpoint 后的资格落地计算流程

通过以上的流程 ,资格下游的应用就可以准确的得到每笔业务产生的资格更新。Syncpoint 的启用步骤如下:

  1. 编辑 changefeed.toml,增加如下内容
# 开启 SyncPoint
enable-sync-point = true
# 每隔 30s对齐一次上下游的 snapshot
sync-point-interval = "30s"
# 每隔 1 小时清理一次下游 tidb_cdc.syncpoint_v1 表中的 ts-map 数据
sync-point-retention = "1h"
  1. 动态启用配置文件

TiCDC 支持非动态修改同步任务配置,修改 changefeed 配置需要按照 :暂停任务 -> 修改配置 -> 恢复任务的流程

cdc cli changefeed pause -c test-cf --server=http://10.0.10.25:8300
cdc cli changefeed update -c test-cf --server=http://10.0.10.25:8300 --sink-uri="mysql://127.0.0.1:3306/?max-txn-row=20&worker-number=8" --config=changefeed.toml
cdc cli changefeed resume -c test-cf --server=http://10.0.10.25:8300
  1. 获取 ts-map

在下游 TiDB 中执行以下 SQL 语句,从结果中可以获取上游 TSO (primary_ts) 和下游 TSO (secondary_ts) 信息。

select  *  from tidb_cdc.syncpoint_v1  limit 1;
+------------------+------------+--------------------+--------------------+--------------------+
| ticdc_cluster_id | changefeed | primary_ts         | secondary_ts       | created_at         | 
+------------------+------------+--------------------+--------------------+--------------------+ 
| default          | test-2     | 435953225454059520 | 435953235516456963 | 2022-09-1308:40:15 | 
+------------------+------------+--------------------+--------------------+--------------------+

获取当前最后一个一致性的时间戳。

 select max(primary_ts) from  tidb_cdc.syncpoint_v1

注意事项

同个数据库的多张表,可以通过不同的 changefeed 来进行同步,这样可以分摊一些 workload,但是由于 syncpoint 一致性是以 changefeed 为最小粒度的,所以要求,有事务关联性的所 有表, 必须在同一个 changefeed 里面同步 。如果涉及多个 changefeed 的情况下 ,取 primary_ts 要带上 changefeed 字段,如果 TiCDC 还涉及多个 TiDB Cluster 同步数据,那还应该带上 ticdc_cluster_id,如:

select max(primary_ts ) from tidb_cdc.syncpoint_v1 where changefeed=’test-2’
select max(primary_ts ) from tidb_cdc.syncpoint_v1 where changefeed=‘test-2’and ticdc_cluster_id=‘default’

关于 TiCDC 使用的优化点:

  1. 首先,应用端应该尽量避免使用大事务,TiCDC 只有在源端事务已经提交后,才会在目标端开始执行事务(源端 pre-write 阶段,数据会缓存在 TiCDC,并不会在目标端也 pre-write,只有等到源端提交后,目标端才开始执行),所以如果源端的事务执行时间比较久,目标端并不一定会比源端执行时间短。
  2. 因为是分布式系统,可以通过增加 changefeed 的 worker 的数量,来加快下游同步的速度,具体需要根据业务的实际情况来设定,worker-num 默认为 16。

关于使用 syncpoint 取到的数据,最大延时计算参考:

tidb_cdc.syncpoint_v1 表中的数据,刷新间隔是按照 sync-point-interval 设置的时间间隔刷新的,所以从该表中获取的最新快照的时间,最大的延时近似于 sync-point-interval+实际延时。

总结

在需要对 TiCDC 上下游动态变更的数据执行一致性读取的应用场景中,启用 Syncpoint 功能是一种有效的解决方案。通过查询下游 tidb_cdc.syncpoint_v1 表中的 primary_ts 字段,用户能够获取到下游事务的确切完成时间点。这一机制显著提升了计算的准实时性,确保了数据读取的时效性,为用户提供了可靠的准实时数据处理方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1636216.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu C++ man手册安装及使用

Ubuntu下C++ man手册安装 C++在线文档: http://www.cplusplus.com/reference/ 第一种办法:使用cppman $ sudo apt install cppman 使用方法 第二种办法: 打开网页:GCC mirror sites- GNU Project 点击下图中的突显行链接: Russia, Novosibirsk:

使用groovy+spock优雅的进行单测

使用groovyspock优雅的进行单测 1. groovyspock示例1.1 简单示例1.2 增加where块的示例1.3 实际应用的示例 2. 单测相关问题2.1 与SpringBoot融合2.2 单测数据与测试数据隔离2.3 SQL自动转换(MySQL -> H2) 参考 Groovy是一种基于JVM的动态语言&#x…

安卓获取SHA

1:安卓通过签名key获取SHA 方式有两种, 1、电脑上来存在eclipse的用户或正在使用此开发工具的用户就简单了,直接利用eclipse 走打包流程,再打包的时候选择相应的签名,那么在当前面板的下面便会出现签名的相关信息。 2、…

Java根据模板动态生成Pdf(添加页码、文件加密、Spire免费版本10页之后无法显示问题、嵌入图片添加公章、转Base64)

Java根据模板动态生成Pdf:添加页码、文件加密、Spire免费版本10页之后无法显示问题、嵌入图片添加公章、转Base64 引言【Java根据模板动态生成Pdf资源地址】示例一:动态生成带页码的PDF报告示例二:加密PDF以保护敏感信息示例三:应…

netty整合springboot之后自动重连失效,如何解决?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

【AIGC调研系列】InternVL开源多模态模型与GPT-4V的性能对比

InternVL和GPT-4V都是多模态模型,但它们在性能、参数量以及应用领域上有所不同。 InternVL是一个开源的多模态模型,其参数量为60亿,覆盖了图像/视频分类、检索等关键任务,并在32个视觉-语言基准测试中展现了卓越性能[2]。InternV…

设计模式-01 设计模式单例模式

设计模式-01 设计模式单例模式 目录 设计模式-01 设计模式单例模式 1定义 2.内涵 3.使用示例 4.具体代码使用实践 5.注意事项 6.最佳实践 7.总结 1 定义 单例模式是一种设计模式,它确保一个类只能被实例化一次。它通过在类内部创建类的唯一实例并提供一个全…

c#数据库: 10.调用存储过程查询信息,并显示在窗体上

查询女生信息,并将信息显示在窗体上: 原数据表//右键数据库名,新建查询 ------------- 新建查询窗口,添加新建存储过程Procedure_GetGirls1和查询代码如下 : CREATE PROCEDURE dbo.Procedure_GetGirls1 /*存储过程名称*/ AS SELECT * f…

变电站自动化控制系统应用案例分析

变电站自动化控制系统介绍 变电站自动化控制系统用于大中型企业变电站项目,这类企业变压器多,日耗电量大。把多个变压器集中到一个电器平台上,集中管理分析,优化厂区用电管理,从而达到集中控制、集中分析、集中管理的…

【Unity 自定义组件】

想了解更多游戏开发知识,可以扫描下方二维码,免费领取游戏开发4天训练营课程 在Unity中,自定义组件(Custom Component)是指开发者根据游戏的具体需求编写的C#脚本,这些脚本可以附加到游戏对象(GameObject)…

如何远程访问服务器?

在现代信息技术的快速发展下,远程访问服务器已成为越来越多用户的需求。远程访问服务器能够让用户随时随地通过网络连接服务器,实现数据的传输和操作。本文将介绍远程访问服务器的概念,以及一种广泛应用于不同行业的远程访问解决方案——【天…

标准汽车试验铁地板的技术要求

在现代科技化发展的工作中,试验平台被广泛使用。铸铁试验平台(试验铁地板)又叫试验工作平台,听名字大家也不难想象出来这是一款带有箱式体的台面,这是一种有长方形或者圆形又或者正方形的试验工作台。 铸铁试验平台&a…

QT5制做两个独立窗口

目录 增加第二个窗口 主窗口文件添加一个私有成员为子窗口 定义两个槽函数和 关联按钮和子窗口和主窗口 添加子窗口成员 子窗口处理函数 补充回顾 增加第二个窗口 1、 2、 3 主窗口文件添加一个私有成员为子窗口 在mainwidget.h文件 同时添加两个槽;来处理…

(成品论文22页)24深圳杯数学建模A题1-4问完整代码+参考论文重磅更新!!!!

论文如下: 基于三球定位的多个火箭残骸的准确定位 针对问题一:为了进行单个残骸的精确定位,确定单个火箭残骸发生音爆 时的精确位置和时间,本文基于三球定位模型,考虑到解的存在性和唯一性, 选取了四个监测…

AI大模型日报#0430:疑似GPT4.5模型刷屏、上交实现「蛋白质功能定向进化」、微软紧急撤回WizardLM-2

导读: 欢迎阅读《AI大模型日报》,内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了今日要点以及每条资讯的摘要。 《AI大模型日报》今日要点: 在AI大模型领域,多项研究进展和行业应用动态引发关注。一夜之间&#x…

第9篇:创建Nios II工程之读取Switch的值<二>

Q:上一期我们完成了Quartus硬件工程部分,本期我们创建Nios II软件工程这部分。 A:创建完BSP和Nios II Application之后,在source文件main.c中添加代码:system.h头文件中新增了Switch PIO IP的硬件信息,包括…

气象数据nc数据矢量化处理解析及可视化

气象数据可视化是将气象学领域中复杂的数据集转化为图形或图像的过程,以直观展示天气现象、气候模式、趋势和预报结果。气象数据的可视化技术广泛应用于科学研究、气象预报、航空、航海、农业生产、灾害预警系统、城市规划、公众服务等领域。以下是一些关键的气象数…

Stability AI 推出稳定音频 2.0:为创作者提供先进的 AI 生成音频

概述 Stability AI 的发布再次突破了创新的界限。这一尖端模型以其前身的成功为基础,引入了一系列突破性的功能,有望彻底改变艺术家和音乐家创建和操作音频内容的方式。 Stable Audio 2.0 代表了人工智能生成音频发展的一个重要里程碑,为质量…

口袋实验室--使用AD2学习频谱参数测试

目录 1. 简介 2. 频谱相关参数 2.1 频谱相关基本概念 2.1.1 采样时间间隔 2.1.2 采样频率 2.1.3 采样点数 2.1.4 采样时间长度 2.1.5 谱线数 2.1.6 奈奎斯特频率 2.1.7 频谱分辨率 2.1.8 最高分析频率 2.1.9 频谱泄露 2.2 窗函数 2.2.1 AD2的窗函数 2.2.2 测试矩…

Cesium 3dTileset 支持 uv 和 纹理贴图

原理: 使用自定义shader实现uv自动计算 贴图效果: uv效果: