解析mysql binlog

目前有个功能需要将mysql中的数据同步到数仓(hdfs,kudu或者其他存储)中去,如果离线的方式可以考虑sqoop,spark,缺点就是延时比较高,可能一个小时,或者一天;数据一致性很难得到保证,mysql中的数据经常会变(当然你可以设置一个周期,例如按天同步的话,每次同步都同步过去一个月或者更长周期的数据)

现在的需求是需要数仓和mysql中的数据保持在秒级别的一致;目前的思路就是实时监听mysql binlog日志,使mysql中的数据变化实时同步到数仓中(这里需要注意的是,我们只监听insert,update,delete这几种event)

监听mysql binlog工具有很多,目前大多数使用

canal集群方式部署,系统比较臃肿,复杂性也相对较高,可定制性也比较差,所以我们没有考虑这种方案,采用了mysql-binlog-connector-java

首先需要修改mysql配置文件my.cnf,然后重启

server-id               = 1
log_bin                 = /var/log/mysql/mysql-bin.log
expire_logs_days        = 10
max_binlog_size   = 100M
binlog_format = ROW
#bind-address           = 127.0.0.1

重启后状态如下

查看状态
mysql> show variables like '%log_bin%';
+---------------------------------+--------------------------------+
| Variable_name                   | Value                          |
+---------------------------------+--------------------------------+
| log_bin                         | ON                             |
| log_bin_basename                | /var/log/mysql/mysql-bin       |
| log_bin_index                   | /var/log/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF                            |
| log_bin_use_v1_row_events       | OFF                            |
| sql_log_bin                     | ON                             |
+---------------------------------+--------------------------------+
6 rows in set (0.00 sec)

接下分析binlog,代码如下

import com.github.shyiko.mysql.binlog.BinaryLogClient;
import com.github.shyiko.mysql.binlog.event.Event;

public class BinlogParse {

    public static void main(String[] args) throws Exception {
        final BinaryLogClient client = new BinaryLogClient("10.23.92.189", 3306, "root", "hadoop");
        client.setBinlogFilename("mysql-bin.000002");
        client.setBinlogPosition(123);
        client.registerEventListener(new BinaryLogClient.EventListener() {

            public void onEvent(Event event) {

                System.out.println(event.toString());
                System.out.println(client.getBinlogPosition());

            }
        });
        client.connect();
    }
}

这里需要注意的是,如果你不指定如下参数,程序将从mysql当前binlog位置开始同步数据,这显然不是我们需要的,更多的时候我们需要灵活的从任意位置读取数据

client.setBinlogFilename("mysql-bin.000002");
client.setBinlogPosition(123);//从指定的位置读取binlog,具体位置可以在mysql中查看

读出来的binlog日志我们会封装成一个json字符串push到kafka,然后再从kafka消费数据到数仓(我们这边采用的是kudu),这样的话数仓中就有最实时的数据,olap引擎采用impala

需要注意的是delete from table 这种操作,表中数据是一条一条删除,如果表中数据非常大的话binlog日志也会非常大

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要使用MySQL JDBC驱动解析MySQL binlog,可以使用下面的步骤: 1.添加MySQL JDBC驱动:在pom.xml文件中添加以下依赖项: ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.25</version> </dependency> ``` 2.编写代码:使用JDBC连接到MySQL数据库,并获取binlog事件流。可以使用以下示例代码: ```java import java.io.IOException; import java.sql.*; import com.github.shyiko.mysql.binlog.BinaryLogClient; import com.github.shyiko.mysql.binlog.event.*; public class BinlogParser { public static void main(String[] args) throws IOException { BinaryLogClient client = new BinaryLogClient("localhost", 3306, "username", "password"); client.registerEventListener(event -> { EventData data = event.getData(); if (data instanceof WriteRowsEventData) { WriteRowsEventData writeRowsEventData = (WriteRowsEventData) data; System.out.println(writeRowsEventData.getRows()); } else if (data instanceof UpdateRowsEventData) { UpdateRowsEventData updateRowsEventData = (UpdateRowsEventData) data; System.out.println(updateRowsEventData.getRows()); } else if (data instanceof DeleteRowsEventData) { DeleteRowsEventData deleteRowsEventData = (DeleteRowsEventData) data; System.out.println(deleteRowsEventData.getRows()); } }); client.connect(); } } ``` 3.运行代码:启动应用程序并运行binlog事件监听器。这将输出所有写入、更新和删除事件的行数据。 以上就是使用MySQL JDBC驱动解析MySQL binlog的基本步骤。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值