第一章 Maxwell 概述
时间:2023-11-02 21:07:02
1.1 Maxwell 定义
Maxwell 是由美国 Zendesk 开源,用 Java 编写的 MySQL 实时抓取软件。 实时读取MySQL 二进制日志 Binlog,并生成 JSON 作为生产者发送格式消息 Kafka,Kinesis、RabbitMQ、Redis、Google Cloud Pub/Sub、文件或其他平台的应用程序。
官网地址:http://maxwells-daemon.io/
注意:如果你用JDK8,Maxwell需要用v1.30.0之前的版本(v1.29.2)
1.2 Maxwell 工作原理
1.2.1 MySQL 从复制过程开始
- Master 主库将更改记录并写入二进制日志(binary log)中
- Slave 从库向 mysql master 发送 dump 协议,将 master 主库的 binary log events 复制到它的中继日志(relay log);
- Slave 读取并重做中继日志中的事件,将改变的数据同步到自己的数据库。
1.2.2 Maxwell 的工作原理
Maxwell 工作原理很简单,就是伪装自己 MySQL 的一个 slave,然后以 slave假装从身份 MySQL(master)复制数据。
1.2.3 MySQL 的 binlog
(1) 什么是 binlog
MySQL 的二进制日志可以说 MySQL 最重要的日志记录了所有的日志 DDL 和 DML(数据查询语句除外)语句以事件形式记录,还包括语句执行所消耗的时间,MySQL 二进制日志是事务安全型的。
一般来说,打开二进制日志可能会 1%的性能损耗。二进制有两个最重要的使用场景:
- 其一:MySQL Replication 在 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.文件后面的数字按顺序生成,每次 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 Maxwell 与 Canal 的对比
- Maxwell 没有canal 的 server client 只有一种模式server将数据发送到消息队列或redis。若需要多个例子,则通过指定不同的配置文件启动多个过程。
- Maxwell 有一个亮点功能,就是canal 只能抓取最新数据,不能处理现有的历史数据。Maxwell有一个 bootstrap 该功能可以直接为初始化引导完整的历史数据,非常有用。
- Maxwell 不能直接支持HA,但支持断点还原,即错误解决后重启,继续上次读取数据。
- Maxwell 只支持json格式,而Canal如果用Server client 对于模式,格式可以自定义。
- Maxwell 比 Canal更轻量级。