FlinkCDC实现主数据与各业务系统数据的一致性(瀚高、TIDB)

         文章末尾附有flinkcdc对应瀚高数据库flink-cdc-connector代码下载地址

1、业务需求

        目前项目有主数据系统和N个业务系统,为保障“一数一源”,各业务系统表涉及到主数据系统的字段都需用主数据系统表中的字段进行实时覆盖,这里以某个业务系统的一张表举例说明:业务系统表TableB字段col_b3与主数据系统表TableA中col_a3不一致,需要用col_a3实时覆盖col_b3生成目标表TableB_new中间表,业务系统存储为国产瀚高数据库,中间库用TIDB。

2、需求分析

         业务系统已上线多年,存在历史数据和新数据,需要分两个阶段进行处理。

        第一阶段,历史数据通过TableA、TableB联合关联生成中间表TableC,其中TableC中的主数据字段已用主数据进行了更新,再将TableC实时同步到瀚高数据库中生成一个新的业务表TableB_new(TableC和TableB_new表结构一致);

        第二阶段,历史数据处理结束后,业务系统直接割接到新表TableB_new,后期新的业务数据用TableB_new与主数据表TableA关联,实时生成中间表TableC,再用FlinkCDC,实时同步TableC数据覆盖TableB_new主数据字段。

3、具体实现

        第一阶段流程图,历史数据处理,由TableA和TableB实时关联生成中间表TableC,再实时同步TableC到新的业务表TableB_new,完成历史数据主数据字段的覆盖:

        第二阶段流程图,业务割接到新表TableB_new实时同步,直接由TableA和TableB_new关联生成TableC,再用cdc任务实时同步到新业务 表TableB_new中,即可完成主数据的覆盖:

      

4、FlinkSQL脚本

4.1、第一阶段脚本

4.1.1、TableA实时关联TableB生成中间表TableC
//指定任务名称
set pipeline.name=task_TablA_Table_B_TableC;
//主数据源表TableA
DROP TABLE IF EXISTS TableA;
CREATE TABLE TableA(
   col_a1  varchar(255),
   col_a2  varchar(255),
   col_a3  varchar(255)
) WITH (
   'connector' = 'highgo-cdc',
   'hostname' = '10.*.*.*',
   'port' = '5866',
   'username' = 'cdcuser',
   'password' = '123456a?',
   'database-name' = 'databaseA',
   'schema-name' = 'public',
   'table-name' = 'TableA',
   'slot.name' = 'TableA',
   'decoding.plugin.name' = 'pgoutput',
   'scan.incremental.snapshot.enabled' = 'false'
);
//业务数据源表TableB
DROP TABLE IF EXISTS tableB;
CREATE TABLE tableB(
   col_b1  varchar(255),
   col_b2  varchar(255),
   col_b3  varchar(255)
) WITH (
   'connector' = 'highgo-cdc',
   'hostname' = '10.*.*.*',
   'port' = '5866',
   'username' = 'cdcuser',
   'password' = '123456a?',
   'database-name' = 'databaseB',
   'schema-name' = 'public',
   'table-name' = 'TableB',
   'slot.name' = 'TableB',
   'decoding.plugin.name' = 'pgoutput',
   'scan.incremental.snapshot.enabled' = 'false'
);
//中间表TableC
DROP TABLE IF EXISTS TableC;
CREATE TABLE TableC(
   col_c1  varchar(255),
   col_c2  varchar(255),
   col_c3  varchar(255)
) WITH (
   'connector' = 'jdbc',
   'url' = 'jdbc:mysql://10.8.8.8:4000/databaseC',
   'username' = 'root',
   'password' = '*****',
   'table-name' = 'TableC',
   'driver' = 'com.mysql.jdbc.Driver'
);
insert  into tableC  
select 
b.col_b1 as col_c1,
b.col_b2 as col_c2,
CASE
  WHEN a.col_a3 IS NOT NULL THEN  a.col_a3
  ELSE b.col_b3
END  as col_c3
from TableB  t1   left join TableA t2  on b.fk=a.id;
4.1.2、TableC实时同步到TableB_new
//指定任务名称
set pipeline.name=task_TableC_TableB_new;
//中间表TableC  TIDB
DROP TABLE IF EXISTS TableC;
CREATE TABLE TableC(
   col_c1  varchar(255),
   col_c2  varchar(255),
   col_c3  varchar(255)
) WITH (
    'connector' = 'tidb-cdc',
    'tikv.grpc.timeout_in_ms' = '20000',
    'pd-addresses' = '10.*.*.*:4000',
    'database-name' = 'databaseC',
    'table-name' = 'TableC'
);
//业务结果表 写入瀚高数据库
DROP TABLE IF EXISTS TableB_new;
CREATE TABLE TableB_new(
   col_b1  varchar(255),
   col_b2  varchar(255),
   col_b3  varchar(255)
) WITH (
    'connector' = 'jdbc',
    'url' = 'jdbc:highgo://10.*.*.*:5866/databaseB?currentSchema=public',
    'username' = 'sysdba',
    'password' = '****',
    'table-name' = 'TableB_new',
    'driver' = 'com.highgo.jdbc.Driver'
);
insert  into TableB_new 
select
 col_c1 as col_b1,
 col_c2 as col_b2,
 col_c3 as col_b3,
from  TableC;

4.2、第二阶段脚本

4.2.1、TableA实时关联TableB_new生成中间表TableC
//指定任务名称
set pipeline.name=task_TablA_Table_B_TableC;
//主数据源表TableA
DROP TABLE IF EXISTS TableA;
CREATE TABLE TableA(
   col_a1  varchar(255),
   col_a2  varchar(255),
   col_a3  varchar(255)
) WITH (
   'connector' = 'highgo-cdc',
   'hostname' = '10.*.*.*',
   'port' = '5866',
   'username' = 'cdcuser',
   'password' = '123456a?',
   'database-name' = 'databaseA',
   'schema-name' = 'public',
   'table-name' = 'TableA',
   'slot.name' = 'TableA',
   'decoding.plugin.name' = 'pgoutput',
   'scan.incremental.snapshot.enabled' = 'false'
);
//业务数据源表 也是目标表TableB_new
DROP TABLE IF EXISTS TableB_new;
CREATE TABLE tableB(
   col_b1  varchar(255),
   col_b2  varchar(255),
   col_b3  varchar(255)
) WITH (
   'connector' = 'highgo-cdc',
   'hostname' = '10.*.*.*',
   'port' = '5866',
   'username' = 'cdcuser',
   'password' = '123456a?',
   'database-name' = 'databaseB',
   'schema-name' = 'public',
   'table-name' = 'TableB_new',
   'slot.name' = 'TableB_new',
   'decoding.plugin.name' = 'pgoutput',
   'scan.incremental.snapshot.enabled' = 'false'
);
//中间表TableC
DROP TABLE IF EXISTS TableC;
CREATE TABLE TableC(
   col_c1  varchar(255),
   col_c2  varchar(255),
   col_c3  varchar(255)
) WITH (
   'connector' = 'jdbc',
   'url' = 'jdbc:mysql://10.8.8.8:4000/databaseC',
   'username' = 'root',
   'password' = '*****',
   'table-name' = 'TableC',
   'driver' = 'com.mysql.jdbc.Driver'
);
insert  into tableC  
select 
b.col_b1 as col_c1,
b.col_b2 as col_c2,
CASE
  WHEN a.col_a3 IS NOT NULL THEN  a.col_a3
  ELSE b.col_b3
END  as col_c3
from TableB_new  t1   left join TableA t2  on b.fk=a.id;
4.2.2、TableC实时同步到TableB_new

        与4.1.2脚本一致,略

      备:flink-cdc-connector代码:支持瀚高数据库Highgo下载地址:

 https://github.com/lujisen/flink-cdc-connectors.giticon-default.png?t=N7T8http://xn--flink-cdc-connector-jz52b18z5q4dqpxn

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆继森

您的鼓励将是我们创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值