MySQL的CDC。3种简单的数据流方法

598 阅读10分钟

MySQL的CDC。3种简单的数据流方法

Sarad MohananonTutorials,Data Integration- February 1st, 2022 -Write for Hevo

MySQL是一个开源的关系型数据库系统,在全球大多数企业技术栈中都有一席之地。即使最近甲骨文公司施加的许可限制的发展导致流行度略有下降,它仍然是最常用的结构化数据库之一。在典型的架构中,MySQL被用作交易型数据库,有一个单独的数据仓库来支持分析和报告要求。

这种架构意味着经常需要将数据从MySQL转移或复制到数据仓库。在某些情况下,由于涉及报告的关键性,这种复制操作需要实时发生。被称为变化数据捕获的范式是对这种实时同步要求的回答。这篇文章是关于实现MySQL CDC到不同目标数据库的方法。这篇博客将详细介绍这三个方面的内容。此外,博客还强调了每种方法的优点和缺点,以便你可以评估所有选项并选择最适合你的路径。

目录

MySQL简介

MySQL Logo

图片来源

早在2019年,世界上有超过39%的开发者使用MySQL,使其成为世界上最受欢迎的数据库。它当然缺乏PostgreSQL所提供的广泛功能,但它对大量的应用程序如网络应用程序仍然有用。

由于它是LAMP栈的标准配置,其中LAMP栈是由Linux、Apache HTTP服务器、MySQL、PHP组成的网络应用程序开源套件;MySQL是可扩展网络应用程序的首选。让我们来谈一谈使MySQL成为一个很好的选择的几个突出的特点。

MySQL的主要特点

  • 由甲骨文公司维护。甲骨文公司拥有并维护MySQL。它还提供具有额外服务、专有插件、用户支持和扩展的高级版本的MySQL。
  • 历史悠久。自1995年首次发布以来,MySQL已经存在了20多年。
  • 频繁的更新。通过频繁的更新,MySQL变得更加强大,具有新的功能和安全改进。最新版本是2021年1月18日发布的8.0.23版。
  • MVCC功能。MySQL最近开始提供MVCC(多版本并发控制)功能。
  • 一个支持性的社区。一个由开发人员组成的专门社区在需要时可以帮助解决故障。
  • 开源。MySQL也是一个免费和开源的关系数据库管理系统(RDBMS)。
  • 用户。Google、NASA、Flickr、GitHub、Netflix、Tesla、Twitter、Uber、Wikipedia、YouTube、Zendesk等都广泛使用MySQL。

使用MySQL的主要优势

MySQL是一个轻量级的数据库,可以由开发人员在具有大型多层应用的生产应用服务器上安装和使用。利用MySQL作为你工作流程的一部分有几个优点。

  • MySQL支持主从复制、横向扩展等功能。
  • MySQL也支持卸载报告、地理数据分发。
  • 当用于只读应用时,MyISAM存储引擎的开销非常低。
  • 对于经常使用的表,为内存存储引擎提供支持。
  • 对于重复使用的语句,存在一个查询缓存。
  • 鉴于有大量有用的资源,如博客、白皮书和关于该主题的书籍,MySQL很容易学习和排除故障。
  • MySQL是一个高度灵活和可扩展的数据库管理系统。

设置MySQL CDC的方法

MySQL CDC可通过以下方法进行设置。

免费开始使用hevo

了解设置MySQL CDC的方法

CDC Diagram

图片来源

这些是你可以用来以无缝方式设置MySQL CDC的方法。

MySQL CDC设置:使用Hevo数据使用MySQL触发器

实现变化数据捕获的最简单方法是使用表的时间戳列。每当某一行有变化时,时间戳列就应该被改变。一个外部脚本可以轮询该表,并在时间戳与上次访问时间发生变化时采取适当的行动。这种方法的问题是,开发人员通常不会灵活地修改现有的表以适应CDC逻辑。这方面的解决方案是MySQL触发器。

触发器是数据库钩子,当数据库中发生预定义的事件时被执行。触发器可以被用来监听 INSERT、UPDATE 或 DELETE 操作。在实现CDC时,触发器被配置为在每次INSERT、UPDATE或DELETE发生时向外部表插入一条新行。让我们考虑一个简单的例子,如何为INSERT操作创建一个触发器。现在,让我们假设有一个源表 "students",其列是id、age和name。

  1. 创建第二个表student_cdc来捕获更新,如下所示。

    CREATE TABLE IF NOT EXISTS student_cdc (
    
     cdc_id BIGINT NOT NULL AUTO_INCREMENT,
    
     action varchar(100),
    
      id BIGINT,
    
      age BIGINT,
    
      name VARCHAR(100),
    
      last_modified_dt timestamp,
    
     PRIMARY KEY (‘cdc_id’)
    
     ) ENGINE=InnoDB;
    
  2. 创建一个触发器,如下图所示。

    CREATE TRIGGER ‘student_insert’
    
     AFTER INSERT ON ‘student’
    
     FOR EACH ROW BEGIN
    
     insert into ‘student_cdc’ (‘action’, id, age, name, last_modified_dt)
    
     values ('insert', NEW.id, NEW.age, NEW.name,now());
    

一旦完成这个配置,就可以实现一个脚本来轮询第二个表,并采取适当的行动将数据写入目标数据库。

尽管这是一个简单明了的方法,但也有多种弊端。

  • 触发器通常是性能密集型的,它可能导致交易型数据库的性能大幅下降。
  • 触发器是和事务一起执行的。因此,如果触发器有任何问题,整个交易就会失败。

MySQL CDC设置。使用二进制日志

MySQL二进制日志为跟踪MySQL CDC的数据变化提供了一种非常有效的方法。它们包含描述对数据的修改的事件。简而言之,二进制日志包含了从服务器启动时就开始追踪其全局状态所需的所有信息。为了启用二进制日志,MySQL服务器需要用-log-bin选项启动。

了解二进制日志如何工作的最好方法是使用mysqlbinlog,它可以以用户可读的形式打印二进制日志。有许多开源工具是建立在二进制日志功能之上的,以减轻开发者在实现MySQL CDC时的负担。一个很好的例子是 maxwell 工具,它读取二进制日志并写到Kafka。开发人员可以实现Kafka消费者来处理由maxwell产生的事件,并写入适当的目标数据库。

在使用这些二进制日志应用之前,请使用下面的片段来改变MySQL服务器的配置,以启用二进制日志。

[mysqld]

server-id  = 1

log_bin  = /var/log/mysql/mysql-bin.log

expire_logs_days = 10

max_binlog_size  = 100M

binlog-format    = row 

一旦服务器以上述配置启动,登录到MySQL shell,并执行插入操作。

insert into students (age,nam) values (15,’alex’);

假设maxwell已经安装,使用下面的命令在终端查看maxwell的输出。

./bin/maxwell --user=’mysql_maxwell_user’' --password=’maxwell_passwordl' --host='127.0.0.1' --producer=stdout      

输出结果将如下所示。

{"database":"school","table":"students","type":"insert","ts":1472937475,"xid":211209,
"commit":true,"data":{"age":15,”name”:”alex”}}

另一个基于二进制日志的应用的好例子是这里提供的python-mysql-replication。一旦安装,这个python工具可以提供一个二进制日志流, 经过处理后可以写入目标数据库。打印该流的代码将像下面的片段一样简单。

from pymysqlreplication import BinLogStreamReader

mysql_settings = {'host': '127.0.0.1', 'port': 3306, 'user': mysql_user, 'passwd': 'mysql_password'}

log_stream = BinLogStreamReader(connection_settings = mysql_settings, server_id=100)

for binlogevent in log_stream:

    binlogevent.dump()

log_stream.close()

虽然看起来很简单,但这只是完成工作的很小一部分。这里的一些挑战如下。

  • 一旦实现了二进制日志监听,还有一项繁琐的工作就是学习目标数据库的基础知识,并实现自定义逻辑,以写入目标数据库。
  • 另一个注意事项是,需要有一个机制来跟踪二进制日志的处理程度,以便在出错时有某种方式来重新启动这个过程。

与上述方法相比,更好的方法是实施一个自动ETL解决方案,如Hevo,它可以无缝地执行基于CDC的复制操作。

MySQL CDC设置。使用Hevo数据

Hevo Logo

图片来源

Hevo Data是一个全面管理的数据集成平台,它掩盖了上述所有的挑战,并提供了一个易于使用的界面,为各种目标数据库和数据仓库执行MySQL CDC。Hevo的点和点击界面允许开发人员实现这样的实时数据加载,并尽可能缩短生产时间。

Hevo可以帮助你在3个简单的步骤中设置MySQL CDC。

  1. 认证并连接你的MySQL数据源
  2. 选择变化数据捕获(CDC)作为你的复制模式
  3. 指向你要移动数据的目的地

在此注册以获得14天的免费试用

以下是Hevo可以为你提供的一些额外的方面。

  1. 易于实施- Hevo是一个完全管理的自我服务平台。你可以在短短的几分钟内建立并运行你的MySQL复制基础设施。
  2. 零维护- 一旦建立,Hevo将负责监测和维护你的数据管道从MySQL到目标数据仓库。在任何模式变化的情况下,Hevo可以自动处理,并在目标数据仓库复制相同的模式。
  3. 细致的日志- Hevo提供了细致的活动日志,允许你观察从MySQL到目标的数据流。这将使你能够始终保持对数据的关注。
  4. 通知和警报- 如果有什么需要你注意的,Hevo会通过电子邮件发送通知。这将使你能够立即采取行动,以确保来自MySQL数据的数据在你的目标数据库中始终是最新的。
  5. 可扩展的基础设施 - 虽然你的ETL要求是从MySQL CDC开始的,但它们往往不会就此结束。随着你的业务增长,你将需要把许多不同的数据源的数据引入你的目标/目的地。Hevo原生集成了100多个数据源,因此,当你的需求发生变化时,你可以扩展。

总结

这篇博客谈到了你可以用不同的方式来无缝设置MySQL CDC,即。MySQL触发器、二进制日志,以及在第三方工具Hevo的帮助下。

访问我们的网站,探索HEVO

从不同的数据源中提取复杂的数据可能是一项具有挑战性的任务,而这正是Hevo拯救的地方!Hevo提供了一种更快的方式,将数据从数据库或SaaS应用程序转移到你的数据仓库,在BI工具中进行可视化。Hevo是完全自动化的,因此不需要你去编写代码。

注册一个14天的免费试用,看看有什么不同!

你也可以看看我们无与伦比的价格,这将帮助你选择适合你的业务需求的计划!

无需编码的MySQL数据管线

免费试用