使用Canal将MySQL数据同步到ES(Linux)

一、Canal官网文档

去到官方文档根据官网文档进行操作:

QuickStart · alibaba/canal Wiki · GitHub阿里巴巴 MySQL binlog 增量订阅&消费组件 . Contribute to alibaba/canal development by creating an account on GitHub.[这里是图片002]https://github.com/alibaba/canal/wiki/QuickStart

二、开启服务器中MySQL的binlog

复制代码
[mysqld]
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复

进行修改:

登录root

复制代码
mysql -uroot -p

CREATE USER canal IDENTIFIED BY 'canal';  
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;

改完后可以在MySQL命令行中使用下面的指令查看是否开启成功,value为ON就是开启成功:

复制代码
show variables like 'log_bin';

注意注意:记得修改后一定要重启MySQL,我就是因为忘记重启了找了一天的bug ,不记得重启会出现后面第八点那个问题。

三、将canal-deployer下载到服务器

Releases · alibaba/canal · GitHub阿里巴巴 MySQL binlog 增量订阅&消费组件 . Contribute to alibaba/canal development by creating an account on GitHub.[这里是图片008]https://github.com/alibaba/canal/releases

复制代码
cd /tmp/canal
tar zxvf canal.deployer-1.1.8-SNAPSHOT.tar.gz

解压后:

建议这边弄一个单独的文件夹把压缩包放进去再去解压,不然后面还有其他的会比较影响

弄一个类似这种文件夹,在对应的文件夹里面放压缩包,再去解压,后面我都是这种步骤,由于没有保留截图,上面那些还是最开始的演示,建议后面修改一下。

四、修改对应配置文件

五、启动canal 服务端

启动指令:

复制代码
sh bin/startup.sh

关闭指令:

复制代码
sh bin/stop.sh

参考:linux下启动Nacos报错解决:which: no javac in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)_java_silence_fengxuan-GitCode 开源社区[这里是图片018]https://gitcode.csdn.net/66c6f8970bfad230b8ae80c9.html?dp_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6Mzg2MzQyMiwiZXhwIjoxNzMzNDk5ODYyLCJpYXQiOjE3MzI4OTUwNjIsInVzZXJuYW1lIjoicXFfNzM0NDA3NjkifQ.ePhIrfy6Hut8CjhuMD9jTFiIlnDuk4ArxnuI_l1Bkvc&spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2defaultBlogCommendFromBaiduactivity-1-105581366-blog-125775825.235%5Ev43%5Epc_blog_bottom_relevance_base7&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2defaultBlogCommendFromBaiduactivity-1-105581366-blog-125775825.235%5Ev43%5Epc_blog_bottom_relevance_base7&utm_relevant_index=2

这个是我服务器jdk下载的位置,去找到自己对应的位置即可,后面我改用jdk11了,11是没问题的,记得17可能有些问题,可以参考下面这个步骤来就行,版本可以用11。

jdk下载可以参考这篇博客:

linux下载安装jdk教程_linux jdk下载-CSDN博客文章浏览阅读3.3k次,点赞16次,收藏27次。JDK是 Java 语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源。_linux jdk下载[这里是图片019]https://blog.csdn.net/qq_44869932/article/details/141396367

编辑下面这个文件

在这个文件内添加下面信息

复制代码
export JAVA_HOME=/www/server/java/jdk-17.0.8/          
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

修改完,重新加载一下:

复制代码
source /etc/profile

然后使用下面指令查看jdk版本,没问题即可:

复制代码
java -version

再次执行启动命令

复制代码
sh bin/startup.sh

查看输出日志:

启动成功!服务端启动成功!

如果启动不成功,有下面这个报错:

Caused by: org.h2.jdbc.JdbcSQLDataException: Value too long for column "CHARACTER VARYING

可以参考这两个Issues:

Value too long for column "CHARACTER VARYING" · Issue #5086 · alibaba/canal · GitHubI have searched the issues of this repository and believe that this is not a duplicate. I have checked the FAQ of this repository and believe that this is not a duplicate. environment ubuntu20 canal version \*1.1.8-alpha mysql version mys...\[这里是图片027\]https://github.com/alibaba/canal/issues/5086\](https://github.com/alibaba/canal/issues/5086 "Value too long for column "CHARACTER VARYING" · Issue #5086 · alibaba/canal · GitHub") [服务起来的时候 meta_snapshot 表的 data字段提示超长 · Issue #5268 · alibaba/canal · GitHubcom.alibaba.otter.canal.parse.exception.CanalParseException: apply failed caused by : nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='data', mode=IN, javaType=cla...\[这里是图片028\]https://github.com/alibaba/canal/issues/5268](https://github.com/alibaba/canal/issues/5268 "服务起来的时候 meta_snapshot 表的 data字段提示超长 · Issue #5268 · alibaba/canal · GitHub") 我两个都没能解决,自己服务器可以,实习的服务器可能公司的表太多了,导致出问题,我是通过降低版本解决的,用1.1.16。如果有大佬解决了,欢迎评论区dd。 #### 六、客户端 查看官方使用例子 ![](https://i-blog.csdnimg.cn/direct/276df47850f14148b9e1d2d5cd1b6569.png) [ClientExample · alibaba/canal Wiki · GitHub阿里巴巴 MySQL binlog 增量订阅\&消费组件 . Contribute to alibaba/canal development by creating an account on GitHub.\[这里是图片030\]https://github.com/alibaba/canal/wiki/ClientExample](https://github.com/alibaba/canal/wiki/ClientExample "ClientExample · alibaba/canal Wiki · GitHub") 引入依赖 ![](https://i-blog.csdnimg.cn/direct/479906caa309407ba8106dc59d705d8c.png) com.alibaba.otter canal.client 1.1.0 code如下: ![](https://i-blog.csdnimg.cn/direct/b5bb6cf791174100a1a934d4209251e3.png) ![](https://i-blog.csdnimg.cn/direct/c319a76d8e914e88a568359b43a04905.png) 修改后启动: ![](https://i-blog.csdnimg.cn/direct/e304f3a679394926b6452403c0029bd7.png) 然后我插入一条数据,也是监听到了。 ![](https://i-blog.csdnimg.cn/direct/2e4694f66f5e49d7a5d6ff4252cb2173.png)测试成功。 ![](https://i-blog.csdnimg.cn/direct/1b765ff7756a4a0f832ab3b927ebdec6.png) #### 七、同步ES(Sync ES) ![](https://i-blog.csdnimg.cn/direct/d8ba08c8f50b4dc0b5c54677f6ce67bb.png) ![](https://i-blog.csdnimg.cn/direct/f05ac9e5bc484098aa6bac915a7c311a.png) 将这个下载到服务器中某个位置: ![](https://i-blog.csdnimg.cn/direct/336be6def8c6454e9b39f6b625e67782.png) 然后用下面这个命令解压 tar zxvf canal.adapter-1.1.8-SNAPSHOT.tar.gz ![](https://i-blog.csdnimg.cn/direct/e5907e97f9ed4021965ed5f9ffdfa8d8.png) 还有一处配置可以参考一下下面这位大佬的博客: [canal实现MySQL和ES同步实践_canal mysql es-CSDN博客文章浏览阅读1.6k次,点赞29次,收藏20次。通过canal同步MySQL与ES数据的实操分享_canal mysql es\[这里是图片041\]https://blog.csdn.net/weixin_44517677/article/details/136856682?spm=1001.2014.3001.5506](https://blog.csdn.net/weixin_44517677/article/details/136856682spm=1001.2014.3001.5506 "canal实现MySQL和ES同步实践_canal mysql es-CSDN博客") ![](https://i-blog.csdnimg.cn/direct/eaebe595702c43e5932dd4b58cfc5716.png) 下面给出我的部分配置: ![](https://i-blog.csdnimg.cn/direct/3b67205fc678414e8a876cd9e728cb7c.png) ![](https://i-blog.csdnimg.cn/direct/ece1559e820d4025b587e3a25564bd47.png) server: port: 8081 spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 default-property-inclusion: non_null canal.conf: mode: tcp #tcp kafka rocketMQ rabbitMQ flatMessage: true zookeeperHosts: syncBatchSize: 1000 retries: -1 timeout: accessKey: secretKey: consumerProperties: # canal tcp consumer canal.tcp.server.host: 127.0.0.1:11111 #记得去防火墙开启这个端口 canal.tcp.zookeeper.hosts: canal.tcp.batch.size: 500 canal.tcp.username: canal.tcp.password: # kafka consumer kafka.bootstrap.servers: 127.0.0.1:9092 kafka.enable.auto.commit: false kafka.auto.commit.interval.ms: 1000 kafka.auto.offset.reset: latest kafka.request.timeout.ms: 40000 kafka.session.timeout.ms: 30000 kafka.isolation.level: read_committed kafka.max.poll.records: 1000 # rocketMQ consumer rocketmq.namespace: rocketmq.namesrv.addr: 127.0.0.1:9876 rocketmq.batch.size: 1000 rocketmq.enable.message.trace: false rocketmq.customized.trace.topic: rocketmq.access.channel: rocketmq.subscribe.filter: # rabbitMQ consumer rabbitmq.host: rabbitmq.virtual.host: rabbitmq.username: rabbitmq.password: rabbitmq.resource.ownerId: srcDataSources: defaultDS: url: jdbc:mysql://你的服务器IP:3306/你的DataSource名?useUnicode=true&useSSL=false&serverTimezone=UTC username: canal password: canal canalAdapters: - instance: example # canal instance Name or mq topic name groups: - groupId: g1 outerAdapters: - name: logger - name: es7 hosts: http://你的服务器IP:9200 properties: mode: rest #9200端口的话就写rest cluster.name: elasticsearch ![](https://i-blog.csdnimg.cn/direct/aca105dec7e5469bb81bb1e0caff79db.png) ![](https://i-blog.csdnimg.cn/direct/888c3872e2394bef879b49f4e9c6ba67.png) datasourceKey: defaultDS #源数据源的key,对应上面配置的srcDatasources中的值 destination: example #canal的instance或者MO的topic groupId: g1 #对应MQ模式下的groupId,只会同步对应groupId的数据 esMapping: _index: user #es 的索引名称 _id: _id #es 的 id,如果不配置该项必须配置下面的pk项 id则会由es自动分配 # 下面写你的MySQL需要配置表的查询语句(完整的语句) sql: "SELECT u.id AS _id, u.id , u.openid, u.quick_user_id, u.mark_number, u.brief_introduction FROM user u;" # sq1映射 commitBatch: 500 # 提交批大小 开启服务: 1.进入对应目录 cd /tmp/canal/canal.adapter 2.启动服务 sh bin/startup.sh ![](https://i-blog.csdnimg.cn/direct/81d26b925aa7406e8b1f308f7e0bd763.png) 再去查看log日志: ![](https://i-blog.csdnimg.cn/direct/c5fb5fb8712e48c097a2b68dc5014720.png) ![](https://i-blog.csdnimg.cn/direct/25a2b36d72af4604ad58c28bd5fcc468.png) 启动成功 3.如果想要停止服务 sh bin/stop.sh 如果发现运行不起来,运行了没有log日志,可以尝试下面两种解决办法: 1、降低jdk版本 2、修改分配虚拟机启动的内存 ![](https://i-blog.csdnimg.cn/direct/c645cf1aa9b94d1dbaf372fe7cc49ad7.png) ![](https://i-blog.csdnimg.cn/direct/8112a3eece8c4c85a50d3664d317cc13.png) 可以修改为: -Xms512m -Xmx1024m #### 八、测试同步 ![](https://i-blog.csdnimg.cn/direct/06476d8143814c8296cea989945bb81c.png) 新增一条数据 ![](https://i-blog.csdnimg.cn/direct/541157f443ed4c31829025391f8aaf42.png) ![](https://i-blog.csdnimg.cn/direct/6bc7ce6371cf4bb1bcf45aa70871c5ed.png) 更新一条数据 ![](https://i-blog.csdnimg.cn/direct/0115120f977d4a029b456e5718589eee.png) ![](https://i-blog.csdnimg.cn/direct/0d61d21d258c48788990d991a02554be.png) 修改同步成功,注意上面一个配置文件中我写的查询语句并不完整,实际上是需要完整的,注意和自己表的查询语句一致,注意注意。。 #### 九、曾遇过的bug 如果出现下面这种情况,可能是修改MySQL后没有重启MySQL。。。实习的时候被这这个问题折磨了一天,搜了各种办法,很逆天。 > DEBuG c.a.0.canal.client.adapter.es,core.service.Essyncservice -ml: {"data":null,"database":"quick pickup","destination": "example","es":1732938564088,"groupId":"g1" "isDd1":false,"old":nul1,"okNames":\[1,"sal > ![](https://i-blog.csdnimg.cn/direct/7f650d818b3848e6909dbc63ef9c0fd8.png) 最后去重启了一下,结果发现成功了,成功监听到信息。 ![](https://i-blog.csdnimg.cn/direct/5f5d77e10e1a4770969b63d9cf59ab0d.png)

相关推荐
避避风港1 小时前
MySQL 从入门到实战
数据库·mysql
Y淑滢潇潇1 小时前
RHCE 防火墙实验
linux·运维·rhce
wadesir2 小时前
当前位置:首页 > 服务器技术 > 正文Linux网络HSRP协议(实现路由器热备份与高可用性的实用指南)
linux·服务器·网络
稻谷君W2 小时前
Ubuntu 远程访问 Win11 WSL2 并固定访问教程
linux·运维·ubuntu
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [kernel]workqueue
linux·笔记·学习
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [kernel]usermode_helper
linux·笔记·学习
weixin_436525072 小时前
使用 idea 命令行构建 Docker 镜像并部署到云服务器
linux·docker·github
...对方正在输入......4 小时前
Elasticsearch集群部署实战指南
elasticsearch·jenkins