Maxwell 之旅
Maxwell 概述
Maxwell 是由美国 Zendesk 公司开源,用 Java 编写的 MySQL 变更数据抓取软件。会实时监控Mysql 数据库的数据变更操作(insert、update、delete),并将变更数据以 JSON 格式发送给 Kafka、Kinesi 等流数据处理平台
官网地址:http://maxwells-daemon.io/
输出数据格式
插入
insert into
gmall student
value(
1, 'cpucode'
);
输出格式 :
{
"database": "gmall",
"table": "student",
"type": "insert",
"ts": 1634004537,
"xid": 1530970,
"commit": true,
"data": {
"id": 1,
"name": "cpucode"
}
}
更新
update gmall student
set
name = 'list'
where
id = 1;
输出格式 :
{
"database": "gmall",
"table": "student",
"type": "update",
"ts": 1634004537,
"xid": 1530970,
"commit": true,
"data": {
"id": 1,
"name": "cpucode"
},
"old": {
"name": "cpu"
}
}
删除
detele from gmall student
where
id = 1;
输出格式 :
{
"database": "gmall",
"table": "student",
"type": "delete",
"ts": 1634004537,
"xid": 1530970,
"commit": true,
"data": {
"id": 1,
"name": "cpucode"
}
}
json字段说明:
字段 | 解释 |
---|---|
database | 变更数据所属的数据库 |
table | 表更数据所属的表 |
type | 数据变更类型 |
ts | 数据变更发生的时间 |
xid | 事务id |
commit | 事务提交标志,可用于重新组装事务 |
data | 对于insert类型,表示插入的数据;对于update类型,标识修改之后的数据;对于delete类型,表示删除的数据 |
old | 对于update类型,表示修改之前的数据,只包含变更字段 |
Maxwell 原理
Maxwell 的工作原理 : 实时读取 MySQL 数据库的二进制日志(Binlog),从中获取变更数据,将变更数据以 JSON 格式发送至 Kafka 等流处理平台
MySQL 二进制日志
二进制日志(Binlog)是 MySQL 非常重要的日志,保存 MySQL 数据库的所有数据变更记录
Binlog 的主要作用 :
- 主从复制
- 数据恢复
MySQL 主从复制
MySQL的主从复制,就是用来建立一个和主数据库完全一样的数据库环境 ( 从数据库 )
主从复制的应用场景:
- 做数据库的热备:主数据库服务器故障后,可切换到从数据库继续工作
- 读写分离:主数据库只负责业务数据的写入操作,而多个从数据库只负责业务数据的查询工作,在读多写少场景下,可以提高数据库工作效率
主从复制的工作原理:
- Master 主库将数据变更记录,写到二进制日志(binary log) 中
- Slave 从库向 mysql master 发送 dump 协议,将 master 主库的 binary log events 拷贝到它的中继日志(relay log)
- Slave 从库读取并回放中继日志中的事件,将改变的数据同步到自己的数据库
Maxwell 原理
将自己伪装成 slave,并遵循 MySQL 主从复制的协议,从 master 同步数据
Maxwell 部署
https://blog.csdn.net/qq_44226094/article/details/122869206
Maxwell 使用
启动Kafka集群
若 Maxwell 发送数据的目的地为 Kafka 集群,就先确保 Kafka 集群为启动状态
https://blog.csdn.net/qq_44226094/article/details/123121544
增量数据同步
启动 Kafka 消费者
kafka-console-consumer.sh --bootstrap-server cpucode101:9092 --topic maxwell
模拟生成数据
java -jar gmall2020-mock-db-2021-11-14.jar
观察Kafka消费者
历史数据全量同步
使用 Maxwell 实时增量同步 MySQL 变更数据的功能。但有时只有增量数据是不够的,我们可能需要使用到 MySQL 数据库中从历史至今的一个完整的数据集。这就需要我们在进行增量同步之前,先进行一次历史数据的全量同步。这样就能保证得到一个完整的数据集
Maxwell-bootstrap
Maxwell 提供了 bootstrap 功能来进行历史数据的全量同步
bin/maxwell-bootstrap --database gmall --table user_info --config /opt/module/maxwell-1.29.2-study/config.properties
boostrap 数据格式
bootstrap 方式同步的输出数据格式 :
{
"database": "fooDB",
"table": "barTable",
"type": "bootstrap-start",
"ts": 1450557744,
"data": {}
}
{
"database": "fooDB",
"table": "barTable",
"type": "bootstrap-insert",
"ts": 1450557744,
"data": {
"txt": "hello"
}
}
{
"database": "fooDB",
"table": "barTable",
"type": "bootstrap-insert",
"ts": 1450557744,
"data": {
"txt": "bootstrap!"
}
}
{
"database": "fooDB",
"table": "barTable",
"type": "bootstrap-complete",
"ts": 1450557744,
"data": {}
}
第一条 type 为 bootstrap-start 和最后一条 type 为 bootstrap-complete 的数据,是 bootstrap 开始和结束的标志,不包含数据,中间的 type 为 bootstrap-insert 的数据才包含数据
一次 bootstrap 输出的所有记录的 ts 都相同,为 bootstrap 开始的时间