canal实现同步mysql至es
Posted 陈大嘴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了canal实现同步mysql至es相关的知识,希望对你有一定的参考价值。
目录
一、canal 简介
早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。
基于日志增量订阅和消费的业务包括
- 数据库镜像
- 数据库实时备份
- 索引构建和实时维护(拆分异构索引、倒排索引等)
- 业务 cache 刷新
- 带业务逻辑的增量数据处理
当前的 canal 支持源端 mysql 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x
二、canal安装
canal官方地址:https://github.com/alibaba/canal/releases
这边以1.1.5版本为例子:
首先需要先确定mysql bin-log日志是否启动。
开启bin-log日志,这边以docker为例子:
docker ps #查看启动的容器
#进入容器
docker exec -it 容器ID /bin/bash
#
进入mysql:
这边已经开启
如果没开启新进入config
cd etc/mysql/mysql.conf.d/
编写conf文件加入以下三行:
[mysqld]
log-bin=mysql-bin #开启binlog
binlog-format=ROW #选择row模式
server_id = 1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
保存退出容器。
重启:mysql
docker restart 容器ID
准备工作完毕。
1. 下载canal-deployer
首先安装 canal服务端 : canal.deployer
解压deployer文件 :
tar -zxvf canal.deployer-1.1.5.tar.gz
1.修改canal-deployer 配置文件
首先进入配置文件:官方默认指定example
为什么会自带有example 文件夹,请参考官网:AdminGuide · alibaba/canal Wiki (github.com)
cd /home/canal/canal-deployer/conf/example/
修改instance.properties 文件配置:
进入bin文件 启动服务即可
./startup.sh #启动服务
./stop.sh #终止服务
日志出现这个启动成功:
2. canal-adapter配置及使用
和之前服务端一样先下载解压,我的文件结构是这样,个人按照自己配置
下面配置客户端文件
进入conf文件后
vim application.yml #编辑配置文件
没有vim可自行下载或者使用vi 。
删除其他对我们使用无用配置后如上图所示:
配置数据库数据源 ,这边库记得指定先去数据库建立该库,否则启动时候会报错
大概配置如下:
坑如下:
1. hosts地址配置第三方地址的时候记得加上 http://
2. 记得先启动服务端再启动客户端,否则会报连接失败 11111端口
3. mode: 改成rest模式
4. 报错出现out of money内存不够的时候那是你服务器内存不够开启了
然后进入es7修改sql
mytest_user.yml
我这边 只建立了一个user表,sql:指定一下
a.id as _id 这边注意是_ 对应es那边索引id
_index: 对应es那边的 库名称
配置如上,完成后进入bin启动 ./startup.sh
下面我们去es建立索引
PUT /mytest_collect
"mappings":
"properties":
"name":
"type": "text",
"fields":
"keyword":
"type": "keyword"
,
"roleId":
"type": "long"
,
"time":
"type": "date"
建立成功。
3. canal-admin
属于面向运维的可视化界面。这里不做过多介绍,感兴趣的可以自己去了解。
4. 运行测试阶段
INSERT INTO `mytest`.`user`(`id`, `name`, `role_id`) VALUES (24, '1ddd', 88888)
测试下
发现es同步过来了。
5. 坑总结
1.
当出现这个日志的时候,但是没有出现
这个得时候,检查es 索引是否建立。或者检查服务端配置中连接es配置是否 正确,url或者账号密码。
2. 启动时出现异常
class com.alibaba.druid.pool.DruidDataSource cannot be cast to class com.alibaba.druid.pool.DruidDataSource
解决方案:
源码下载后将
官方源码地址: https://github.com/alibaba/canal/releases
修改client-adapter下escore的pom中druid包的scope为provided模式。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<scope>provided</scope> #新增 让es的xxxx-with-dependency.jar不包含druid相关包
</dependency>
这个路径下pom
我的 gitee里面有打包好的包,自行替换即可。
以上是关于canal实现同步mysql至es的主要内容,如果未能解决你的问题,请参考以下文章