跟我一起了解Maxwell

232 阅读5分钟

我正在参加「掘金·启航计划」

1.1 Maxwell 定义

Maxwell 是由美国 Zendesk 开源,用 Java 编写的 MySQL 实时抓取软件。 实时读取 MySQL 二进制日志 Binlog,并生成 JSON 格式的消息,作为生产者发送给 Kafka,Kinesis、 RabbitMQ、Redis、Google Cloud Pub/Sub、文件或其它平台的应用程序。

1.2.1 MySQL 主从复制过程

➢ Master 主库将改变记录,写到二进制日志(binary log)中 ➢ Slave 从库向 mysql master 发送 dump 协议,将 master 主库的 binary log events 拷贝

到它的中继日志(relay log); ➢ Slave从库读取并重做中继日志中的事件,将改变的数据同步到自己的数据库。

image-20220307100619528

1.2.2 Maxwell 的工作原理

Maxwell 的工作原理很简单,就是把自己伪装成MySQL的一个 slave,然后以 slave 的身份假装从 MySQL(master)复制数据。

1.2.3 MySQLbinlog

(1) 什么是 binlog

MySQL 的二进制日志可以说 MySQL 最重要的日志了,它记录了所有的 DDL 和 DML(除 了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL 的二进 制日志是事务安全型的。

一般来说开启二进制日志大概会有 1%的性能损耗。二进制有两个最重要的使用场景: ➢ 其一:MySQLReplication在Master端开启binlog,Master把它的二进制日志传递

给 slaves 来达到 master-slave 数据一致的目的。 ➢ 其二:自然就是数据恢复了,通过使用mysqlbinlog工具来使恢复数据。 二进制日志包括两类文件:二进制日志索引文件(文件名后缀为.index)用于记录所有

的二进制文件,二进制日志文件(文件名后缀为.00000*)记录数据库所有的 DDL 和 DML(除 了数据查询语句)语句事件。

(2) binlog 的开启

  • 找到 MySQL 配置文件的位置

  • Linux: /etc/my.cnf

    如果/etc 目录下没有,可以通过 locate my.cnf 查找位置

  • Windows: \my.ini

  • 在 mysql 的配置文件下,修改配置 在[mysqld] 区块,设置/添加 log-bin=mysql-bin 这个表示 binlog 日志的前缀是 mysql-bin,以后生成的日志文件就是 mysql-bin.000001

    的文件后面的数字按顺序生成,每次 mysql 重启或者到达单个文件大小的阈值时,新生一个 文件,按顺序编号。

(3) binlog **的分类设置 **mysql binlog 的格式有三种,分别是 STATEMENT,MIXED,ROW。 在配置文件中可以选择配置 binlog_format= statement|mixed|row

三种格式的区别:

statement

语句级,binlog 会记录每次一执行写操作的语句。 相对 row 模式节省空间,但是可能产生不一致性,比如 update test set create_date=now(); 如果用 binlog 日志进行恢复,由于执行时间不同可能产生的数据就不同。 优点: 节省空间 缺点: 有可能造成数据不一致。

◼ **row **行级, binlog 会记录每次操作后每行记录的变化。 优点:保持数据的绝对一致性。因为不管 sql 是什么,引用了什么函数,他只记录执行后的效果。缺点:占用较大空间。

◼ **mixed **混合级别,statement 的升级版,一定程度上解决了 statement 模式因为一些情况 而造成的数据不一致问题。

默认还是 statement,在某些情况下,譬如: 当函数中包含 UUID() 时; 包含 AUTO_INCREMENT 字段的表被更新时; 执行 INSERT DELAYED 语句时; 用 UDF 时;

会按照 ROW 的方式进行处理 优点:节省空间,同时兼顾了一定的一致性。 缺点:还有些极个别情况依旧会造成不一致,另外 statement 和 mixed 对于需要对

binlog 监控的情况都不方便。

综合上面对比,Maxwell 想做监控分析,选择 row 格式比较合适

1.3 MaxwellCanal 的对比

image-20220307101032520

2.1 Maxwell 安装部署

2.1.1 安装地址 (1)Maxwell 官网地址:maxwells-daemon.io/

(2)文档查看地址:maxwells-daemon.io/quickstart/

2.1.2 安装部署

(1)软件基础,读者需要提前安装好 kafka 和 MySQL,此文档不再赘述。

(2)上传 maxwell-1.29.2.tar.gz 到/opt/software 下

(3)解压 maxwell-1.29.2.tar.gz 的安装包到/opt/module 下

2.1.3 MySQL 环境准备

(1)修改 mysql 的配置文件,开启 MySQL Binlog 设置

[mysqld]模块下添加一下内容 [mysqld]
server_id=1
log-bin=mysql-bin
binlog_format=row
#binlog-do-db=test_maxwell

(2)进入/var/lib/mysql 目录,查看 MySQL 生成的 binlog 文件

注:MySQL 生成的 binlog 文件初始大小一定是 154 字节,然后前缀是 log-bin 参数配 置的,后缀是默认从.000001,然后依次递增。除了 binlog 文件文件以外,MySQL 还会额外 生产一个.index 索引文件用来记录当前使用的 binlog 文件。

2.1.4 初始化 Maxwell 元数据库

(1)在 MySQL 中建立一个 maxwell 库用于存储 Maxwell 的元数据

(2)设置 mysql 用户密码安全级别

(3)分配一个账号可以操作该数据库

(4)分配这个账号可以监控其他数据库的权限

2.1.5 Maxwell 进程启动

(1)使用命令行参数启动 Maxwell 进程

bin/maxwell -- user='maxwell' --password='123456' --host='hadoop102' -- producer=stdout

--user 连接 mysql 的用户 --password 连接 mysql 的用户的密码 --host mysql 安装的主机名 --producer 生产者模式(stdout:控制台)

(2)修改配置文件,定制化启动 Maxwell 进程

bin/maxwell -- config ./config.properties

2.2 监控 Mysql 指定表全量数据输出控制台,数据初始化(与canal的区别)

Maxwell 进程默认只能监控 mysql 的 binlog 日志的新增及变化的数据,但是 Maxwell 是支持数据初始化的,可以通过修改 Maxwell 的元数据,来对 MySQL 的某张表 进行数据初始化,也就是我们常说的全量同步。具体操作步骤如下:

需求:将 test_maxwell 库下的 test2 表的四条数据,全量导入到 maxwell 控制台 进行打印。

步骤:

(1)修改 Maxwell 的元数据,触发数据初始化机制,在 mysql 的 maxwell 库中 bootstrap 表中插入一条数据,写明需要全量数据的库名和表名。

mysql> insert into maxwell.bootstrap(database_name,table_name) values('test_maxwell','test2');

(2)启动 maxwell 进程,此时初始化程序会直接打印 test2 表的所有数据

bin/maxwell -- user='maxwell' --password='123456' --host='hadoop102' -- producer=stdout

image-20220307101920535

(3) 当数据全部初始化完成以后,Maxwell 的元数据会变化

is_complete 字段从 0 变为 1 start_at 字段从 null 变为具体时间(数据同步开始时间)

complete_at 字段从 null 变为具体时间(数据同步结束时间)