Maxwell 是什么
Maxwell 是用 Java 实现的轻量 MySQL binlog 解析器,把变更以 JSON 形式输出,可直接打到标准输出,也可作为生产者投递到 Kafka、Redis 等目标。配置只有寥寥几项(连接信息 + producer + 主题),启动即用,适合快速给下游喂增量 JSON;自身进度(位点)保存在同名 schema 的数据表里,重启后从上次位置续传。它和 Canal、Debezium 一样依赖 ROW 格式 binlog。
基本信息
| 形态 | 独立进程,无需 Kafka Connect 与额外集群组件 |
|---|---|
| 输入前提 | binlog_format=ROW,且行镜像为 FULL,否则更新事件缺少旧值 |
| 输出 | JSON 变更事件:库、表、类型、data(新值)、old(旧值)、位点信息 |
| 目标端 | 标准输出、Kafka、Redis、RabbitMQ 等(由 producer 配置决定) |
| 位点存储 | 保存在 Maxwell 自身 schema 的位点表中 |
| 权限 | 需要复制相关权限与读取表结构的权限 |
| 初始全量 | 可在增量之外额外触发一次全量快照(bootstrap) |
典型使用场景
- 轻量增量接入:只需把某个库的变更快速投到 Kafka 供下游消费
- 开发联调:本地起一个进程把变更打印到标准输出,快速看清数据结构
- 补充链路:已有 Kafka 生态,但希望少组件、少运维成本地接一张表
- 初始加载加增量:先用 bootstrap 拉全量,再由增量持续追平
- 多目标分发:同一份变更按 producer 配置投递到不同目标端
config.properties 示例
config.properties 示例
# 源端连接与账号(账号需具备复制与读取表结构的权限)
host=10.0.0.5
user=maxwell
password=***
# 输出目标:kafka
producer=kafka
kafka.bootstrap.servers=10.0.0.6:9092
kafka_topic=maxwell_orders
# 只订阅指定库表,避免全库同步带来无谓压力
include_dbs=app
include_tables=orders启动与观察
启动与观察
# 后台启动
bin/maxwell --config config.properties --daemon
# 前台启动便于查看 JSON 输出结构(联调常用)
bin/maxwell --config config.properties
# 触发一次全量快照(bootstrap),随后由增量追平
bin/maxwell-bootstrap --config config.properties \
--database app --table ordersJSON 字段读法
| 字段 | 含义 | 注意事项 |
|---|---|---|
| type | 变更类型:insert / update / delete | delete 事件只有 old,没有 data |
| database / table | 变更来源的库与表 | 路由与过滤都依赖这两个字段 |
| data | 变更后的行内容 | update 时只包含非主键列的变更后值,未必是全行 |
| old | 变更前的行内容 | 需要 FULL 行镜像才能拿到完整旧值 |
| ts / position | 事件时间与 binlog 位点 | 位点可用于去重与续传核对 |
上游若把 binlog_row_image 改成 MINIMAL,更新事件的旧值会缺失,下游按旧值做的比较与去重逻辑会静默失效,变更前后都要确认这一项。
位点表被清理或误删后重启会从头回放,产生大量重复事件;下游若没有幂等写入,重复会直接变成数据错误。位点表所在的库要纳入备份范围。