TranslateProject/translated/tech/20230315.3 ⭐️⭐️ Synchronize databases more easily with open source tools.md

136 lines
8.1 KiB
Markdown
Raw Normal View History

2023-04-17 16:31:14 +08:00
[#]: subject: "Synchronize databases more easily with open source tools"
[#]: via: "https://opensource.com/article/23/3/synchronize-databases-apache-seatunnel"
[#]: author: "Li Zongwen https://opensource.com/users/li-zongwen"
[#]: collector: "lkxed"
[#]: translator: "cool-summer-021"
[#]: reviewer: " "
[#]: publisher: " "
[#]: url: " "
Synchronize databases more easily with open source tools
======
CDC 使用服务端代理记录、添加、更新和删除对数据表的各种操作。它以一种易用的关系型格式提供了关于数据变化的细节信息。它可以捕获将更改应用于已修改行的目标环境所需的列信息和元数据。这些信息保存在一个与被跟踪的源表的列结构相对应的变化表内。
捕获变化的数据可不是一件容易的事。不过,有一个开源项目————[Apache SeaTunnel][1],它是一个数据整合平台,它提供了符合设计理念的 CDC 功能和相关的工具箱,实现了对数据变化的捕获,其功能包括上文提到的和那些超越现有产品的解决方案。
### 使用场景
CDC的经典应用是数据同步或不同数据库间的备份。你可以在[MySQL][2], PostgreSQL, MariaDB等类似的数据库间进行数据同步。你也可以将数据同步到全文搜索引擎。借助 CDC你还可以基于 CDC 捕获的数据创建备份。
设计完成后,数据分析系统通过订阅目标数据表的变化情况获取需要处理的数据。不需要将分析过程嵌入已有系统。
### 在微服务间共享数据状态
微服务现在很流行但是在微服务间共享信息往往是一件复杂的事。CDC 就是可能的解决方案之一。微服务可以使用 CDC 来获取其他微服务的数据库变化,获取数据状态更新,以及执行相应逻辑。
### 更新缓存
[CQRS][4]是一种把查询操作分为一些命令的理念。其中有两点本质上的不同:
- 命令向数据源写入数据。
- 查询从数据源读取数据。
问题是,相对于写事件发生的时间,读事件什么时候发生,以及这些事件的发生是由谁来承担责任的?
更新缓存是困难的。你可以使用 CDC 从数据库获取数据更新事件,让它控制缓存的更新或失效。
CQRS 设计通常使用两种不同的存储实例来支持业务查询和更新操作。正是因为使用两个存储实例我们可以以可用性、性能和可伸缩性为代价使用分布式事务来确保数据一致性。你也可以使用CDC 来确保最终的数据一致性,它的性能和伸缩性较好,但其代价是数据延迟较严重,目前业界可以保持在毫秒范围内。
例如,你可以使用 CDC 把 MySQL 中的数据同步到你的全文搜索引擎比如ElasticSearch。在这种架构中ElasticSearch 搜索了所有的查询,但是当你需要修改数据时,你不能直接操作 ElasticSearch 的,你是修改上游的 MySQL 数据来实现的因此就生成了一个更新事件。当ElasticSearch 监视数据库时,这个事件就被系统消费了,并在 ElasticSearch 中提示更新。
在一些 CQRS 系统中,也可以用类似的方法更新查询视图。
### 痛点
CDC 不是一个新概念,很多现有的项目已经实现了它。但是对很多用户来说,已有解决方案存在一些不利因素。
#### 简单数据表配置
当你使用一些 CDC 软件时,你必须分别配置每个表。例如,为了同步十张表,你需要写十条 SQL 代码。为了进行一次转换操作,你也需要写与转换相关的 SQL 代码。
有时候,一张表可以手写,但只对数据量小的情况适用。当数据量大时,会发生类型映射或参数配置的错误,进而导致较高的操作和维护成本。
SeaTunnel是一个易用的数据集成平台有望解决这个问题。
#### 不支持模式演化
一些CDC 解决方案支持DDL 事件传递,但不支持传递到 Sink所以它能进行同步变更。由于基于 DDL 事件的类型转换是不可变更的,所以即使一个能获取事件的 CDC 也不一定可以将它发送至引擎Sink 不能遵循 DDL 事件来改变它)。
#### 太多的链接
在一些 CDC 平台上,当有多个表时,如果一张表被同步了,就必须使用链接来代表每张表。当存在多个表时,也需要很多链接。这就给源 JDBC 数据库带来了压力同时导致binlog 文件过多,还会导致重复的日志解析。
### SeaTunnel CDC 架构的目标
Apache SeaTunnel 是一个开源、高效、分布式、大量数据的集成架构。为了解决现有数据集成工具解决不了的问题,开发者社区“重新造轮子”,开发了一种具有独特功能的 CDC 平台。它的架构设计吸收了现有工具的优点,去除了相应的缺点。
Apache Seatunnel 支持:
- 以无锁、并行的方式快照历史数据。
- 日志心跳检测和动态添加数据表。
- 读取子数据库、子表和多结构表。
- 模式演化。
- 一切基础 CDC 功能。
减少了用户的操作和维护成本,并且支持动态添加数据表。
例如,当你要同步整个数据库,稍后需要添加一个新表,你不必手动维护、改变配置或重启当前工作。
另外Apache SeaTunnel也支持并行读取子数据库、子表和多结构表。还支持模式演化、DDL 转换和在引擎内改变支持的模式这些可以变为Transform和 Sink。
### SeaTunnel CDC 现状
如今CDC 拥有基本功能,支持自动增长和快照数据。它也支持 MySQL 实时和离线使用。MySQL 实时功能测试已完成即将进行离线测试。目前还不支持该模式因为它涉及对Transform和Sink的更改。不支持动态发现新增表已预留了一些支持多结构表的接口。
### 项目前景
作为 Apache 孵化的项目Apache SeaTunnel 的社区正快速发展起来。下一届社区计划会议的主要目标有:
#### 1. 发展并改进连接器和目录生态
我们正努力改善连接器和目录功能,包括:
- 支持连接更多数据库包括TiDB, Doris 和 Stripe。
- 改善现有的连接器的易用性和性能。
- 支持 CDC 连接器用于实时、增量同步场景。
任何对连接器感兴趣者都可以查看 [Umbrella][5].
#### 2. 支持更多数据集成场景 (SeaTunnel Engine)
现有的引擎仍然存在一些解决不了的痛点,例如对整个数据库的同步,表结构变化的同步以及大粒度的任务失败。
我们正努力解决这些问题,对此感兴趣者可以查看[issue 2272][6]。
#### 3. 更易使用Web 版)
我们正努力提供Web 平台接口令操作更简便。通过Web 平台接口我们将实现以DAG/SQL的形式查看目录、连接器、任务和相关信息。我们也会给予用户访问调度平台的权限以便更方便地进行任务管理。
欲了解更多关于 Web 版的信息,请访问[Web平台子项目][7]。
### 总结
必须严密追踪数据库的相关动态才能对数据的更新、删除或添加操作进行管理。CDC 提供了这种功能。Apache SeaTunnel是一个开源解决方案能满足这些需求它将持续迭代更新从而提供更多功能。相关的项目和社区也很活跃欢迎你的加入。
--------------------------------------------------------------------------------
via: https://opensource.com/article/23/3/synchronize-databases-apache-seatunnel
作者:[Li Zongwen][a]
选题:[lkxed][b]
译者:[cool-summer-021](https://github.com/cool-summer-021)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/li-zongwen
[b]: https://github.com/lkxed/
[1]: https://seatunnel.apache.org/
[2]: https://opensource.com/downloads/mariadb-mysql-cheat-sheet
[3]: https://www.redhat.com/en/topics/microservices?intcmp=7013a000002qLH8AAM
[4]: https://www.redhat.com/architect/illustrated-cqrs
[5]: https://github.com/apache/incubator-seatunnel/issues/1946
[6]: https://github.com/apache/incubator-seatunnel/issues/2272
[7]: https://github.com/apache/incubator-seatunnel-web