简介
Maxwell 会实时监控MySQL数据库的数据变更操作(包括insert、update、delete),并将变更数据以 JSON
格式发送给 Kafka等流数据处理平台。
Maxwell 主要原理是模拟Mysql 数据库的热备,实时监控MySQL数据库BinLog的变化,然后将变化格式化成Json数据实时传递到数据处理平台。

- 主要进行实时的增量数据同步。
- 也能够进行首次全量的数据同步。
部署使用
部署文件下载地址
Maxwell-1.30.0及以上版本不再支持JDK1.8。
MySQL 开启BinLog 日志
config 配置
# 数据库id
server-id = 1
# 启动binlog,该参数的值会作为binlog的文件名
log-bin=mysql-bin
# binlog类型,maxwell要求为row类型
binlog_format=row
# 启用binlog的数据库,需根据实际情况作出修改 默认全部开启
binlog-do-db=
binlog 选项
binlog_format的三个选项
- STATEMENT(默认)
每一条会修改数据的sql语句会记录到binlog中。
优点: 节省空间。
缺点: 不能记录所有的操作,会产生数据不一致。 - ROW(Maxwell 支持)
记录每一个row的变化情况,从而可以实现所有sql语句的日志记录。
优点: 记录详细。
缺点: 浪费空间。 - MIXED
在binlog中同时记录Statement和Row模式,通过判断每一条SQL语句是否会影响到row的变化情况,从而自动选择记录模式。这种模式相对灵活,既可以保证记录全面,也可以避免过多的空间消耗。
如果只是使用MySQL服务,建议使用MIXED参数,这样结合两种模式的优点,兼具了性能和数据备份的完整性。
binlog_format 相关的其他mysql 配置参数:
binlog_format = MIXED //binlog日志格式,mysql默认采用statement,建议使用mixed
log-bin = /data/mysql/mysql-bin.log //binlog日志文件
expire_logs_days = 7 //binlog过期清理时间
max_binlog_size = 100m //binlog每个日志文件大小
binlog_cache_size = 4m //binlog缓存大小
max_binlog_cache_size = 512m //最大binlog缓存大小
配置maxwell并启动使用
# 创建数据库
msyql> CREATE DATABASE maxwell;
# 创建Maxwell用户并赋予其必要权限
mysql> CREATE USER 'maxwell'@'%' IDENTIFIED BY 'maxwell';
mysql> GRANT ALL ON maxwell.* TO 'maxwell'@'%';
mysql> GRANT SELECT, REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'maxwell'@'%';
配置文件方式进行配置使用
$ cp config.properties.example config.properties
$ vim config.properties
#Maxwell数据发送目的地,可选配置有stdout|file|kafka|kinesis|pubsub|sqs|rabbitmq|redis
producer=kafka
# 目标Kafka集群地址
kafka.bootstrap.servers=hadoop102:9092,hadoop103:9092,hadoop104:9092
#目标Kafka topic,可静态配置,例如:maxwell,也可动态配置,例如:%{database}_%{table}
kafka_topic=topic_db
# MySQL相关配置
host=hadoop102
user=maxwell
password=maxwell
jdbc_options=useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
# 指定数据按照主键分组进入Kafka不同分区,避免数据倾斜
producer_partition_by=primary_key
# 启动maxwell
$ /opt/module/maxwell/bin/maxwell --config /opt/module/maxwell/config.properties --daemon
# 停止maxwelll
ps -ef | grep com.zendesk.maxwell.Maxwell | grep -v grep | awk '{print $2}' | xargs kill -9
启停maxwell脚本编写:
#!/bin/bash
MAXWELL_HOME=/opt/module/maxwell
status_maxwell(){
result=`ps -ef | grep com.zendesk.maxwell.Maxwell | grep -v grep | wc -l`
return $result
}
start_maxwell(){
status_maxwell
if [[ $? -lt 1 ]]; then
echo "启动Maxwell"
$MAXWELL_HOME/bin/maxwell --config $MAXWELL_HOME/config.properties --daemon
else
echo "Maxwell正在运行"
fi
}
stop_maxwell(){
status_maxwell
if [[ $? -gt 0 ]]; then
echo "停止Maxwell"
ps -ef | grep com.zendesk.maxwell.Maxwell | grep -v grep | awk '{print $2}' | xargs kill -9
else
echo "Maxwell未在运行"
fi
}
case $1 in
start )
start_maxwell
;;
stop )
stop_maxwell
;;
restart )
stop_maxwell
start_maxwell
;;
esac
增量同步命令行启动
# 增量同步
# 将 works.videos 表同步到 kafka 的 topic中: maxwell_videos
bin/maxwell --user='maxwell' --password='123456' --host='127.0.0.1' --producer=kafka --kafka.bootstrap.servers=knode1:9092,knode2:9092,knode3:9092 --kafka_topic=maxwell_videos --filter='exclude: *.*, include: works.videos' --daemon
maxwell-bootstrap 全量同步命令行启动
只同步一张表的方式
# step 1
bin/maxwell-bootstrap --host='127.0.0.1' --user='maxwell' --password='123456' --database=works --table=videos--client_id=maxwell_videos
# step 2 client_id 需要和 step 1 同
bin/maxwell --host='127.0.0.1' --user='maxwell' --password='123456' --producer=kafka --kafka.bootstrap.servers=knode1:9092,knode2:9092,knode3:9092 --kafka_topic=maxwell_videos --client_id=maxwell_videos --filter='exclude: *.*, include: works.videos'
常见问题
-
com.zendesk.maxwell.schema.ddl.MaxwellSQLSyntaxError: 0e0
解决方式:
分析可能是MysqlParserListener在修改表支持浮点型精度部分存在问题。
修改部分字段,将该程序重新打包。 -
windows打包放在linux中执行可能遇到的问题:
# /bin/bash^M: 坏的解释器: 没有那个文件或目录 的解决方法
# 解决方式 修改windows引入的\r的问题
sed 's/\r//' -i gen_cert.sh
Maxwell是一个基于MySQLBinLog的实时数据同步工具,它监控数据库变更,以JSON格式发送到Kafka。文章介绍了如何配置MySQL开启BinLog,Maxwell的部署和使用,以及binlog_format的选择和常见问题解决方案。
1578

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



