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

目录

技术选型决策阶段

发布订阅

自定义开发

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+废除主外键关系和自增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等等,都在这个项目中。方案整的磕磕巴巴,中转同步也是客户端不稳定等等,真的太耗费心力了。

云上核心表同步效果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Java微信小程序自驾游拼团设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟感兴趣的可以先收藏起来,还…

深度学习11-20

1.神经元的个数对结果的影响: (http://cs.stanford.edu/people/karpathy/convnetjs/demo/classify2d.html) (1)神经元3个的时候 (2)神经元是10个的时候 神经元个数越多,可能会产生…

Django安装与启动

1、Django是什么? 基于python的Web开发框架,支持用户快速开发安全、可维护的网站 2、怎么安装? pip install Django4.2 3、如何启动? 不写ip和端口时候,默认启动http://127.0.0.1:8000/ python .\manage.py runse…

STM32HAL库 -- RS485 开发板通信(速记版)

在本章中, 我们将使用 STM32F429的串口 2 来实现两块开发板之间的 485 通信(半双工)。 RS485 简介 485(一般称作 RS485/EIA-485)隶属于 OSI 模型物理层,是串行通讯的一种。电气特性规定为 2 线,半双工,多…

基于Java的家教信息管理平台

作者介绍:计算机专业研究生,现企业打工人,从事Java全栈开发 主要内容:技术学习笔记、Java实战项目、项目问题解决记录、AI、简历模板、简历指导、技术交流、论文交流(SCI论文两篇) 上点关注下点赞 生活越过…

入门篇:创建和运行Hello World

DevEco Studio安装完成后,可以通过运行Hello World工程来验证环境设置是否正确。接下来以创建一个支持Phone设备的工程为例进行介绍。 创建一个新工程 打开DevEco Studio,在欢迎页单击Create Project,创建一个新工程。根据工程创建向导&…

手持小风扇哪个品牌好耐用?手持小风扇品牌排行榜揭晓分享

炎炎夏日,手持小风扇、USB小风扇,成为人手一台的“网红”。这些小风扇造型小巧,可以装进包里,夏日出街或者挤公交地铁都可以拿出来吹一吹。那么这些小风扇性价比高不高呢?真的好用吗?耐用吗?根据…

小程序开发平台源码系统——内容付费(知识付费)小程序功能 带完整的安装代码包以及搭建部署教程

系统概述 随着互联网的发展,人们对于知识和信息的获取需求日益增长。内容付费小程序应运而生,为用户提供了一个便捷、高效的知识交易平台。小程序开发平台源码系统则为开发者提供了构建内容付费小程序的基础和工具,使其能够快速打造具有个性化…

svn明明都在环境变量中添加了,但还是无法在cmd中生效

svn明明都在环境变量中添加了,但还是无法在cmd中生效 cmd显示原因问题解决 cmd显示 svn不是内部或外部命令,也不是可运行的程序或批处理文件 原因 安装svn一直点下一步下一步…,没有勾选command line client。 问题解决 1.按下winx&…

Win10环境下chromadb安装报错的解决方案

ChromaDB(也称为Chroma)是一个开源的向量数据库,主要用于AI和机器学习场景。本文记录安装过程中遇到的问题及解决方式。 执行pip安装命令 pip install chromadb0.4.15 -i https://pypi.tuna.tsinghua.edu.cn/simple问题一 报错信息 error…

艺术与科技的精湛融合:探讨AI绘画与AI动画的交汇点

前言 艺术与科技的精湛融合:探讨AI绘画与AI动画的交汇点 在当代社会中,艺术和科技的结合呈现出了从来灭有的创新和可能性。随着人工智能技术的不断发展,AI绘画与AI动画的融合愈发引人瞩目。这一融合不仅给艺术家们带来了更多创作的可能&…

C语言实现KMP算法

#include<stdio.h> #include<string.h> #include<stdlib.h>void getNextArray(char * sub_str, int sub_str_length, int * next_array); int kmpSearch(char * sub_str, char * main_str);int main(void) {// 1 声明用于算法处理的字符串char origin_str[] …

量化交易策略:定义及其重要性

量化交易是华尔街和硅谷的秘密结合点&#xff0c;在这里数学和算法与金钱和市场相遇。虽然它曾经是金融巨头的专属领域&#xff0c;但现在它比以往任何时候都更易于接触。 但不要被愚弄&#xff0c;量化交易仍然是一种高速、高压的游戏&#xff0c;在毫秒间可以赚到或失去财富…

ManageEngine连续荣登Gartner 2024年安全信息和事件管理魔力象限

我们很高兴地宣布&#xff0c;ManageEngine再次在Gartner的安全信息和事件管理&#xff08;SIEM&#xff09;魔力象限中榜上有名&#xff0c;这是我们连续第七年获得这一认可。 Gartner ManageEngine Log360是一款全面的SIEM解决方案&#xff0c;旨在帮助组织有效处理日志数据…

Quads,一个无敌的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个无敌的 Python 库 - Quads。 Github地址&#xff1a;https://github.com/fogleman/Quads 在科学计算和工程应用中&#xff0c;数值积分是一个常见的问题。Python的Quads库…

Java基础知识整理笔记

目录 1.关于Java概念 1.1 谈谈对Java的理解&#xff1f; 1.2 Java的基础数据类型&#xff1f; 1.3 关于面向对象的设计理解 1.3.1 面向对象的特性有哪些&#xff1f; 1.3.2 重写和重载的区别&#xff1f; 1.3.3 面向对象的设计原则是什么&#xff1f; 1.4 关于变量与方…

vite 创建vue3项目 集成 ESLint、Prettier、Sass等

在网上找了一大堆vue3脚手架的东西&#xff0c;无非就是vite或者vue-cli,在vue2时代&#xff0c;vue-cli用的人挺多的&#xff0c;也很好用&#xff0c;然而vue3大多是和vite搭配搭建的&#xff0c;而且个人感觉vite这个脚手架并没有那么的好用&#xff0c;搭建项目时只能做两个…

McgsPro初级使用教程

MCGS触摸屏 1.也被称为昆仑通态触摸屏&#xff0c;是一款在工业自动化领域广泛应用的触摸屏产品。 2.以其高度可靠、多点触控、防水防尘、宽温设计、强大的通信能力、多样化的显示内容、灵活的组态设计和丰富的脚本编程等特点&#xff0c;成为工业自动化领域的强大伙伴。 下载好…

科技创新前沿:Web3在全球发展中的角色

随着数字技术的快速发展&#xff0c;Web3作为新一代互联网技术正逐渐引领着全球科技创新的潮流。本文将深入探讨Web3技术的定义、特点&#xff0c;以及它在全球范围内的应用和未来发展的前景。 1. 引言&#xff1a;Web3技术的定义与演进 Web3是指建立在区块链技术和加密经济学…

还在花钱做数据可视化?为大家推荐一款免费可视化工具

在当今数据驱动的世界里&#xff0c;数据可视化已经成为不可或缺的工具&#xff0c;帮助我们更好地理解和分析信息。然而&#xff0c;许多企业和个人仍在为昂贵的可视化软件买单&#xff0c;承受着高昂的费用和复杂的操作流程。因此&#xff0c;作为一个经常接触数据可视化的相…