您的位置:首页 > 数据库 > MySQL

通过Canal中间件实现mysql数据同步

2020-02-03 00:18 771 查看

mysql端配置

1、安装mysql。
2、设置mysql中binlog已经启用。且记录策略为ROW。
可使用

show variables like 'log_bin';
查看。
如果没有开启,需要修改my.ini文件。

log-bin=mysql-bin
binlog_format = ROW

3、设置数据库连接用户的连接权限。

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
## MySQL80 这样设置完密码后,Navicat或者其他端无法远程连接,因为密码加密方式不一样,需要做以下修改
## ALTER USER username IDENTIFIED WITH mysql_native_password BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' ;
## MySQL80 不支持这样授权,需要用下面的方法
## alter user set host='%' where user='username'

Canal端配置

1、安装Canal deployer那个包并解压。
2、进入conf文件,新建你的同步配置文件夹,如zhaozy_db_data。从example中拷贝instance.properties文件,并修改为自己的数据库配置。其中几个关键字段意义为:

  • [

    canal.instance.mysql.slaveId
    ] 因为Canal的原理是假装自己是个mysql的从节点,按着主从同步的方式进行数据同步的,所以这个就是从节点的ID。不要和主节点以及其他从节点重复即可。

  • [

    canal.instance.master.address
    ] 数据库地址和端口,如127.0.0.1:3306。

  • [

    canal.instance.master.journal.name
    ] binlog的日志名称。如何配置下面会介绍。

  • [

    canal.instance.master.position
    ] binlog当前日志记录到的位置。如何配置下面会介绍。

  • [

    canal.instance.dbUsername
    ] 数据库连接用户名

  • [

    canal.instance.dbPassword
    ] 数据库连接密码

  • [

    canal.instance.defaultDatabaseName
    ] 默认数据库实例,默认没有的,可以自己加一下

  • [

    canal.mq.topic
    ] 消息主题,为了方便查找,就和新建的文件夹名字一样就行了

    其他字段就取example里面默认的就好了。
    下面讲讲

    canal.instance.master.journal.name
    canal.instance.master.position
    如何配置。
    连接上mysql后,执行
    show master status;
    ,然后会看到以下的结果:

mysql> show master status;
+----------------------------+----------+--------------+------------------+-------------------+
| File                       | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------------+----------+--------------+------------------+-------------------+
| WIN-RIDL5S9I1CK-bin.000003 |      155 |              |                  |                   |
+----------------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
其中File的值就是 `canal.instance.master.journal.name`要配置的值,
Position的值就是`canal.instance.master.position`要配置的值。
**注意:多次执行以上SQL如果得到的Position不一样,说明有数据在写数据库,导致日志尾部位置一直在变化,可以先锁库,完成同步之后再解锁**

3、启动Canal以后会自动在文件夹中生成

h2.mv.db
meta.dat
文件。
如果都正确了还是发现canal日志报错找不到position,可以删掉meta.dat,让他重新生成

java端配置

先引入Canal客户端jar包:

<dependency>
<groupId>com.alibaba.otter</groupId>
<artifactId>canal.client</artifactId>
<version>1.1.0</version>
</dependency>

可以通过以下代码获得Canal的连接:

CanalConnector connector = CanalConnectors
.newSingleConnector(new InetSocketAddress("canal的ip", canal的端口,默认11111), "同步配置文件夹的名字,我的就是上面的zhaozy_db_data", "canal账号,默认为空", "canal密码,默认为空");
connector.connect();
connector.subscribe(".*\\.*");
connector.rollback();
## 获取同步的消息
Message message = connector.getWithoutAck(从canal中拉去记录的数量);

message.getEntries();可以拿到一个Entry的列表。
CanalEntry.RowChange rowChange = CanalEntry.RowChange.parseFrom(entry.getStoreValue());
rowChange.getRowDatasList();可以拿到发生变化的那些行。
rowChange.getEventType();可以得到事件类型,新增,删除,更新。
rowData.getBeforeColumnsList();可以拿到变化前的记录。
rowData.getAfterColumnsList();可以拿到变化后的记录。

获取到了数据变化后,可以用自己的代码实现相应的逻辑和操作。
最后

connector.ack(messgae.getId());
确认消息消费完成。

  • 点赞
  • 收藏
  • 分享
  • 文章举报
抓蛙攻城狮 发布了4 篇原创文章 · 获赞 1 · 访问量 209 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: