前一段时间做数据同步的时候,有这么几个方案:

1、修改已有业务,在操作mysql的同时操作ES,这种方法对于业务的侵入性太强
2、AOP,制定规则,进行切面处理,无法批量处理数据,比较麻烦
3、logstage,类似logstage这种的组件,我们只需要配置几项就可以很简单的将数据同步到其他地方,但是logstage的原理是每秒进行一次查询,对于实时性要求特别高的,还是不行,并且如果一直没有增量变化,也比较浪费性能
4、canal

canal 是阿里巴巴的一个开源项目,基于java实现,用于MySQL数据库增量日志数据的订阅、消费和解析,Git地址:

https://github.com/alibaba/canal/tags

canal的原理就是类似于mysql主从复制的原理:

1、在主库写入一条数据,MySQL会记录这个变化
2、MySQL会将变化记录在bin log 日志中
3、从库有两个线程,一个是IO thread,一个是SQL thread,IO线程发起请求,读取二进制日志,也就是bin log
4、MySQL响应数据
5、从库的IO线程将响应写入Relay Log,中继日志文件
6、SQL线程会读取中继日志文件
7、从库在本地库里面重放数据

canal能够进行实时同步的原理:

1、将自己伪装为MySQL从库,向MySQL master发送dump协议
2、MySQL收到dump请求,推送bin log日志给从库,即canal
3、canal解析bin log日志文件,初始数据为字节流

java 数据库同步框架 java 数据库同步 开源_MySQL


搭建canal环境:

1、开启MySQL的bin log写入功能,配置binlog-format为row模式
 	my.cnf配置如下:
       log-bin=mysql-bin #开启bin log
       binlog-format=ROW #选择ROW模式
       server_id=1 #配置MySQL replaction需要定义,不能和canal的slaveId重复(从mysql5.7开始好像不需要配置了)
2、授权canal连接MySQL的账号具有成为MySQL slave的权限,已有账户的话可以直接用grant授权
	create user canal identified by 'canal';
	grant select, replication slave, replication client on *.* to 'canal'@'%';
	flush privileges;
3、下载canal
	下载服务端:canal.deployer
4、修改配置
	注意,修改配置的时候,有两个配置文件,一个是canal的配置,一个是连接mysql的配置,canal的配置是conf文件夹下的canal.properties文件,连接mysql的配置文件是conf/example目录下的instance.properties文件
5、然后启动就可以,Windows下直接运行bin目录的startup.bat批处理文件就可以,Linux下运行startup.sh

java 数据库同步框架 java 数据库同步 开源_MySQL_02


java 数据库同步框架 java 数据库同步 开源_数据同步_03


canal server默认的端口号为11111,可以在conf/canal.properties修改

java 数据库同步框架 java 数据库同步 开源_java 数据库同步框架_04


在连接mysql的配置文件中,需要修改主要是mysql地址,连接mysql的用户名密码(如果按上面的流程创建,用户名密码都是canal)

java 数据库同步框架 java 数据库同步 开源_java 数据库同步框架_05


这样就可以订阅到mysql的增量数据,下篇讲怎么用java代码来获取mysql的增量数据