人大金仓使用Flink-CDC

前言

最近项目上要求把数据库从MySQL迁移到国产数据库人大金仓,其中涉及到两个技术问题:

  • MySQL的数据迁移到金仓数据库;

  • 将项目上Flink-MySQL-CDC的代码修改成Kingbase-CDC的代码;

第一个问题可以通过金仓官网提供的迁移工具KDTS,它支持WEB版,在linux环境也能使用。

第二个问题,看了一圈Flink和金仓数据库的官网,没有找到官方提供的CDC方案。又想到Flink官方对MySQLPostgreSQLOracle这些主流数据库都提供了官方CDC方案,而金仓数据库对它们也做了高度的兼容性适配,所以我就从这个角度开始寻找解决思路,最后我的答案是使用Postgre-CDC

**为什么人大金仓数据库可以使用PostgreSQL数据库的驱动包实现Flink-CDC功能?**从下表可以看出人大金仓数据库是基于PostgreSQL开发,同样都支持WAL日志的逻辑复制,所以人大金仓数据库对PostgreSQL高度兼容。

添加依赖

添加 PostgreSQL 驱动包,重启 Flink 服务和 Dinky服务。不知道怎么部署 FlinkDinky的童鞋可以看我以前发表过的文章。

bash 复制代码
# 在 ${FLINK_HOME}/lib 下添加 PostgreSQL 驱动包
mv /ops/app/postgresql-42.5.0.jar /ops/app/flink/lib/postgresql-42.5.0.jar

# 在 ${DINKY_HOME}/lib 下添加 PostgreSQL 驱动包
mv /ops/app/postgresql-42.5.0.jar /ops/app/dinky/customJar/postgresql-42.5.0.jar

# 重启Flink
/ops/app/flink/bin/stop-cluster.sh
/ops/app/flink/bin/start-cluster.sh

# 重启Dinky
/ops/app/dinky/bin/auto.sh restart

修改数据库配置

本文部署的Kingbase数据库版本是V008R006C009B0014 ,通过select version()语句查询。kingbase.conf配置文件的默认路径是在数据库的数据目录下,例如:/opt/Kingbase/ES/V8/data/kingbase.conf

ini 复制代码
vim /ops/app/kingbase/data/data/kingbase.conf

#修改wal_level配置为logical,默认是replica
wal_level = logical

# 重启服务
docker restart kingbase

#数据库查看配置是否生效
SHOW wal_level;

wal_level的各个级别以及所代表的含义如下表:

Dinky的数据开发中新建一个任务脚本,写下如下SQL代码:

SQL 复制代码
SET sql-client.execution.result-mode=tableau;

CREATE TABLE source_table (     
	`id` STRING COMMENT '主键id',
    `created_time` BIGINT NOT NULL COMMENT '创建时间',
    `remark` STRING,
    PRIMARY KEY ( `id` ) NOT ENFORCED
) WITH (    
    'connector' = 'postgres-cdc',    
    'hostname' = 'xxx.xxx.xxx.xxx',    
    'port' = '54321',
    'username' = 'kingbase',
    'password' = 'xxxxxx',
    'database-name' = 'kingbase',
    'schema-name' = 'public',
    'table-name' = 'iot_dict_info',
    'slot.name' = 'postgre_cdc_slot_source_table', -- 请修改为具有业务意义的唯一名称,可以随意
    'scan.startup.mode' = 'initial', 
    'debezium.database.tablename.case.insensitive' =  'false',  
    'debezium.lob.enabled' = 'true'  
);
	  
CREATE TABLE target_table (   
	 `id` STRING COMMENT '主键id',
    `created_time` BIGINT NOT NULL COMMENT '创建时间',
    `remark` STRING,
    PRIMARY KEY ( `id` ) NOT ENFORCED
) WITH (   
    'connector' = 'jdbc',  
    'url' ='jdbc:postgresql://xxx.xxx.xxx.xxx:54321/kingbase',  
    'username' = 'kingbase',
    'password' = 'xxxxxx',
    'table-name' = 'public.iot_dict_info2',
    'driver' = 'org.postgresql.Driver',
    'scan.fetch-size' = '200' 
) ;


insert into target_table
select * from source_table;

以上代码主要目的就是通过CDC方式,从源表iot_dict_info读取数据写到目标表iot_dict_info2。和MySQL-CDC的主要不同点是,Postgre-CDC有一个slot.name的必填配置,一般来说建议每个任务都有各自的唯一名称,名称可以自由发挥。KingbasePostgreSQL一样都支持Schema,这一点和MySQL也不同,所以还需要一个schema-name配置。本文示例中的database-schema-table的三层结构是kingbase-public-iot_dict_info

iot_dict_info源表数据如下

iot_dict_info2目标表同步后数据如下

参考

KingbaseES V9 --- KingbaseES产品手册

MySQL至KingbaseES迁移最佳实践 --- KingbaseES产品手册

KDTS 迁移工具使用指南 --- KingbaseES产品手册

相关推荐
Gopher_HBo2 小时前
阻塞队列之SynchronousQueue
后端
understandme2 小时前
30 毫秒教会你怎么在 TKE 搭建 Istio
后端
神奇小汤圆2 小时前
Spring Boot:别再重复造轮子,这些内置功能香麻了
后端
tonydf2 小时前
快速上手AI网关——LiteLLM
后端·aiops
Pkmer2 小时前
类的封装性: 让门面设计模式来打开这扇门
后端·设计模式
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题】【Java基础篇】第35题:怎样声明一个类不会被继承?什么场景下会用
java·开发语言·后端·面试
2301_782040453 小时前
JavaScript中Map在频繁增删键值对场景下的稳定性
jvm·数据库·python
无限进步_3 小时前
【C++】AVL树完全解析:从平衡因子到四种旋转
c语言·开发语言·数据结构·c++·后端·算法·github
渐儿3 小时前
Claude Code 的 Hooks 系统
后端