CDC 全称 Change Data Capture 这是一种数据集成技术,用于捕获数据库中的变更(插入、更新、删除操作),并将这些变更实时地传输到数据仓库、数据湖或其它数据平台中。
在处理数据库迁移过程中,可以考虑在第一次全量同步之后直至割接之前,使用此技术持续同步增量部分的数据,本文将介绍开源 CDC 工具 Airbyte。
安装
Airbyte 的安装将使用 helm,需要提前准备好 helm 命令和 k8s 集群。
执行以下命令添加 helm 仓库并安装 Airbyte:
helm repo add airbyte https://airbytehq.github.io/helm-charts
helm upgrade --install airbyte airbyte/airbyte -n airbyte --create-namespace --set global.airbyteUrl=172.22.44.16:30080 --set webapp.service.type=NodePort --set global.logs.minio.enabled=true ##global.airbyteUrl 的值根据实际情况修改
安装好之后,直接登录即可。
初始化数据库
在同步数据之前先准备两个数据库,本次实验准备了两个 MySQL,执行以下命令进行安装:
helm install mysql oci://registry-1.docker.io/bitnamicharts/mysql --set architecture='replication' --set auth.rootPassword='root' -n airbyte --version 9.14.2
helm install migrate oci://registry-1.docker.io/bitnamicharts/mysql --set architecture='replication' --set auth.rootPassword='root' -n airbyte --version 9.14.2
- mysql:mysql-primary.airbyte
- migrate: migrate-mysql-primary.airbyte
在 migreate 数据库中执行以下 SQL 语句:
create database migrate;
CREATE TABLE IF NOT EXISTS migrate.sample_data (
user_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
age INT NOT NULL,
email VARCHAR(255) NOT NULL
);
use migrate;
DELIMITER $$
CREATE PROCEDURE GenerateSampleData()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <= 10000 DO
INSERT INTO migrate.sample_data (name, age, email)
VALUES (
CONCAT('Name', i),
FLOOR(RAND() * 90 + 10), -- 随机年龄从10到100
CONCAT('name', i, '@example.com')
);
SET i = i + 1;
END WHILE;
END$$
DELIMITER ;
CALL GenerateSampleData();
在 mysql 数据库中执行以下 sql 语句:
create database migrate;
数据同步
下面的操作将在 airbyte 的页面进行,在浏览器上打开 172.22.44.16:30080 地址。(此地址按照实际进行更改)
创建源
按照以下图片内容添加源数据库的相关信息:
创建目标
按照图片内容添加目标数据库的相关信息:
创建连接
在创建好之后,在导航栏中找到 Connections 的按钮,进入点击创建一个新的 connection。经过以下几个步骤:
- 选择刚才创建好的源
- 选择刚才创建好的目标
- 选择要同步数据的表
- 设置同步相关配置,主要分为两个方面:
- 调度:调度分为三种,分别是:手动,cron 和按时间周期调度。
- 同步模式:分为两个大类:Full Refreash 和 Incremental Sync,这两种同步最大的区别是,Full Refresh 是对整个表进行操作,Incremental 是对修改和新增的数据进行操作。
在配置好之后进入新创建 Connection 页面的右上角有一个 Sync now 按钮,点击即可进行数据同步。同步结果如下图所示即为正常: