一、什么是maxwell
Maxwell 是由美国Zendesk开源,用Java编写的MySQL实时抓取软件。 实时读取MySQL二进制日志Binlog,并生成 JSON 格式的消息,作为生产者发送给 Kafka,Kinesis、RabbitMQ、Redis、Google Cloud Pub/Sub、文件或其它平台的应用程序。
官网地址: Maxwell’s Daemon
二、maxwell工作原理
2.1 MySQL主从复制过程
- Master主库将改变记录,写到二进制日志(binary log)中
- Slave从库向mysql master发送dump协议,将master主库的binary log events拷贝到它的中继日志(relay log);
- Slave从库读取并重做中继日志中的事件,将改变的数据同步到自己的数据库。

2.2 Maxwell的工作原理
Maxwell的工作原理很简单,就是把自己伪装成MySQL的一个slave,然后以slave的身份假装从MySQL(master)复制数据。
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.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格式比较合适
三、Maxwell与Canal的对比
| 对比 | Canal | Maxwell |
| 语言 | java | java |
| 数据格式 | 格式自由 | json |
| 采集数据模式 | 增量 | 全量/增量 |
| 数据落地 | 定制 | 支持kafka等多种平台 |
| HA | 支持 | 支持 |
四、Maxwell部署
4.1 安装地址
(1)Maxwell官网地址: Maxwell’s Daemon
(2)文档查看地址: http://maxwells-daemon.io/quickstart/
4.2 安装部署
(1)软件基础,读者需要提前安装好kafka和MySQL,此文档不再赘述。
(2)上传maxwell-1.41.2.tar.gz到/root下
(3)解压maxwell-1.41.2.tar.gz的安装包到/opt/module/maxwell下
mkdir /opt/module
sudo tar -zxvf maxwell-1.41.2.tar.gz -C /opt/module
4.3 MySQL环境准备
修改mysql的配置文件/etc/my.cnf,开启MySQL Binlog设置
sudo vi /etc/my.cnf
log-bin=binlog
binlog-format=row

4.4 初始化Maxwell元数据库(注意!!在主库的mysql进行创建)
在MySQL中建立一个maxwell库用于存储Maxwell的元数据
mysql -uroot -p
CREATE DATABASE maxwell;
设置mysql用户密码安全级别,在mysql中运行如下命令
set global validate_password_length=4;
set global validate_password_policy=0;
分配一个账号可以操作该数据库
```sql
GRANT ALL ON maxwell.* TO 'maxwell'@'%' IDENTIFIED BY '123456';
分配这个账号可以监控其他数据库的权限
GRANT SELECT ,REPLICATION SLAVE , REPLICATION CLIENT ON *.* TO maxwell@'%';
刷新mysql表权限
flush privileges;
4.5 监控Mysql数据输出到kafka
4.5.1 实现步骤
启动kafka,这里就不过多赘述
启动Maxwell监控binlog
bin/maxwell --user='maxwell' --password='*******' --host='192.168.56.109' --producer=kafka --kafka.bootstrap.servers=192.168.56.106:9092 --kafka_topic=maxwell
#若报错
[bigdata@localhost maxwell-1.41.2]$ bin/maxwell --user='maxwell' --password='***' --host='10.8.15.153' --producer=kafka --kafka.bootstrap.servers=10.8.15.149:9092 --kafka_topic=maxwell
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/zendesk/maxwell/Maxwell has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:473)
at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:621)
#运行以下命令
java -version #1.41.2需要依赖java11
sudo yum install java-11-openjdk-devel
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
export PATH=$JAVA_HOME/bin:$PATH
source ~/.bashrc
java -version
#再次运行上述命令
bin/maxwell --user='maxwell' --password='***' --host='192.168.56.109' --producer=kafka --kafka.bootstrap.servers=192.168.56.106:9092 --kafka_topic=maxwell

–user 连接mysql的用户
–password 连接mysql的用户的密码
–host mysql安装的主机名
–producer 生产者模式(stdout:控制台 kafka:kafka集群)
打开kafka的控制台的消费者消费maxwell主题
./bin/kafka-console-consumer.sh --bootstrap-server 192.168.56.106:9092 --topic maxwell
使用Navicat插入一条测试数据,通过kafka消费者来查看到了数据,说明数据成功传入kafka

4.6 修改配置文件(基于测试环境)
启动maxwell的配置文件config.properties
# MySQL 配置
host=10.8.15.149
user=maxwell
password=123456
#Kafka 生产者配置
producer=kafka
kafka.bootstrap.servers=10.8.16.214:9092,10.8.15.157:9092,10.8.15.206:9092
\
# ✅ 动态 topic 命名规则:maxwell_t_{generator}
kafka_topic=maxwell
\# ✅ 使用正则过滤 + 替换规则,将数据库名映射为 generator 名
\# filter=exclude:*.*,include:db_enterprise*.t_enterprise_*:maxwell_t_enterprise,include:db_business*.t_general_taxpayer_*:maxwell_t_taxpayer,include:db_business*.t_creditimportexport_data_*:maxwell_t_creditimportexport,include:db_code*.t_econ_kind_code_*:maxwell_t_econ,include:db_sub_enterprises*.t_last_industry_*:maxwell_t_last_industry,include:db_code*.t_industry_code_*:maxwell_t_industry,include:db_enterprise*.t_address_*:maxwell_t_address,include:db_enterprise*.t_history_names_*:maxwell_t_history_names,include:db_enterprise*.t_emails_*:maxwell_t_emails,include:db_enterprise_reports*.t_report_details_*:maxwell_t_report_details
javascript=/home/bigdata/filter.js
\# Kafka 优化参数
producer_kafka_batch_size=163840
producer_kafka_linger_ms=20
producer_kafka_buffer_memory=67108864
producer_kafka_compression_type=lz4
\# Maxwell 核心优化
producer_async=true
worker_threads=4
maxwell.buffer.size=10000
output_nulls=false
producer_partition_by=primary_key
\# 高可用建议配置
producer_kafka_max_in_flight_requests_per_connection=5
producer_kafka_acks=all
producer_kafka_retries=10
producer_kafka_enable_idempotence=true
相应的表名,使用正则匹配
function process_row(row) {
var dbReg = /^db_(enterprise|business|code|sub_enterprises|enterprise_reports)\d+$/;
var tblReg = /^t_(enterprise|general_taxpayer|creditimportexport_data|econ_kind_code|last_industry|industry_code|address|history_names|emails|report_details)_\d+$/;
if (dbReg.test(row.database) && tblReg.test(row.table)) {
var baseTable = row.table
.replace(/_\d+$/, '') // 去掉 _0、_1 等分表后缀
.replace(/^t_/, '') // 去掉 t_ 前缀
.replace('_data', ''); // ? 去掉 _data 后缀
row.kafka_topic = 'maxwell_t_' + baseTable;
} else {
row.suppress();
}
}
启动命名如下:
./bin/maxwell --config config.properties
8423



被折叠的 条评论
为什么被折叠?



