MySQL+Canal+Elasticsearch实现数据同步

说在前头: 本人为大二在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正。若在阅读时有任何的问题,也可通过评论提出,本人将根据自身能力对问题进行一定的解答。

版本说明

软件版本
Elasticsearch7.7.0
MySQL5.7.16
canal.adapter1.1.5
canal.deployer1.1.5

在这里插入图片描述

原理简述

在前面的文章中我们有讲述MySQL主从复制的重要性以及具体操作:使用Docker配置MySQL主从数据库,而将MySQL中的数据同步到Elasticsearch时,我们需要使用到该知识点。

首先,使用canal.deployer伪装成MySQL的从库,获取MySQL主库的数据,并对数据进行特殊的处理,使得Elasticsearch能够成功接收。

其次,保存好的数据交由canal.adapter来做推送,按照配置文件中的映射对照表进行匹配运输,最终使得Elasticsearch中的数据与MySQL主库中的数据保持同步(下图是流程示意图)
在这里插入图片描述

一、配置MySQL

因为我们需要用到主从库的功能,因此需要对mysql的配置文件做出相应的设置。来到MySQL的安装目录打开my.ini文件,在[mysqld]下增加如下信息后重启MySQL即可
在这里插入图片描述在这里插入图片描述

server-id=1
log-bin=mysql-bin
binlog-format=ROW

二、配置Elasticsearch

打开Elasticsearch安装目录下的conf文件夹中的elasticserach.yml文件,将下图的字段按照自己实际情况填写即可。
在这里插入图片描述

三、创建用于测试的表和索引

1.创建数据库estest

在MySQL中执行如下命令创建数据库estest

create database estest;

2.创建表book

在MySQL中执行如下命令创建表book

use estest;
DROP TABLE IF EXISTS `book`;
CREATE TABLE `book`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `author` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 25 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

3.创建索引estest_book

使用postman工具,向Elasticsearch发送PUT请求,请求地址为http://localhost:9200/estest_book/,以实现创建索引estest_book(注意:es中的索引命名需要是MySQL中的“数据库名_表明”,如数据库名为estest,表名book,则索引名应为estest_book)

{
    "mappings": {
    	"properties": {
    		"name": {
    			"type": "text"
    		},
    		"author": {
    			"type": "text"
    		}
    	}	
    }
}

在这里插入图片描述

四、配置canal.deployer1.1.5

Github下载地址:https://github.com/alibaba/canal/releases/tag/canal-1.1.5

将canal.deployer下载下来后,我们需要对canal的连接配置做修改:进入安装目录后依次进入->confi->example,并打开instance.properties文件,对文件中的数据库配置信息进行修改,修改完成后保存退出即可
在这里插入图片描述
在这里插入图片描述

五、配置canal.adapter1.1.5

1.下载

Github下载地址:https://github.com/alibaba/canal/releases/tag/canal-1.1.5

2.重编译

注意,下载好canal.adapter后,启动canal.adapter时会报alibaba MySQL连接池依赖冲突错误,此时我们需要将canal源码下载下来,使用idea打开,对canal-adapter中的pom进行修改并重新编译(具体操作可以查看如下博客,这里不再赘述:canal-adapter升级1.1.5踩过的坑

3.配置文件

按照如下路径打开adapter的配置文件:根目录->conf->application.yml(配置可参考如下:cluster.name需要与Elasticsearch的配置的一致,hosts需要带上http://前缀

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: 0
  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:
  srcDataSources:
    defaultDS:
      url: jdbc:mysql://127.0.0.1:3306/estest?useUnicode=true
      username: root
      password: 123456
  canalAdapters:
  - instance: example # canal instance Name or mq topic name
    groups:
    - groupId: g1
      outerAdapters:
      - name: logger
      - name: es7
        key: exampleKey
        hosts: http://127.0.0.1:9200 # 127.0.0.1:9200 for rest mode
        properties:
          mode: rest # or rest
          cluster.name: elasticsearch

4.索引映射文件

按照如下路径打开:根目录->conf->es7->mytest_user.yml

表的映射文件名需要与索引名一致,因此我们需要将mytest_user.yml重命名为estest_book

重命名后对该文件信息进行修改,具体配置参考如下:(其中,outerAdapterKey的信息需要与上面application.yml文件中outerAdapters.key的值保持一致)

dataSourceKey: defaultDS
destination: example
groupId: g1
outerAdapterKey: exampleKey
esMapping:
  _index: estest_book
  _id: _id
#  upsert: true
#  pk: id
  sql: "select id as _id, name, author from book"
#  objFields:
#    _labels: array:;
  etlCondition: "where a.c_time>={}"
  commitBatch: 3000

测试

完成上面几个步骤后,我们就可以开始正式的测试环节了。依次启动MySQL->Elasticsearch->canal.deployer->canal.adapter

当程序启动完毕后,开始向MySQL数据库中插入数据,观察Elasticsearch中数据的变化

MySQL中插入数据
在这里插入图片描述

canal.adapter日志信息(当MySQL中数据发生改变时,adapter对已经更新的从库的新信息推送给Elasticsearch,推送成功后将会返回Affected indexes: estest_book等关键信息)
在这里插入图片描述

此时使用postman向Elasticsearch发送GET请求,查看该索引下的数据变化情况

Get请求http://localhost:9200/estest_book/_search
在这里插入图片描述

可能会遇到的问题

在学习的过程中,可能会遇到许多的坑,在这里我将自己遇到的几个坑指出来并贴上帮助我解决这些问题的博客连接

1.canal本地运行异常:class com.alibaba.druid.pool.DruidDataSource cannot be cast to:

博客链接:https://blog.csdn.net/chshzh2000/article/details/118491050

2.canal adapter异常:Not found the mapping info of index: xxx:

博客链接:https://blog.csdn.net/lizz861109/article/details/113180975

3.canal adapter没有同步成功无异常:

博客链接:https://blog.csdn.net/lizz861109/article/details/113183990

4.版本问题

如果你的elasticsearch版本是7的,因为类型这一概念的废除,当你使用canal1.1.4时,会出现数据无法推送成功的问题,所以你需要将es下调为6或者将canal上调为1.1.5。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云丶言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值