> 技术文档 > 通过MySQL binlog日志,使用canal同步分库分表数据,到 Elasticsearch_canal 分库分表

通过MySQL binlog日志,使用canal同步分库分表数据,到 Elasticsearch_canal 分库分表

前言
通过简单干净实践的方式教会读者,配置出一套 Canal 工具服务,来同步分库分表的数据到 Elasticsearch 文件夹系统中。同时在 SpringBoot 工程中,配置出两套数据源,一套是 MySQL + MyBatis,一套是 Elasticsearch + MyBatis。【这是非常重要的设计手段】

工程代码里面已提供完整需要的本次环境的docker安装环境 如下的目录
docs/dev-ops/tech-canal-docker-compose.yml:提供了所需的环境安装,mysql、canal-server、canal-adapter、elasticsearch、kibana

组件
通过MySQL binlog日志,使用canal同步分库分表数据,到 Elasticsearch_canal 分库分表
canal ,译为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。

它的工作原理是,canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议。在 MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal ) 这样 canal 再解析 binary log (binlog)进行配置分发,同步到 Elasticsearch 等系统中进行使用。

那么有了 canal 就可以把分库分表的数据同步到 Elasticsearch,提供汇总查询和聚合操作,也就不需要把轮训每个分库分表数据了。

测试预期
案例会把MySQL,2库4表的数据,通过 Sharding 分库分表写入数据后,同步到 Elasticsearch。分库分表如下(环境安装中会自动安装数据库和设置库表);

环境安装
部署环境
通过MySQL binlog日志,使用canal同步分库分表数据,到 Elasticsearch_canal 分库分表
如果是在 Linux 安装了 docker 可以把 dev-ops 整个文件夹都上传到云服务器,之后通过脚本;

docker-compose -f xfg-dev-tech-canal-docker-compose.yml up -d

进行安装。
开启 binlog
mysql 数据同步需要创建一个 canal 的账户,之后还需要开启 binlog 日志。
通过MySQL binlog日志,使用canal同步分库分表数据,到 Elasticsearch_canal 分库分表
通过MySQL binlog日志,使用canal同步分库分表数据,到 Elasticsearch_canal 分库分表
1:在 mysql 配置文件夹中,设置了初始化授权的账户、导入的库表,以及开启 mysql-bin 和配置要采集的库。
2:如果你有配置自己其他的库要同步也可以如此配置。
库表采集配置
通过MySQL binlog日志,使用canal同步分库分表数据,到 Elasticsearch_canal 分库分表
本文选择的是 es 同步方式,所以需要在 canal-adapter 中 es7 文件夹添加同步的库表 yml 配置。

以及在 application.yml 中配置出需要链接的库表以及同步的目标地址,也就是 es 的地址。【因为本文的案例是在同一个 docker compose 下安装,所以直接用名称 elsticsearch 即可访问】

环境运行状态
通过MySQL binlog日志,使用canal同步分库分表数据,到 Elasticsearch_canal 分库分表
安装完成后可以进入 portainer 查看各个组件的运行,如果有哪个运行失败了,可以点击那个小文件的图标,它可以查看日志。

创建索引
在 doc/dev-ops/curl 下提供了创建 Elasticsearch 的脚本;你可以点击执行或者直接复制执行,也可以复制导入到 ApiPost 里执行。

以上这些脚本是为了创建出数据库表同步到 Elasticsearch 后对应的索引和映射的字段。文章下面会用到。
创建

curl -X PUT \"127.0.0.1:9200/tech.user_order\" -H \'Content-Type: application/json\' -d\'{  \"mappings\": {  \"properties\": {  \"_user_id\":{ \"type\": \"text\"}, \"_user_name\":{ \"type\": \"text\"}, \"_order_id\":{ \"type\": \"text\"}, \"_uuid\":{ \"type\": \"text\"}, \"_create_time\":{ \"type\": \"date\"}, \"_update_time\":{ \"type\": \"date\"} } }}\'

添加

curl -X PUT \"127.0.0.1:9200/tech.user_order/_mapping\" -H \'Content-Type: application/json\' -d\'{  \"properties\": {  \"_sku_name\": {  \"type\": \"text\" } }}\'

删除

curl -X DELETE \"127.0.0.1:9200/tech.user_order\"

创建索引(Kibana)
地址:http://127.0.0.1:5601/app/management/kibana/indexPatterns
通过MySQL binlog日志,使用canal同步分库分表数据,到 Elasticsearch_canal 分库分表
数据页面
http://127.0.0.1:5601/app/discover
通过MySQL binlog日志,使用canal同步分库分表数据,到 Elasticsearch_canal 分库分表
许可证
kibana 提供了免费30天的试用许可,安装后可以使用 x-pack-sql-jdbc。它的好处是可以让我们通过 MyBatis 的方式查询 Elasticsearch 数据。

地址:http://127.0.0.1:5601/app/management/stack/license_management
通过MySQL binlog日志,使用canal同步分库分表数据,到 Elasticsearch_canal 分库分表
Elasticsearch 提供了 x-pack-sql-jdbc,让对 Elasticsearch 的查询也可以像使用 MySQL 数据库一样通过 MyBatis 进行查询。但这个 x-pack-sql-jdbc 是付费的,免费可以使用 30 天。之后你可以选择使用重新安装,破解,或者使用 Elasticsearch 的查询方式。还可以自己开发一个 Elasticsearch JDBC,GitHub 上也有类似的组件。
使用时需要引入 POM 配置;

<dependency> <groupId>org.elasticsearch.plugin</groupId> <artifactId>x-pack-sql-jdbc</artifactId> <version>