通过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());确认消息消费完成。
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 通过Gearman实现MySQL到Redis的数据同步
- 通过Gearman实现MySQL到Redis的数据同步
- 利用Ajax实现数据的同步传输,从mysql中提取数据,通过echarts可视化
- redis作为mysql的缓存服务器(读写分离,通过mysql触发器实现数据同步)
- 通过Gearman实现MySQL到Redis的数据同步(异步复制)
- 阿里云canal订阅mysql的binlog日志实现数据和表结构实时同步
- 通过Gearman实现MySQL到Redis的数据同步
- 通过Gearman实现MySQL到Redis的数据同步,继而实现读写分离
- centos7 下安装canal,并实现将mysql数据同步到redis
- 用canal监控binlog并实现mysql定制同步数据的功能
- JAVA通过Gearman实现MySQL到Redis的数据同步(异步复制)
- JAVA通过Gearman实现MySQL到Redis的数据同步(异步复制)
- 通过Gearman实现MySQL到Redis的数据同步
- 通过Gearman实现MySQL到Redis的数据同步
- 通过Gearman实现MySQL到Redis的数据同步(异步复制)
- JAVA通过Gearman实现MySQL到Redis的数据同步(异步复制)
- 通过Gearman实现MySQL到Redis的数据同步
- 通过Gearman实现MySQL到Redis的数据同步
- 通过Gearman实现MySQL到Redis的数据同步
- mysql 触发器实现两个表的数据同步