说在前头: 本人为大二在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正。若在阅读时有任何的问题,也可通过评论提出,本人将根据自身能力对问题进行一定的解答。
版本说明
软件 | 版本 |
---|---|
Elasticsearch | 7.7.0 |
MySQL | 5.7.16 |
canal.adapter | 1.1.5 |
canal.deployer | 1.1.5 |
原理简述
在前面的文章中我们有讲述MySQL主从复制的重要性以及具体操作:使用Docker配置MySQL主从数据库,而将MySQL中的数据同步到Elasticsearch时,我们需要使用到该知识点。
首先,使用canal.deployer伪装成MySQL的从库
,获取MySQL主库的数据,并对数据进行特殊的处理,使得Elasticsearch能够成功接收。
其次,保存好的数据交由canal.adapter来做推送
,按照配置文件中的映射对照表进行匹配运输,最终使得Elasticsearch中的数据与MySQL主库中的数据保持同步(下图是流程示意图)
一、配置MySQL
因为我们需要用到主从库的功能,因此需要对mysql的配置文件做出相应的设置。来到MySQL的安装目录打开my.ini文件,在[mysqld]
下增加如下信息后重启MySQL
即可
1
2
3
4server-id=1 log-bin=mysql-bin binlog-format=ROW
二、配置Elasticsearch
打开Elasticsearch安装目录下的conf文件夹中的elasticserach.yml
文件,将下图的字段按照自己实际情况填写即可。
三、创建用于测试的表和索引
1.创建数据库estest
在MySQL中执行如下命令创建数据库estest
1
2create database estest;
2.创建表book
在MySQL中执行如下命令创建表book
1
2
3
4
5
6
7
8
9use 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)
1
2
3
4
5
6
7
8
9
10
11
12
13{ "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://前缀
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42server: 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的值保持一致)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15dataSourceKey: 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。
最后
以上就是魁梧往事最近收集整理的关于MySQL+Canal+Elasticsearch实现数据同步版本说明原理简述一、配置MySQL二、配置Elasticsearch三、创建用于测试的表和索引四、配置canal.deployer1.1.5五、配置canal.adapter1.1.5测试可能会遇到的问题的全部内容,更多相关MySQL+Canal+Elasticsearch实现数据同步版本说明原理简述一、配置MySQL二、配置Elasticsearch三、创建用于测试内容请搜索靠谱客的其他文章。
发表评论 取消回复