Canal(是阿里的一个中间件组件)
GitHub - alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件(服务端,需要一个客户端来配合)
https://github.com/Hackeruncle/syncClient(客户端)
Maxwell(一个老外写的,开源的)
https://github.com/zendesck/maxwell
官网:Maxwell's Daemon
场景:MySQL数据库中的数据经过一系列操作存储到HBase或者kudu等其他存储
比如:MySQL-->中间件--->kafka----->………----->存储HBase或kudu等等,数据的迁移牵涉到全量(历史数据)和增量数据,而全量就需要Bootstrap(引导)
而今天介绍的就是中间件:
Canal(服务端) |
Maxwell(服务端+客户端) |
|
语言 |
Java |
Java |
活跃度 |
活跃 |
活跃 |
HA |
支持 |
定制,但是支持断点还原功能 |
数据落地 |
定制 |
落地到Kafka |
分区 |
支持 |
支持 |
Bootstrap(引导) |
不支持 |
支持 |
数据格式 |
格式自由 |
Json(格式固定) spark json ---> DF |
文档 |
较详细 |
较详细 |
随机读 |
支持 |
支持 |
2. 比较推荐Maxwell
原因:a. 服务端+客户端一体,轻量级
b. 支持:断点还原功能+bootstrap+json
c. maxwell社区比canal社区活跃
Maxwell最初的设计思想是:MySQL+Kafka
功能:
(1)、MySQL的部署,这里就不在赘述了,我之前的文档里有。
先查看一下binlog_format是不是ROW模式,server_id是不是1,log_bin是不是ON;
如果不修改,后面启动Maxwell时会报错:
如果不是,修改之:
vim /etc/my.cnf
[mysql_d]
server_id=1
log-bin=master
binlog_format=row
修改之后重启MySQL:
service mysqld restart
(2)、Maxwell部署:可以参照官网Quick Start - Maxwell's Daemon简单解读
Maxwell下载:
https://github.com/zendesk/maxwell/releases/download/v1.25.1/maxwell-1.25.1.tar.gz
解压:
tar -zxvf maxwell-1.25.1.tar.gz -C /opt/module/maxwell/
创建Maxwell的db和用户
mysql> CREATE database 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'@'%';
mysql> flush privileges;
创建一张表,插入测试数据:
启动Maxwell:
[root@node4 maxwell-1.25.1]# bin/maxwell --user='maxwell' --password='maxwell' --host='127.0.0.1' --producer=stdout
插入一条数据:
mysql> use zyg_test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> insert into user_info (name,age,address) values ('zyg',20,'www.google.com');
Query OK, 1 row affected (0.00 sec)
Maxwell端显示:
{
"database": "zyg_test",
"table": "user_info",
"type": "insert",
"ts": 1587893666,
"xid": 699,
"commit": true,
"data": {
"name": "zyg",
"age": 20,
"address": "www.google.com"
}
}
分析一下:使用在线json编辑工具JSON在线编辑器-BeJSON.com
更新一下数据:
mysql> update user_info set age = 19 where name= 'allen';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
{
"database": "zyg_test",
"table": "user_info",
"type": "update",
"ts": 1587894286,
"xid": 1507,
"commit": true,
"data": {
"name": "allen",
"age": 19,
"address": "www.baibu.com"
},
"old": {
"age": 18
}
}
(3)配置文件解读:Reference - Maxwell's Daemon
1.kafka版本问题
Kafka版本在配置文件中修改是无效的,maxwell-1.25.1版本的Maxwell默认使用
Using kafka version: 1.0.0
需要在执行时添加本地安装的Kafka版本:
bin/maxwell --user='maxwell' --password='XXXXXX' --host='127.0.0.1' \
--producer=kafka --kafka.bootstrap.servers=localhost:9092 --kafka_topic=Maxwell kafka_version = xxx
2. 大小写问题:
Mysql不区分大小写,但是Maxwell过滤时,特定场合区分大小写
include_dbs = test
include_tables = USER_INFO
就会过滤不了我的MySQL表:test.user_info
3. Maxwell数据同步开始位置
假如MySQL的binlog的日志pos位置跑到了100000,但Maxwell想要指定从pos为999开始同步数据,如果不指定这个init_position参数,那么默认从100000开始同步数据。