【Maxwell】MySQL数据监听

背景

我们都知道随着业务的发展,监听数据库的数据变更及时性是必须的,虽然我们可以在入库之前进行处理,但是有个问题就是事务的一致性不好掌控,而且很多业务都是微服务的,那么不在一个微服务中,可能有需要跨服务去调用,那么此时直接去监听mysql的binlog来实现数据的操作既可以实现及时性又可以和业务解耦
目前市面上比较流行的就是cancel和maxwell,那么我们该如何去选型呢?这里我说下我的选型历程

大数据组件之Maxwell与Canal工具对比

【Maxwell】MySQL数据监听_第1张图片

  • Canal是阿里公司使用Java开发,Maxwell是zendesk公司使用Java开发。
  • Canal支持高可用HA,支持断点续传。Maxwell不支持HA,但是支持断点续传,要想支持HA需要自己实现。
  • Canal由于有Client消费数据,针对binlog数据可以使用Client自定义数据格式, - - Maxwell支持Json数据写出到Kafka或Redis。
  • Canal只能获取MySQL最新数据,Maxwell支持Bootstrap,可以支持获取MySQL中历史数据。
  • Canal采用Server+client模式,Maxwell没有采用这种模式,直接将数据发送到Kafka或者Redis等。
    总体来看,Maxwell相对于Canal更加轻量级

格式的区别

执行insert

INSERT INTO z_user_info VALUES(30,'zhang3','13810001010'),(31,'li4','1389999999'); 

【Maxwell】MySQL数据监听_第2张图片

执行update

UPDATE z_user_info SET user_name='wang55' WHERE id IN(30,31) 

【Maxwell】MySQL数据监听_第3张图片

执行delete

DELETE FROM z_user_info WHERE id IN(30,31) 

【Maxwell】MySQL数据监听_第4张图片
总结数据特点
日志结构

    canal 每一条SQL会产生一条日志,如果该条Sql影响了多行数据,则已经会通过集合的方式归集在这条日志中。(即使是一条数据也会是数组结构)
    maxwell 以影响的数据为单位产生日志,即每影响一条数据就会产生一条日志。如果想知道这些日志是否是通过某一条sql产生的可以通过xid进行判断,相同的xid的日志来自同一sql。
    带原始数据字段定义 
     canal数据中会带入表结构。maxwell更简洁

【Maxwell】MySQL数据监听_第5张图片

Maxwell如何集成?

修改 my.cnf 文件,配置 binlog

修改 /etc/my.cnf 文件,在 [mysqld] 模块下添加如下内容:

[mysqld]
server_id=1
# binlog 文件前缀
log-bin=mysql-bin
# binlog 模式
binlog_format=row
# 需要生成 binlog 的库,有几个库需要生成 binlog 则添加几行,如果不做该配置,则所有库都会生成 binlog
binlog-do-db=sys_base
binlog-do-db=vota_upgrade

修改完成后,重启 MySQL

默认的 binlog 文件存放在 /var/lib/mysql 目录下,如果当前尚未对库做任何修改,则 binlog 文件大小一定为 154 字节,每次重启 MySQL 都会生成新的 binlog 文件,mysql-bin.index 文件内记录了当前使用的 binlog 文件名称

初始化 Maxwell 数据库

MySQL 中新建数据库用来存放 Maxwell 的元数据:

CREATE DATABASE maxwell;

创建用户用于访问 maxwell 数据库:

CREATE USER 'maxwell'@'%' IDENTIFIED BY '123456';
GRANT ALL ON maxwell.* TO maxwell@'%';

为 maxwell 账号分配监听其他数据库权限:

GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.

你可能感兴趣的:(中间件-kafka,MySQL,springboot,mysql,binlog,数据同步,kafka)