基于mysql binlog和flink broadcast实现配置动态更新

在flink流式计算中,需要动态的更新配置,而无需重启作业进程。

通过mysql binlog机制,可以实现配置的变化并可以捕获这一变化;

通过flink的broadcast机制,可以将这一动态变化广播到业务流,并进行相应的逻辑处理,最终实现配置的动态更新。

下面写一个简单的demo,仅供平时学习积累使用。

CDC

CDC全称Change Data Capture,变动数据捕获。它的核心思想是,监测并捕获数据库的变动,将这些变更按发生的顺序完整记录下来,写入到消息中间件中以供其他服务进行订阅及消费。

mysql binlog

MySQL 可以通过 binlog记录数据库的变动事件,而 MySQL 本身可以借助 binlog 来实现主从复制。binglog存储成二进制文件,可以通过mysql-binlog-connector-java包提供的类进行解析。下面是一个demo。

1. 创建一张配置表。

CREATE TABLE tb_config(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`source` VARCHAR(15),
`parameter` VARCHAR(15),
`operator` INT COMMENT "0是等于;是不等于;2是小于;3是大于",
`value` VARCHAR(15),
PRIMARY KEY (`id`) 
);

2. 查看数据库中binlog信息,Log_name就是bin log文件名,FileSize是该文件的大小。

SHOW MASTER LOGS;

3. 通过BinaryLogClient解析binlog。

public static void main(String[] args) throws Exception {
        final BinaryLogClient client = 
                new BinaryLogClient("127.0.0.1", 3306, "root", "root");
        client.setBinlogFilename("LAPTOP-LH-bin.000038"); //指定binlog文件
        client.setBinlogPosition(0); //指定从binlog的哪个位置开始读取
        client.registerEventListener(new BinaryLogClient.EventListener() {
            public void onEvent(Event event) {
                System.out.println("===========" + client.getBinlogPosition() + "===========");
                System.out.println("info=" + event.toString());
            }
        });
        client.connect();
    }

日志如下,此时如果对于数据库表进行增删改操作,binlog都会追加相应的信息。

===========2901===========
info=Event{header=EventHeaderV4{timestamp=1618712448000, eventType=EXT_WRITE_ROWS, serverId=1, headerLength=19, dataLength=29, nextPosition=3016, flags=0}, data=WriteRowsEventData{tableId=1527, includedColumns={0, 1, 2}, rows=[
    [uid, 0, 004]
]}}
===========3016===========
info=Event{header=EventHeaderV4{timestamp=1618712448000, eventType=XID, serverId=1, headerLength=19, dataLength=12, nextPosition=3047, flags=0}, data=XidEventData{xid=1794}}

配置动态更新Demo

数据源准备

测试数据来源于kafka的tb_data topic,配置数据源来源于mysql的tb_config表,最终根据配置,将处理后的测试数据,输出到控制台。

tb_data的数据格式是一个简单json:

{"uid": "001", "timestamp":"1618559580", "actionID":1, "source":"a"}
{"uid": "003", "timestamp":"1618559590", "actionID":3, "source":"a"}
{"uid": "0
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值