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

本文介绍如何在Flink流处理中利用MySQL binlog实现配置动态更新,无需重启作业。通过CDC捕获数据库变更,结合广播机制将配置变化应用于业务逻辑,展示了一个简单的配置动态更新Demo。

在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": "003", "timestamp":"1618559690", "actionID":2, "source":"a"}
{"uid": "001", "timestamp":"1618559779", "actionID":2, "source":"a"}

 

tb_config表的数据样例如下,id是自增键值;source是用于和配置关联的资源类型;parameter是操作字段;operator是操作类型,是一个枚举值;value是操作值,即用于和数据进行比较的值。

第一条规则是过滤出uid为003的值,第二条规则是过滤出timestamp大于1618559580的值。这两条配置的关系是,即

### 三、MySQL Binlog 的作用及其底层实现机制 MySQL 的二进制日志(Binary Log,简称 binlog)是 MySQL 数据库中用于记录所有对数据库数据结构产生变更的操作日志。它在数据库的复制、恢复、审计等关键功能中扮演着重要角色。 #### 1. Binlog 的主要作用 - **主从复制**:binlogMySQL 主从复制机制的核心,主库将所有数据变更记录到 binlog 中,从库通过读取并重放这些日志实现数据同步[^2]。 - **数据恢复**:在数据库发生故障时,可以通过 binlog 恢复特定时间段内的数据操作,实现时间点级别的恢复。 - **审计与调试**:binlog 提供了详细的 SQL 操作记录,可用于审计数据库变更,或用于排查数据异常问题。 - **高可用与容灾**:在搭建高可用架构(如 MHA、MMM)或容灾系统时,binlog 提供了数据一致性保障的基础。 #### 2. Binlog 的格式类型 MySQL 支持三种 binlog 格式: - **STATEMENT**:记录 SQL 语句本身。适用于大多数简单查询,但某些函数(如 UUID()、NOW())可能导致主从不一致。 - **ROW**:记录每一行数据的实际变更。相比 STATEMENT 更加安全,适用于所有场景,但日志体积较大。 - **MIXED**:混合模式,MySQL 自动选择使用 STATEMENT 或 ROW 格式,兼顾性能与一致性[^2]。 #### 3. Binlog 的底层实现机制 binlog 是以文件形式存储在磁盘上的,其写入机制为顺序写入,具有较高的性能。每个 binlog 文件都有一个固定大小限制(默认为 1GB),当达到上限时会自动切换到下一个文件。 - **日志文件命名**:binlog 文件通常以配置中指定的前缀命名,如 `mysql-binlog.000001`、`mysql-binlog.000002` 等。 - **事务一致性**:对于支持事务的引擎(如 InnoDB),binlog 的写入会在事务提交时进行,确保事务的原子性持久性。 - **日志索引文件**:除了 binlog 文件本身,MySQL 还维护一个索引文件(如 `mysql-binlog.index`),用于记录所有 binlog 文件的列表顺序。 #### 4. Binlog 的生命周期管理 - **日志过期**:可以通过 `expire_logs_days` 参数设置 binlog 的自动清理天数,避免日志文件无限增长。 - **手动清理**:DBA 可以使用 `PURGE BINARY LOGS` 命令手动删除旧的 binlog 文件。 - **日志切换**:使用 `FLUSH LOGS` 命令可以手动触发 binlog 文件的切换,生成新的日志文件。 #### 5. 查看 Binlog 内容 可以使用 `mysqlbinlog` 工具查看 binlog 文件内容,例如: ```bash /usr/local/mysql/bin/mysqlbinlog --no-defaults /usr/local/mysql/data/binlog/mysql-bin.000001 ``` 该命令将输出 binlog 中记录的 SQL 操作、事务信息、时间戳等详细内容[^1]。 --- ###
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值