MaxWell 数据同步

使用 MaxWell 的原因#

由于最近的一个项目需要同步子系统中的数据到主系统上,并且需要在子系统传输上来的数据增加一些额外的信息,所以考虑到了可以使用一些组件来同步数据库中的数据。首先找的是阿里的 Canal,但是在实际使用上有一些问题,例如经常性没收到数据变更。寻找了很久也没找到具体的原因(至今不知道为啥,可能我配置有问题),所以转向 MaxWell。

MaxWell 介绍#

MaxWell 是一个能实时读取 MySQL 二进制日志 binlog,并生成 JSON 格式的消息,作为生产者发送给 KafkaKinesisRabbitMQRedisGoogle Cloud Pub/Sub、文件或其它平台的应用程序。它的常见应用场景有 ETL、维护缓存、收集表级别的 dml 指标、增量到搜索引擎、数据分区迁移、切库 binlog 回滚方案等。

环境#

Maxwell 是使用 java 开发的,所以要先安装 java。

配置 mysql#

修改 mysql 的配置文件 my.conf,windows 下是 my.ini,打开 bin-log 和修改 bin-log 的格式

log-bin=master
binlog_format=row

下载 MaxWell#

MaxWell 下载链接

配置 MaxWell#

解压后复制一份 maxwell 的 config

cd maxwell

cp config.properites.example config.properites

修改配置文件
vim config.properites

配置文件内容

# tl;dr config
log_level=info

#生产者,我这里使用是的RabbitMQ
producer=rabbitmq

# 数据库信息配置
host=localhost
user=maxwell
password=maxwell

#用debug方便调试
log_level=DEBUG

#RabbitMQ的配置
rabbitmq_host=127.0.0.1
rabbitmq_port=5672
rabbitmq_user=admin
rabbitmq_pass=admin
rabbitmq_virtual_host=/
rabbitmq_exchange=maxwell
rabbitmq_exchange_type=direct
rabbitmq_exchange_durable=true
rabbitmq_exchange_autodelete=false
rabbitmq_routing_key_template=%db%.%table%
rabbitmq_message_persistent=false
rabbitmq_declare_exchange=true

运行#

配置好这些之后打开 maxwell,当然在此之前要先启动 mysql 和 RabiitMQ

Linux#

cd ./bin

#config为使用的配置文件,daemon是使用守护进程
./maxwell --config=../config.properites --daemon

#使用的daemon后可在logs目录下看到数据的信息。
tail -f ../logs/MaxwellDaemon.out

Windows#

java -Dfile.encoding=UTF-8 -Dlog4j.shutdownCallbackRegistry=com.djdch.log4j.StaticShutdownCallbackRegistry -cp ../lib/* com.zendesk.maxwell.Maxwell --config=../config.properties

数据同步#

MaxWell 把数据扔到 MQ 上后,MQ 会通过 routing_key 分配到相对应的队列上,然后用 php 去连接 MQ 去消费这些数据,然后完成数据库间的数据同步。

结束#

实际运行效果还不错,也没有发生什么问题,总体来说还是挺不错的。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。