首页/数据/数据工程与 ETL 速查/Maxwell:轻量 binlog JSON 输出
CDC 与同步53 条

Maxwell:轻量 binlog JSON 输出

Maxwell 是 Java 实现的轻量 MySQL binlog 解析器,把变更输出为 JSON,支持标准输出与 Kafka/Redis 等生产者;配置精简(连接信息 + producer + 主题),适合快速给下游喂增量 JSON 的场景,位点保存在自身 schema 的数据表中用于重启续传。

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 orders

JSON 字段读法

字段含义注意事项
type变更类型:insert / update / deletedelete 事件只有 old,没有 data
database / table变更来源的库与表路由与过滤都依赖这两个字段
data变更后的行内容update 时只包含非主键列的变更后值,未必是全行
old变更前的行内容需要 FULL 行镜像才能拿到完整旧值
ts / position事件时间与 binlog 位点位点可用于去重与续传核对
上游若把 binlog_row_image 改成 MINIMAL,更新事件的旧值会缺失,下游按旧值做的比较与去重逻辑会静默失效,变更前后都要确认这一项。
位点表被清理或误删后重启会从头回放,产生大量重复事件;下游若没有幂等写入,重复会直接变成数据错误。位点表所在的库要纳入备份范围。

易错点

  • 位点表被误清,重启后从头回放,下游产生重复数据
  • 直接拿 JSON 里的 data 当完整行使用,忽略 update 事件可能只带变更列
  • 位点表所在库未纳入备份,故障恢复后只能从头开始,链路中断时间被拉长
  • 对全库开启同步未做白名单过滤,日志量与目标端存储被无关表吃掉
  • 进程单点部署且未做监控,进程退出后无人发现,增量链路静默中断

数据来源与参考

  • Maxwell 官方文档(zendesk/maxwell)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌