canal实现mysql数据实时同步es

前言

canal是阿里开源的一款用于同步mysql数据到其他数据存储的中间件,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费

在搭建mysql服务器主从同步的时候,我们知道,备份服务器如果需要同步master的数据,其底层实现原理是salve监听master的bin_log日志文件,而canal的实现借用了这一思想,将自己的服务伪装成slave服务监听bin_log,从而将监听到的master服务器的数据同步到自己的消息管道,然后再输送给特定的其他数据存储服务器

借用官方的一张图,原理如下图所示,canal经过了多个版本的迭代,支持的同步数据中间件越来越多,比如es,hbase等,实际可以根据业务需求进行选择使用,可参阅官方wiki:https://github.com/alibaba/canal/wiki

工作原理

  • canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送 dump 协议
  • MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
  • canal 解析 binary log 对象(原始为 byte 流)

canal实现mysql数据实时同步es_第1张图片

搭建流程

1、参阅官方文档搭建步骤

本篇的目的是将mysql数据输出到es中,因此可参阅官方wiki文档https://github.com/alibaba/canal/wiki/Sync-ES

canal实现mysql数据实时同步es_第2张图片

2、下载canal包

下载地址:https://github.com/alibaba/canal/releases
canal实现mysql数据实时同步es_第3张图片

本篇使用的是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的索引中
canal实现mysql数据实时同步es_第4张图片

建表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 中有详细的解释,就不再赘述了,里面有几条之前初始化的数据
canal实现mysql数据实时同步es_第5张图片

4、上传canal包,并解压

canal实现mysql数据实时同步es_第6张图片

分别创建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实现mysql数据实时同步es_第7张图片
该目录下主要修改两个文件,第一是canal.properties,该配置文件可理解为相当于是开启了一个伪装成slave的数据库服务而存在,里面的内容可以不用做修改,保持默认的就可以
canal实现mysql数据实时同步es_第8张图片

进入example目录,修改instance.properties配置,要修改的地方如下所示
canal实现mysql数据实时同步es_第9张图片

第一段表示你监听的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目录下,启动服务
canal实现mysql数据实时同步es_第10张图片
进入logs查看启动日志,从日志信息可以看到当前的服务已经就绪,已经成功连接上master的数据库地址和相应的端口,准备进行监听
canal实现mysql数据实时同步es_第11张图片

6、修改adapter服务配置文件

进入adapter目录,要修改两处的配置文件

canal实现mysql数据实时同步es_第12张图片

修改yml文件,主要修改的配置列举如下
canal实现mysql数据实时同步es_第13张图片
以及es连接配置信息
canal实现mysql数据实时同步es_第14张图片

可以理解为当前的这个服务是一个客户端服务,deployer服务负责将master的bin_log数据解析程应用程序可以识别的data放到消息管道里,那么这个adapter服务就是具体的将消息管道的数据取出来,然后输出到es指定的索引中去,下面需要到es的目录下创建一个employee.yml文件canal实现mysql数据实时同步es_第15张图片

添加如下配置:

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目录
canal实现mysql数据实时同步es_第16张图片
启动没有报错的话,我们查看一下日志信息:
canal实现mysql数据实时同步es_第17张图片

通过日志可以看到,adapter成功启动并监听就绪,下面我们添加一条数据,看看是否能够同步到es

canal实现mysql数据实时同步es_第18张图片
adapeter中的输出日志立即检测到前后的数据变化
在这里插入图片描述

再去看一下es中,是否新增了一条数据,没问题,这条数据也近乎实时的同步到es的employee索引中了
canal实现mysql数据实时同步es_第19张图片

我们再尝试修改一下数据,看看效果如何
canal实现mysql数据实时同步es_第20张图片
日志的输出变化
canal实现mysql数据实时同步es_第21张图片
同时es中数据也几乎同时做了更新同步
canal实现mysql数据实时同步es_第22张图片

通过上述的讲解和演示,我们使用canal简单演示了将mysql的数据实时同步到es的流程,其实cannal本身帮助我们做了很多事情,我们需要做其实就是环境的准备,以及相关配置的修改,并在搭建过程中细心点基本上就没问题,最后感谢观看!

你可能感兴趣的:(消息中间件)