Maxwell的使用初探
1.简介
说到大数据的实时数据源同步中间件就不得不说Maxwell,同时还有Canal,Canal是阿里的中间件组件,Maxwell是国外开源的组件.
Canal地址:https://github.com/alibaba/canal
Maxwell地址:https://github.com/zendesk/maxwell
Maxwell官网地址:http://maxwells-daemon.io/
对比:
Canal(服务端) | Maxwell(服务端+客户端) | |
---|---|---|
语言 | Java | Java |
活跃度 | 活跃 | 活跃 |
HA | 支持 | 定制,但是支持断点还原 |
数据落地 | 定制 | 落地到kafka |
分区 | 支持 | 支持 |
bootstrap(引导) | 不支持 | 支持 |
数据格式 | 格式自由 | json(格式固定) |
文档 | 较详细 | 较详细 |
随机读 | 支持 | 支持 |
Maxwell相较于Canal的优势:
1.服务端和客户端一体,无需分开部署,轻量级的
2.支持断点还原功能+bootstrap引导+json格式的数据
2.部署和使用
1.Maxwell使用需要有mysql,mysql安装过程不多赘述,我之前的博客有
#下载Maxwell压缩包
wget https://github.com/zendesk/maxwell/releases/download/v1.22.1/maxwell-1.22.1.tar.gz
#解压文件
tar -xzvf maxwell-1.22.1.tar.gz -C /opt/scripts
2.修改mysql配置文件my.cnf,修改完之后重启mysql
vim /etc/my.cnf
server_id = 1
log-bin = master
#修改mysql的binlog日志模式为ROW模式
binlog_format = ROW
3.在mysql中创建Maxwell的database和用户
create database maxwell;
grant all on maxwell.* to 'maxwell'@'%' identified by '123456';
grant select,replication client,replication slave on *.* to 'maxwell'@'%';
--然后刷新权限
flush privileges;
4.测试STDOUT producer
producer类似于kafka的producer
#stdout一般用作测试
bin/maxwell --user='maxwell' --password='123456' --host='127.0.0.1' --producer=stdout
然后我们往mysql里面的某张表插入跟修改一条数据
insert into user(id,name,age) values(11,'Tom',22);
update user set age = 25 where id = 11;
在我们producer的监控界面可以看见我们插入跟修改的数据的日志
{"database":"test","table":"user","type":"insert","ts":1559116478,"xid":7695,"commit":true,"data":{"id":11,"name":"Tom","age":22}}
{"database":"test","table":"user","type":"update","ts":1559116761,"xid":15794,"commit":true,"data":{"id":11,"name":"Tom","age":25},"old":{"age":22}}
5.测试kafka的producer
#先创建一个我们maxwell传输的topic
/opt/kafka/bin/kafka-console-consumer.sh --bootstrap node1:9092,node2:9092,node3:9092 --topic maxwells
#启动kafka的consumer来消费maxwell中的消息
/opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server node1:9092,node2:9092,node3:9092 --topic maxwells
#启动maxwell的producer
bin/maxwell --user='maxwell' --password='123456' --host='127.0.0.1' --producer=kafka --kafka.bootstrap.servers=node1:9092,node2:9092,node3:9092 --kafka_topic=maxwells
3.使用注意点
1.kafka版本
Maxwell启动默认使用的kafka版本是0.11
官网有maxwell具体参数信息地址:http://maxwells-daemon.io/config/
kafka_version | KAFKA_VERSION | run maxwell with specified kafka producer version. Not available in config.properties. | 0.11.0.1 |
---|---|---|---|
注意一点的是,他说在config.properties配置无效,所以要命令行运行的时候指定 |
同时如果在maxwell/lib/kafka_client目录下没有我们本地的kafka版本的client包,我们需要手动将本地kafka版本的jar包添加到lib目录下
2.指定库表大小写问题
特定场合的大小写问题,例如我们需要filter的表的表名是大写的,但是我们数据库的表的表名是小写的,并不会成功识别到,所以filter的时候表名尽量都小写
3.misc,pos位置问题
场景:mysql的pos位置到了10000,但是maxwell想从pos位置990开始取数据
init_position | FILE:POSITION[:HEARTBEAT] | ignore the information in maxwell.positions and start at the given binlog position. Not available in config.properties. |
---|---|---|
同样也是在config.properties指定无效 |
4.bootstrap引导操作
bootstrap引导类似于select *from table的批量抽取,也就是数据初始化
针对数据初始化的问题,Maxwell 提供了一个命令工具 maxwell-bootstrap
帮助我们完成数据初始化,maxwell-bootstrap
是基于 SELECT * FROM table
的方式进行全量数据初始化,不会产生多余的binlog!
参数 | 说明 |
---|---|
–log_level LOG_LEVEL | 日志级别(DEBUG, INFO, WARN or ERROR) |
–user USER | mysql 用户名 |
–password PASSWORD | mysql 密码 |
–host HOST | mysql 地址 |
–port PORT | mysql 端口 |
–database DATABASE | 要bootstrap的表所在的数据库 |
–table TABLE | 要引导的表 |
–where WHERE_CLAUSE | 设置过滤条件 |
–client_id CLIENT_ID | 指定执行引导操作的Maxwell实例 |
如果进行过maxwell抽取,需要清空binlog,删除 maxwell 库中的表,然后启动Kafka、Maxwell和Kafka消费者,再启动bootstrap命令
bin/maxwell-bootstrap --user maxwell --password 123456 --host 127.0.0.1 --database test --table test --client_id maxwell
注意:--bootstrapper=sync
时,在处理bootstrap时,会阻塞正常的binlog解析;--bootstrapper=async
时,不会阻塞。
也可以执行下面的SQL,在 maxwell.bootstrap
表中插入记录,手动触发
insert into maxwell.bootstrap (database_name, table_name) values ('test', 'test');