做后端开发的同学,大概率都遇到过这样的场景:
业务需要将 MySQL 数据实时同步到 Kafka 做消息分发,或是同步到 Redis 做缓存更新,可传统方案要么依赖复杂的中间件,要么需要手写 binlog 解析代码,耗时又容易出 bug。
今天给大家安利一款轻量级 CDC 工具 ——dbxgo,基于 Go 语言开发,专门解决数据库变更实时同步问题,多数据源适配、断点续传、多下游输出这些核心能力全具备,关键是开箱即用,部署成本极低。
先说说:为什么需要一款 “轻量级 CDC 工具”?
在聊 dbxgo 之前,先搞清楚一个问题:我们为什么需要 CDC(变更数据捕获)工具?
日常开发中,“数据库变更同步” 是高频需求,比如:
订单表数据变更后,实时同步到消息队列,触发后续的物流通知、财务对账;
用户信息更新后,同步到 Redis 缓存,避免缓存与数据库不一致;
业务数据实时同步到数据仓库,支撑实时报表分析。
但传统方案总有各种痛点:
用 “定时查询数据库” 的方式,实时性差(分钟级延迟),还会给数据库带来额外压力;
用 MySQL 自带的主从复制,只能同步到另一台 MySQL,无法对接 Kafka、Redis 等下游系统;
用商业 CDC 工具(如 Debezium),配置复杂,依赖 ZooKeeper 等组件,中小项目用着 “杀鸡用牛刀”。
而 dbxgo 刚好补上了这个缺口:轻量级架构,不依赖多余组件,同时支持多下游输出,还能保证实时性和可靠性。
dbxgo 核心能力:3 个亮点解决同步痛点
作为一款专注于 “实用” 的 CDC 工具,dbxgo 的核心能力完全围绕开发者的实际需求设计,总结下来有 3 个亮点:
- 实时性拉满:直接解析 binlog,变更秒级捕获 + 标准 JSON 输出
dbxgo 不搞 “定时轮询” 那套,而是直接解析 MySQL 的 binlog 日志 —— 数据库一旦发生增删改操作,binlog 会实时记录,dbxgo 能瞬间捕获这些变更,并输出结构统一的 JSON 事件,下游系统无需适配不同格式,拿到就能用。
下面是三种核心操作的真实 JSON 输出示例,与 dbxgo 实际运行结果完全一致:
(1)插入操作(insert)示例
插入操作会在 data 字段中完整保留新增数据,便于下游系统直接存储或处理:
1 | { |
(2)更新操作(update)示例
更新操作会同时包含data(新数据)和old(旧数据),这是 dbxgo 区别于简化同步工具的关键特性 —— 下游系统可通过对比两者差异,精准执行更新逻辑(比如只更新变化的 “phone” 字段),无需全量覆盖:
1 | { |
(3)删除操作(delete)示例
与常见认知不同,dbxgo 的删除操作会在 data 字段中保存被删除数据的完整信息,而非设为 null—— 这一设计能确保下游系统完整记录删除记录,便于后续数据回溯、备份或误删恢复:
1 | { |
从结构能看出,dbxgo 的事件包含三层关键信息,每一层都为实际业务场景设计:
顶层EventData:time记录事件捕获时间,server_id对应 MySQL 实例 ID(多实例同步时便于区分),pos是 binlog 偏移量(用于断点续传);
内层EventRowData:database和table明确变更归属,type标注操作类型,避免下游判断逻辑;
数据层data/old:按操作类型精准保留数据,适配插入存储、更新对比、删除备份等不同需求。
多端适配:1 个数据源,6 种下游输出任选
dbxgo 目前已支持 MySQL 作为数据源(后续可能扩展更多数据库),而下游输出端的覆盖范围很广,主流的消息队列和存储系统基本都能对接,不用再手写适配代码:
简单场景:输出到 stdout(控制台),方便开发调试时查看实时变更;
缓存场景:同步到 Redis,支持自定义存储 Key(比如按 “dbxgo: 数据库名:表名” 格式命名,便于管理);
消息队列场景:对接 Kafka、RabbitMQ、RocketMQ、Pulsar,无缝融入消息驱动架构,支撑高并发业务。
比如你想把 MySQL 的 “dbxgo.users” 表同步到 Kafka,只需在配置文件中指定 Kafka broker 地址和主题,启动后 dbxgo 会自动将上述标准 JSON 事件发送到指定主题,全程无需编写代码。
- 高可用不丢数据:断点续传 + 优雅关闭
做数据同步,最怕的就是 “程序重启后,之前的同步进度丢了”,dbxgo 通过 “偏移量存储” 解决了这个问题:
它会把 binlog 的同步位置(对应 JSON 中的pos字段)保存在指定的存储介质里,支持两种方式,适配不同部署场景:
文件存储:把偏移量保存在本地文件,适合单机部署(如小型项目的缓存同步),无需额外依赖;
Redis 存储:把偏移量保存在 Redis,适合分布式部署或多实例场景(如多 MySQL 实例同步到同一 Kafka 集群),确保多实例进度一致。
哪怕程序意外重启(如服务器断电、进程崩溃),dbxgo 也能从上次保存的pos位置继续同步,既不会重复处理已同步的事件,也不会遗漏重启期间的新变更。另外,它还支持 “优雅关闭”—— 收到停止信号(如执行kill命令)后,会先处理完当前正在解析的 binlog 事件,再清理连接、保存最新偏移量,避免数据在中途中断。
上手教程:3 步启动 MySQL 实时同步
dbxgo 的使用门槛很低,不管是本地运行还是 Docker 部署,都能快速搞定,这里以 “MySQL(dbxgo 数据库 users 表)→Redis” 为例,整理一套实战步骤,其他下游目标(如 Kafka、RabbitMQ)配置逻辑类似。
前置条件(必看)
在启动前,需要先完成两项准备工作,确保 binlog 能正常解析:
- MySQL 已开启 binlog,且配置满足要求(编辑 MySQL 配置文件 my.cnf 或 my.ini,添加以下 3 行,重启 MySQL 生效):
1 | log-bin=ON # 开启 binlog |
- 准备一个有 “binlog 读取权限” 的 MySQL 用户,执行以下 SQL 授予权限(替换用户名和密码为实际信息):
1 | -- Create an account |
步骤 1:安装 dbxgo
有两种安装方式,可根据是否有 Go 环境选择:
方式 1:源码构建(适合有 Go 环境的场景)
如果本地装了 Go 1.23 及以上版本(dbxgo 依赖的 Go 版本要求),可直接克隆代码构建:
1 | # 克隆 GitHub 仓库代码 |
步骤 2:写配置文件
dbxgo 用 YAML 格式的配置文件,核心就 3 部分:存储(偏移量)、数据源(MySQL)、输出(下游目标)。
这里给出 “MySQL(dbxgo.users 表)→Redis” 的完整配置示例(保存为 config.yml,关键参数已加注释):
1 | # 1. 偏移量存储配置(用 Redis 存储,适配后续可能的分布式部署) |
步骤 3:启动同步
本地启动(二进制文件方式)
在 dbxgo 二进制文件所在目录,执行以下命令,指定配置文件启动:
1 | ./dbxgo -c config.yml |
启动成功后,控制台会输出日志(如 “connected to MySQL”“started listening binlog”),此时操作 MySQL 的 dbxgo.users 表(插入、更新、删除数据),事件会自动同步到 Redis。
Docker 部署(适合生产环境或快速测试)
如果想避免本地环境依赖,可直接用 Docker 启动,通过环境变量传递配置(无需写 YAML 文件),示例命令如下:
1 | docker run -it --rm \ |
验证同步结果
启动后,可通过 Redis 命令查看同步的事件(以配置中的 Redis 为例):
1 | # 进入 Redis 客户端 |
哪些场景适合用 dbxgo?
dbxgo 不是 “万能工具”,但在这些场景下,它能发挥最大价值:
- 中小项目的实时同步需求:不需要复杂的分布式架构,只想快速实现 “MySQL→下游系统” 的同步,dbxgo 比 Debezium 更轻量;
- 缓存实时更新:用户表、商品表变更后,需要立刻同步到 Redis,基于 JSON 中的data字段更新缓存,避免脏数据;
- 业务日志同步:订单日志、操作日志等数据,实时同步到 Kafka,下游消费端可通过type字段区分增删改操作,再写入 ES 做检索;
- 数据备份与回滚:删除操作会保留old字段,可基于该字段实现数据误删后的快速回滚;
- 本地调试 binlog:开发阶段想查看 MySQL 的 binlog 变更,不用直接解析 binlog 文件,dbxgo 输出到 stdout 就能看到完整的 JSON 事件结构。
如果你正在找一款 CDC 工具,可以参考这个判断标准:
- 若需要对接多种数据库(如 PostgreSQL、MongoDB),且是大型分布式架构,可考虑 Debezium;
- 若主要用 MySQL,需要轻量级、低部署成本,且依赖标准 JSON 结构(含server_id、pos、old等关键字段)做精细化处理,dbxgo 绝对是首选。
目前 dbxgo 还在持续迭代,后续可能会支持更多数据源(如 PostgreSQL)和输出目标,感兴趣的同学可以去 GitHub 查看types包的最新定义,或给作者点个 Star 关注更新~
GitHub 地址:https://github.com/chihqiang/dbxgo