canal是阿里开源的一款用于同步mysql数据到其他数据存储的中间件,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费
在搭建mysql服务器主从同步的时候,我们知道,备份服务器如果需要同步master的数据,其底层实现原理是salve监听master的bin_log日志文件,而canal的实现借用了这一思想,将自己的服务伪装成slave服务监听bin_log,从而将监听到的master服务器的数据同步到自己的消息管道,然后再输送给特定的其他数据存储服务器
借用官方的一张图,原理如下图所示,canal经过了多个版本的迭代,支持的同步数据中间件越来越多,比如es,hbase等,实际可以根据业务需求进行选择使用,可参阅官方wiki:https://github.com/alibaba/canal/wiki
工作原理
1、参阅官方文档搭建步骤
本篇的目的是将mysql数据输出到es中,因此可参阅官方wiki文档https://github.com/alibaba/canal/wiki/Sync-ES
2、下载canal包
下载地址:https://github.com/alibaba/canal/releases
本篇使用的是1.1.3版本,也可以使用最新的1.1.4版本的,主要下载的是截图中的两个文件,即adapter和deployer服务包,可以理解为就是两个后台服务的jar包
友情提示:目前官方的cannal支持的es版本是7.0以下的版本,如果你安装的es版本比较高,又想使用cannal,有2种解决办法,第一是重新安装es,这个代价比较大,第二种是下载cannal的官方master代码,然后修改cannal中的pom依赖,升级依赖的es版本,再重新编译打成一个新的cannal包也可以使用
本文使用的ES版本为6.2,可以直接拿来使用
3、启动mysql服务,需保证启动的mysql开启了bin_log
为了方便后面的测试和演示,我提前再在服务器上创建了一个数据库,同时开启了bin_log的日志功能,这一步不能忘记,然后再在dianping这个库下创建了一张employee的表,后面将使用这张表将数据同步到es的employee的索引中
建表sql:
CREATE TABLE `employee_info` (
`id` int(20) DEFAULT NULL,
`user_name` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
`age` int(20) DEFAULT NULL,
`job_name` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
`salary` int(20) DEFAULT NULL,
`city` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
`company_name` varchar(50) CHARACTER SET utf8 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
es中提前创建一个名为employee的索引,字段和mysql中的employee表的字段对应,在之前的一篇博客:https://blog.csdn.net/zhangcongyi420/article/details/104887017 中有详细的解释,就不再赘述了,里面有几条之前初始化的数据
4、上传canal包,并解压
分别创建adapter和deployer目录,并将adapter和deployer的包解压到对应的目录
tar -zxvf canal.adapter-1.1.3.tar.gz ./adapter
tar -zxvf canal.deployer-1.1.3.tar.gz ./deployer
5、修改deployer服务配置文件
deployer配置
该目录下主要修改两个文件,第一是canal.properties,该配置文件可理解为相当于是开启了一个伪装成slave的数据库服务而存在,里面的内容可以不用做修改,保持默认的就可以
进入example目录,修改instance.properties配置,要修改的地方如下所示
第一段表示你监听的mysql服务器的IP和端口,第二段模拟salve的mysql服务器同步数据的时候的授权用户名和密码,这里建议提前在mysql终端创建一个新的用户,可依次执行下面的命令即可
create user 'canal'@'%' IDENTIFIED by 'Canal';
grant select,replication slave,replication client on *.* to 'canal'@'%' identified by 'Canal';
grant select,replication slave,replication client on *.* to 'canal'@'localhost' identified by 'Canal';
flush privileges;
当这个配置文件修改完成后即可进入bin目录下,启动服务
进入logs查看启动日志,从日志信息可以看到当前的服务已经就绪,已经成功连接上master的数据库地址和相应的端口,准备进行监听
6、修改adapter服务配置文件
进入adapter目录,要修改两处的配置文件
修改yml文件,主要修改的配置列举如下
以及es连接配置信息
可以理解为当前的这个服务是一个客户端服务,deployer服务负责将master的bin_log数据解析程应用程序可以识别的data放到消息管道里,那么这个adapter服务就是具体的将消息管道的数据取出来,然后输出到es指定的索引中去,下面需要到es的目录下创建一个employee.yml文件
添加如下配置:
dataSourceKey: defaultDS
destination: example
groupId: g1
esMapping:
_index: employee #索引名称
_type: _doc #index下默认的type类型
_id: id #数据库表的id和索引中的_id保持一致
upsert: true #当有数据修改或者插入的时候自动更新es数据
sql: "select a.id,a.user_name,a.age,a.job_name,a.salary,a.city,a.company_name from employee_info a"
commitBatch: 3000 #i批量更新的数据量
其中的sql代表的是,查询到更新后的数据,并全量同步到es
启动deployer服务,进入bin目录
启动没有报错的话,我们查看一下日志信息:
通过日志可以看到,adapter成功启动并监听就绪,下面我们添加一条数据,看看是否能够同步到es
再去看一下es中,是否新增了一条数据,没问题,这条数据也近乎实时的同步到es的employee索引中了
我们再尝试修改一下数据,看看效果如何
日志的输出变化
同时es中数据也几乎同时做了更新同步
通过上述的讲解和演示,我们使用canal简单演示了将mysql的数据实时同步到es的流程,其实cannal本身帮助我们做了很多事情,我们需要做其实就是环境的准备,以及相关配置的修改,并在搭建过程中细心点基本上就没问题,最后感谢观看!