记录跨度3年的SqlServer数据同步项目分析

news2024/11/23 10:09:17

目录

技术选型决策阶段

发布订阅

自定义开发

Datax

Datax+废除主外键关系和自增ID

ER模型分组

废掉库表主外键

维度划分Datax任务

基于ID同步

基于TIME时间同步

基于全表ALL同步

废掉自增ID

DataX+废除主外键关系+手动拷贝

手动拷贝

Datax+任务分组+触发器

Datax全表

Datax增量同步

触发器

发布订阅+触发器

最终同步方案

原始库副本发布订阅

全触发器处理


在手上目前有个Sqlserver数据同步的项目终于接近尾声了,投入过程两个人,历时跨度3年(2022-2024)。最开始决策采用阿里Datax实现数据同步+触发器编程的方式来实现。由于库表结构有严格的主外键,所以ER关系网络相当复杂,需要将这些任务进行分组处理。期间几易方案,执行方案中途都会发现问题。任务拆分几乎为零,想起什么写什么,导致项目几近放弃。

该项目大致经历了四个阶段。所以最终的结论是:数据同步一定要做好数据规范再行动,尽可能地发挥团队力量集思广益。

技术选型决策阶段

发布订阅

采用SqlServer本身的发布订阅模式就可以很好地保证数据同步和一致性了,发布SqlServer需要限制它的使用内存,否则服务器会无限占用直到内存耗尽。

它支持四种模式:快照发布、事务发布、具有可更新的事务发布、合并发布。一般我们配置事务发布就行了,可以实现一对一、一对多等发布订阅。

自定义开发

自定义开发有很大的自由度,可以按照自己企业的需求进行定制化开发,这也方便企业积累一些技术解决方案。最开的项目只是为了同步文件,后来要求数据也要同步,决策层要求使用Datax。所以Datax一直都是方案中的主角。

定制开发无疑就是按照需求将需要的数据和文件进行存储和更新,这些细节的东西这里就不讲述了。

Datax

DataX 是阿里巴巴开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。

源码地址:GitHub - alibaba/DataX: DataX是阿里云DataWorks数据集成的开源版本。

对于不可变数据的定时同步Datax可以说在这方面很完美了,但是数据可变就不好操作了,时序问题、延迟问题就很麻烦。 有时候还需要对插件进行改造,比如插入失败尝试更新等等。以下是我们变更过的插件。

对Datax的JSON模板也做了扩展支持主外键模式:

reference:引用关系

parents: 外键父表

Datax+废除主外键关系和自增ID

ER模型分组

由于原始项目并非基于Java开发,所以没有生成对应的实体。可以利用数据库实例的数据库关系图可以快速了解表的关系,下面是部分表的关系图谱。

上图中有关系的表实际上是有严格插入顺序的,所以Datax在读取任务的时候需要将Json任务进行分组和优先级排序处理。

整理出来的关系按照文件夹进行分组:

文件夹内部的排序策略可以用字母和数字,一般将同一层级的放在一个文件夹下:

废掉库表主外键

将原始表的结构重新导出一份,去除掉主键和外键,以及自增ID,然后通过Datax跑存量数据,这种数据可能牵扯到更新,所以后期需要重新比对数据更新。

维度划分Datax任务

在同步的早期阶段,由于掌管业务数据库的同事描述有些需要根据ID、订单TIME和没有主键的表全表同步,所以将表任务的同步划分成了ID、TIME、ALL的维度进行同步。

基于ID同步

通过ID滑块进行Datax同步,设定迭代的ID区间,持续同步直到原始库和目标库数据一致。对于存量数据没有问题,但是涉及到数据的动态变化,此时没有考虑数据的变化。

基于TIME时间同步

通过TIME滑块进行Datax同步,设定迭代的TIME区间(订单的创建时间),持续同步直到原始库和目标库数据一致。对于存量数据没有问题,但是涉及到数据的动态变化,此时没有考虑数据的变化,以及特殊行业订单相关的数据会涉及大量的更新。

基于全表ALL同步

对于全表同步的这部分表,实际上是没有ID主键的表。现在回过头来,当时就应该从规范表结构做起,而不是对不规范臣服低头。一切数据源于规范才能有很强的可操作性。而Datax本身就是对异构数据规范化的同步。一切数据同步在于打平结构,规范输入和输出,这样才能节省时间和精力。

废掉自增ID

由于开始阶段对影响评估不足,导致目标库的ID和原始数据对不上,总数对上了,但是记录ID却完全不一样,使得我们的数据同步是不可靠的。于是只能废掉自增ID,重新开始同步。

DataX+废除主外键关系+手动拷贝

手动拷贝

由于在库表中存在大量的基础表,这些变化不是很频繁,所以决策层建议定期手动拷贝过去。但这样需要专人去处理,也时不合理的处理方式。一言堂的决策,有时候是拗不过的,所以就这样吧,无非Datax少建立一些任务而已。

Datax+任务分组+触发器

经历过主外键时序问题、主键自增问题之后,存量数据终于处理完了。对于业务数据的增量更新就提上日程了,这时候不得不说触发器就引入了。

最开始只做了update、delete类型的触发器操作,对于插入而言如果不及时,那么udpate和delete都是没有意义的。所以触发器执行不彻底也是导致数据不一致的根源,时序性很大程度依赖insert。

Datax全表

全表的处理无疑是这次数据同步的败笔,怎么说呢完全不需要这样处理。可以用ID代替,甚至后面TIME类型的都可以用ID模式去实现,只需要配置好表的逻辑先后优先级顺序。

Datax增量同步

datax的增量同步,目前好像还没有好的方式。虽然我们改造了Datax的同步插件,但是对于何时更新仍然只能靠触发器去拉起任务。除非深入去像SqlServer一样基于事务日志去做同步。

触发器

最终我们意识到,只能完全依赖触发器去处理结果集的同步,Datax仅仅作为任务表读取顺序存在。触发器的处理我们可以做到延迟1分钟以内。比如批量插入、批量更新、批量删除等等,以及数据一致性检查都可以保证数据最终一致性。

发布订阅+触发器

在使用原始库作为触发器时经常会遇到锁表的情况,触发器太多,有时候一个操作触发连锁反应,导致锁表影响工厂作业。所以我们考虑采用订阅副本上做触发器,然后同步到云上。

云上两个示例,也方便验证自定义数据同步的可靠性。

最终同步方案

分清楚数据同步阶段,对于定量数据不可变直接用Datax就够了,对于需要变更的加上触发器来处理。

原始库副本发布订阅

在原始库上建立发布表配置,采用事务发布。然后在订阅副本用快照去订阅库表的数据同步,这样能够防止因为触发器而影响工厂作业,同时保证了内网数据的一致性,来源一致性。

全触发器处理

最终方案我们采用了全触发器操作,insert、update、delete以及数据校验不一致处理。在备份迁移的过程中还没有建立触发器,那么这段时间的数据更新也要检查出来进行同步更新。以下是文件和数据的触发器记录表。

所有的触发器都采用生产者消费者模式去处理,以insert的operateTime为基线,提高并发处理update和delete记录。最终我们能够保证延迟在一分钟以内,当然还取决于是否积压未消费是否有大批量插入等等。

这个项目拖延至今,中间也是有不同的项目穿插,真花这么久没有结果问题就很严重了。期间还搞了文件同步,文件中转以及上阿里云OSS等等,都在这个项目中。方案整的磕磕巴巴,中转同步也是客户端不稳定等等,真的太耗费心力了。

云上核心表同步效果:

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

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

相关文章

实践案例:使用Jetpack Navigation创建一个新闻应用

在这个实践案例中,我们将使用Jetpack Navigation创建一个简单的新闻应用。这个应用将包含以下功能: 新闻列表页面:显示一组新闻文章。新闻详情页面:显示选定新闻文章的详细信息。用户资料页面:显示用户的资料信息。 …

前端 Array.sort() 源码学习

源码地址 V8源码Array 710行开始为sort()相关 Array.sort()方法是那种排序呢&#xff1f; 去看源码主要是源于这个问题 // In-place QuickSort algorithm. // For short (length < 22) arrays, insertion sort is used for efficiency.源码中的第一句话就回答了我的问题…

Python第三方库GDAL 安装

安装GDAL的方式多种&#xff0c;包括pip、Anaconda、OSGeo4W等。笔者在安装过程中&#xff0c;唯独使用pip安装遇到问题。最终通过轮子文件&#xff08;.whl&#xff09;成功安装。 本文主要介绍如何下载和安装较新版本的GDAL轮子文件。 一、GDAL轮子文件下载 打开Github网站…

【Java Web】Element-plus组件库

目录 一、Element-plus组件库概述 二、Element-plus组件库基本用法 一、Element-plus组件库概述 Element-plus组件库是由饿了么团队基于Vue3框架编写的前端UI设计组件库。通俗点讲就是将用户页面设计所需的按钮、表格、导航栏等前端代码编写生成的组件元素都封装好了、用户在进…

40.设计HOOK引擎的好处

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 上一个内容&#xff1a;39.右键弹出菜单管理游戏列表 以 39.右键弹出菜单管理游戏列表 它的代码为基础进行修改 效果图&#xff1a; 实现步骤&#xff1a; 首…

elk对于集群实例的日志的整合-基于logstash采集日志

说明&#xff1a;基于logstash采集日志 环境&#xff1a; 物理机192.168.31.151 一.启动2个测试实例&#xff0c;每5-10s随机生成一条订单日志 实例一 包位置&#xff1a;/home/logtest/one/log-test-0.0.1-SNAPSHOT.jar 日志位置:/docker/elastic/logstash_ingest_data/l…

《2024年新生代妈妈真实孕育状态洞察报告》

专注于行业分析与市场研究的专业机构易观分析,正式发布了其最新研究成果——《2024年新生代妈妈真实孕育状态洞察报告》。该报告深入探讨了新生代妈妈在孕育过程中的实际需求与挑战,通过对母婴行业的市场规模、消费行为、用户触媒习惯、用户关怀以及特定品类场景的细致分析,揭示…

easyui的topjui前端框架使用指南

博主今天也是第一次点开easyui的商业搜权页面&#xff0c;之前虽然一直在使用easyui前端框架&#xff08;easyui是我最喜欢的前端ui框架&#xff09;&#xff0c;但是都是使用的免费版。 然后就发现了easyui的开发公司居然基于easyui开发出了一个新的前端框架&#xff0c;于是我…

PLM系统选购指南:哪款品牌最适合你?

在选购PLM&#xff08;Product Lifecycle Management&#xff09;系统时&#xff0c;选择最适合自己企业的品牌至关重要。以下是一份清晰的PLM系统选购指南&#xff0c;帮助您根据企业的具体需求选择最合适的品牌&#xff1a; 1、明确企业需求&#xff1a; 首先&#xff0c;明…

数学建模--lingo解决线性规划问题~~灵敏度分析的认识

目录 1.线性规划问题举隅 &#xff08;1&#xff09;问题介绍 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;灵敏度分析 &#xff08;4&#xff09;方法缺陷 &#xff08;5&#xff09;可行域&凸集 2.lingo的简单认识 &#xff08;1&#xff09;默认…

VSCode常用的一些插件

Chinese (Simplified) 汉语&#xff08;简体&#xff09;拓展包。 Auto Close Tag 可以自动增加xml/html的闭合标签。 CodeSnap 截图神器。截图效果在下面。 Dracula Official vscode一个很好看的主题。 Git Graph git管理工具。 GitHub Repositories 有了它&#xff0c;不…

C++02 变量和基本类型

基本类型 字、字节、bit、Byte之间的关系 字 word 字节 Byte 位 bit 1字 2字节 <---> 1word 2Byte 1字节 8位 <---> 1Byte 8bit 1Byte 8bits 1KB 1024Bytes 1MB 1024KB 1GB 1024MB #include <iostream> using namespace std; int main() {/*字符…

手把手教你打造高精度STM32数字时钟,超详细步骤解析

STM32数字时钟项目详解 1. 项目概述 STM32数字时钟是一个集成了时间显示、闹钟功能、温湿度检测等多功能于一体的小型电子设备。它利用STM32的实时时钟(RTC)功能作为核心,配合LCD显示屏、按键输入、温湿度传感器等外设,实现了一个功能丰富的数字时钟系统。 2. 硬件组成 STM…

腾讯云对象存储cors错误处理

最近将公司的域名进行了修改&#xff0c;同时将腾讯云的对象存储改成了https&#xff0c;为了安全嘛。然后上传软件包的时候发现上传软件就失败了。 在浏览器中打开该 HTML 文件&#xff0c;单击 Test CORS 发送请求后&#xff0c;出现以下错误&#xff0c;错误提示&#xff1…

【Java Web】PostMan业务接口测试工具

目录 一、PostMan概述 二、如何安装Postman 三、Postman的基本使用 一、PostMan概述 在生产环境中&#xff0c;一个项目在开发之前、前后端开发工程师通常需要商讨在前后端数据交互时需要采用什么样的规范格式&#xff0c;如&#xff1a;前端向后端发送请求的uri、请求和响…

【索引】数据库索引之散列索引

目录 1、什么是散列&#xff1f; 2、如何评价一个散列函数的好坏&#xff1f; 3、散列中的桶溢出处理 4、散列在索引中的应用 4、顺序索引和散列索引的比较 1、什么是散列&#xff1f; 顺序文件组织的一个缺点是我们必须访问索引结构来定位数据&#xff0c;或者必须使用二…

datax入门(datax的安装与简单使用)——01

datax入门&#xff08;datax的安装与简单使用&#xff09;——01 1. 官网2. 工具部署&#xff08;通过下载DataX工具包&#xff09;2.1 下载、解压2.2 配置2.2.1 查看配置模版2.2.2 根据模版配置json2.2.3 启动DataX 3. datax的简单使用3.1 mysql2stream3.2 mysql2mysql3.2.1 拼…

HTML【重点标签】

一、列表标签 1.无序列表 父级别&#xff1a; 无序列表的标题 ----表示无序列表的整体&#xff0c;用于包裹li标签 子级别&#xff1a; 无序列表一行的内容 ----表示无序列表的每一项&#xff0c;用于包含一行的内容 语义&#xff1a;构建没有顺序的列表 特点&#xff1a;列…

php聚合快递寄快递小程序

一、引言&#xff1a;告别传统寄件&#xff0c;拥抱便捷新选择 在数字化时代&#xff0c;我们越来越追求便捷和高效。传统的寄件方式已经无法满足现代人快速、便捷的需求。因此&#xff0c;一款聚合快递优惠寄件小程序应运而生&#xff0c;它集合了多家快递公司&#xff0c;为…

Linux高级编程——进程

1.进程的含义? 进程是一个程序执行的过程&#xff0c;会去分配内存资源&#xff0c;cpu的调度 PID, 进程标识符 当前工作路径 chdir umask 0002 进程打开的文件列表 文件IO中有提到 &#xff08;类似于标准输入 标准输出的编号&#xff0c;系统给0&#xff0c;1&#xf…