Maxwell与Canal

一、Canal和Maxwell对比抉择

Canal(是阿里的一个中间件组件)

https://github.com/alibaba/canal(服务端,需要一个客户端来配合)

https://github.com/Hackeruncle/syncClient(客户端)

Maxwell(一个老外写的,开源的)

https://github.com/zendesck/maxwell

官网:http://maxwells-daemon.io

场景:MySQL数据库中的数据经过一系列操作存储到HBase或者kudu等其他存储

比如:MySQL-->中间件--->kafka----->………----->存储HBase或kudu等等,数据的迁移牵涉到全量(历史数据)和增量数据,而全量就需要Bootstrap(引导)

而今天介绍的就是中间件:

  1. 对比,以下对比来源于http://bigdatadecode.club/这个网站上的一篇文章,但有一些地方是需要更正的,标红色部分

 

Canal(服务端)

Maxwell(服务端+客户端)

语言

Java

Java

活跃度

活跃

活跃

HA

支持

定制,但是支持断点还原功能

数据落地

定制

落地到Kafka

分区

支持

支持

Bootstrap(引导)

不支持

支持

数据格式

格式自由

Json(格式固定) spark json ---> DF

文档

较详细

较详细

随机读

支持

支持

    2. 比较推荐Maxwell

原因:a. 服务端+客户端一体,轻量级

      b. 支持:断点还原功能+bootstrap+json

      c. maxwell社区比canal社区活跃

Maxwell最初的设计思想是:MySQL+Kafka

 

功能:

  • can do SELECT * from table(bootstrapping) initial loads of a table.
  • supports automatic position recover on master promotion.
  • flexible partitioning schemes for kafka - by databse,table,primary key,or column.
  • maxwell pulls all this off by acting as a full mysql replica,including a SQL parser for create/alter/drop statements (nope,there was no other way).

二、Maxwell安装部署&使用案例

(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部署:可以参照官网http://maxwells-daemon.io/quickstart/简单解读

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编辑工具http://www.bejson.com/jsoneditoronline/8

更新一下数据:

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)配置文件解读:http://maxwells-daemon.io/config/

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开始同步数据。

猜你喜欢

转载自blog.csdn.net/Allenzyg/article/details/105810760