MySQL数据库可以使用开源的canal组件来实现探测数据变更。
canal开源代码地址:github.com/alibaba/can…
canal依赖条件:
- canal的原理是基于mysql binlog技术,所以这里一定需要开启mysql的binlog写入功能,建议配置binlog模式为row。如果目标数据库配置不符,可能需要修改目标数据库的数据库配置。
[mysqld]
log-bin=mysql-bin #添加这一行就ok
binlog-format=ROW #选择row模式
server_id=1 #配置mysql replaction需要定义,不能和canal的slaveId重复。
在master-slave模式下,必须指定目标数据库的server_id,不能为默认的0。
canal在v1.0.26之后的版本中,作为slave的serverId会自动生成。
- canal的原理是模拟自己为mysql slave,所以这里一定需要做为mysql slave的相关权限.
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;
测试环境安装:
- 安装MySQL,设置相应权限
- 安装canal,修改配置连接相应数据库,或直接通过docker安装。
- 直接安装 github.com/alibaba/can…
wget github.com/alibaba/can… - docker安装 github.com/alibaba/can…
- 安装zookeeper wget mirrors.shu.edu.cn/apache/zook…
- 安装kafka,数据变更消息会投递到kafka
数据测试 在测试机器上配置了一套canal及MySQL环境,配置:
- 数据库配置:
# position info
canal.instance.master.address=127.0.0.1:3306
canal.instance.master.journal.name=
canal.instance.master.position=
canal.instance.master.timestamp=
canal.instance.master.gtid=
# username/password
canal.instance.dbUsername=root
canal.instance.dbPassword=canal
canal.instance.connectionCharset = UTF-8
canal.instance.defaultDatabaseName =test
# enable druid Decrypt database password
canal.instance.enableDruid=false
canal监听在8930端口:
canal.id = 1
canal.ip = 0.0.0.0
canal.port = 8930
测试示例:
- DML 删除数据记录
canal打印:
================> binlog[mysql-bin.000003:3991] , name[test,teacher] , eventType : DELETE
====================RowData==================
DELETE:
id : 3 update=false
th_name : 段老师 update=false
age : 35 update=false
teach_course : 语文 update=false
school_age : 10 update=false
school : 清华附中 update=false
ttt : update=false
- DDL删除字段
canal打印:
eventType: ALTER
isDdl: true
sql: "alter table teacher drop column ttt"
ddlSchemaName: "test"