用阿里canal 从 mysql同步到 es

最近开发要用到 mysql 数据同步到 es 。在搜索后定位到阿里开源的canal,其主要原理是canal伪装成MySQL的从库,接收binlog信息,再通过解析和映射同步到其他的存储中去。

官方的文档已经比较详尽,整体流程参考QuickStartAdapter-ES,也在网上搜索搭建步骤但不是很详细, 在此仅记录一下自己的具体操作步骤,和在搭建时候遇到可坑。

搭建环境:

  • ubuntu-20.04.3
  • mysql-8.0.29
  • canal-1.1.5
  • elasticsearch-7.17.3
  • kibana-7.17.3 或 elasticsearch-head

一、MySQL相关配置

在my.cnf中加入以下配置

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

重启MySQL

service mysql restart

连接到MySQL查看binlog配置生效

show variables like 'binlog_format%';

拥有从库权限的账号,用于订阅binlog,这里创建的账号为canal:canal

mysql> create user canal identified by 'canal';
mysql> grant select, replication slave, replication client on *.* to 'canal'@'%';
mysql> flush privtleges;

二、安装 elasticsearch

下载地址:https://www.elastic.co/cn/downloads/elasticsearch
elasticsearch-7.17.3-linux-x86_64.tar.gz
在这里插入图片描述

在这里插入图片描述
在服务器上解压

tar -zxvf elasticsearch-7.17.3-linux-x86_64.tar.gz

解压后 我本来就有 Ubuntu 就在此上弄了
在这里插入图片描述
更改配置文件 /conf/application.yml

network.host: 0.0.0.0
http.port: 9200
path.data: /opt/es/data
path.logs: /opt/es/logs
discovery.seed_hosts: ["host1"]
cluster.initial_master_nodes: ["node-1"]
#---------------------------文件最后添加----跨域支持-------------------------------------------
http.cors.enabled: true
http.cors.allow-origin: "*"
  • 创建用户
useradd es #创建用户
chown es:es -R /opt/es/lasticsearch-7.17.3  #创建所属组
su es  #切换到 es 用户
cd /usr/local/elasticsearch-7.17.3/bin  #进入bin目录
./elasticsearch -d 启动elasticsearch 查看日志是否启动成功
su root #返回 root 用户

三 、kibana / elasticsearch-head 二选一即可

1. kibana

下载 https://www.elastic.co/cn/downloads/past-releases/kibana-7-17-3
kibana-7.17.3-linux-x86_64.tar.gz
在服务器上解压

tar -zxvf elasticsearch-7.17.3-linux-x86_64.tar.gz

修改配置文件
账号密码没有启用 生产要启用的
conf/kibana.yml

server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]
i18n.locale: "zh-CN"

启动

./bin/kibana   --allow-root &

在这里插入图片描述
执行 创建索引 ,此处与后创建的数据库id,name,adderss 字段对应
在这里插入图片描述

PUT test
{
  "mappings": {
    
      "properties": {
        "id": {
          "type": "long"
        },
        "name": {
          "type": "text"
        },
        "address": {
          "type": "text"
        }
      }
    
  }
}

GET test/_search  #查询

GET test/_mapping  #查询索引

DELETE test  #删除索引

在这里插入图片描述

2. elasticsearch-head 浏览器插件

下载 https://github.com/mobz/elasticsearch-head
在这里插入图片描述
下载源码后 只要插件 此插件可能不能直接安装 需要修改后缀名.rar 解压后 浏览器添加

在这里插入图片描述
也需要执行 索引 如上kibana

四、canal

下载地址 https://github.com/alibaba/canal/releases/
只需下载此三个
在这里插入图片描述

canal的各个组件的用途各不相同
  • canal-deploy(canal-server):可以直接监听MySQL的binlog,把自己伪装成MySQL的从库,只负责接收数据,并不做处理。

  • canal-adapter:相当于canal的客户端,会从canal-server中获取数据,然后对数据进行同步,可以同步到Redis、Elasticsearch中去。

  • canal-admin:为canal提供整体配置管理、节点运维等面向运维的功能,提供相对友好的WebUI操作界面,方便更多用户快速和安全的操作。

1. canal.deployer

解压 后 修改配置连接到自己的MySQL

vim conf/example/instance.properties

找到以下配置并对应更改

#position info,需要改成自己的数据库信息
canal.instance.master.address = 127.0.0.1:3306
#username/password,需要改成自己的数据库信息
canal.instance.dbUsername = canal  
canal.instance.dbPassword = canal

启动

 ./bin/startup.sh
2. canal.adapter

解压 修改配置 conf/application.yml

server:
  port: 8081
canal.conf:
  srcDataSources: # 源数据库配置
    defaultDS:
      url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true
      username: canal
      password: canal
canalAdapters: # 适配器列表
  - instance: example # canal实例名或者MQ topic名
    groups: # 分组列表
    - groupId: g1 # 分组id, 如果是MQ模式将用到该值
      outerAdapters:
        name: es7 
        hosts: 127.0.0.1:9200 # ES连接地址
        properties:
          mode: rest # 模式可选transport(9300) 或者 rest(9200)
          # security.auth: test:123456 #  only used for rest mode
          cluster.name: elasticsearch # ES集群名称

添加映射 conf/es7/test.yml
在这里插入图片描述

dataSourceKey: defaultDS
destination: example
groupId: g1
esMapping:
  _index: test
  _id: id
  sql: "select t.id, t.name, t.address from test t"
  etlCondition: "where t.id>0"
  commitBatch: 3000

启动

 ./bin/startup.sh

此处启动后会报错 ClassCastException: com.alibaba.druid.pool.DruidDataSource cannot be cas这个属于canal1.1.5版本自带的bug,解决方式有二

1 ). 下载1.1.5版本源码,将client-adapter目录下escore的pom文件修改一下,然后将es7x打包,将打包好的文件替换adapter的plugins目录中的文件t to com.alibaba.druid.pool.DruidDataSource** )
加上这个

		<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <scope>provided</scope> 
        </dependency>

2). 下载v1.1.5-alpha-2的adapter,然后复制这个版本的client-adapter.es7x-1.1.5-SNAPSHOT-jar-with-dependencies.jar 放入1.1.5的plugins目录中
(本人是用这个方法解决的)

3. canal.admin

参考: https://blog.csdn.net/weixin_46097842/article/details/125019459

五 、测试
创建 test库 test表

CREATE TABLE test (
	`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
	`name` VARCHAR(10) NOT NULL COMMENT '名称',
	`address` VARCHAR(10) NOT NULL COMMENT '地址',
	PRIMARY KEY (`id`) USING BTREE
)

INSERT INTO `test`(name, address) VALUES ( '北京','北京市朝阳区');

canal-adapter.log如下 有打印信息
在这里插入图片描述
执行此
在这里插入图片描述

此时 可以看到 mysql binlog.log 增量同步 数据已经同步了

正常 情况 要先全量同 mysql 历史数据 后再增量

POST : http://192.168.2.136:8081/etl/es7/test.yml
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现MySQL数据实时同步Elasticsearch可以使用Canal工具。 Canal阿里巴巴开源的一套基于数据库增量日志解析的数据同步和逆向解析工具,可以实时获取数据库的变更日志,然后将这些变更日志解析成数据并发送到指定的目的地。在实现MySQL数据实时同步Elasticsearch中,可以使用Canal来实现以下步骤: 1. 安装配置Canal:首先,需要下载并安装Canal,并配置Canal的参数,如MySQL的地址、端口、用户名、密码等。 2. 创建Canal实例:根据实际需求,可以创建一个或多个Canal实例来监控和同步MySQL的变更日志。 3. 配置Elasticsearch目的地:配置Canal将变更日志发送到Elasticsearch作为同步的目的地。 4. 启动Canal实例:通过命令行或脚本启动Canal实例,让Canal开始监控MySQL的变更日志。 5. 解析并同步数据:Canal会实时监控MySQL的变更日志,一旦有变更,就会解析并发送到Elasticsearch。在Elasticsearch中,可以根据业务需求进行相应的处理,比如数据转换、数据筛选、数据拆分等,并将处理后的数据存储到Elasticsearch中。 通过以上步骤,就可以实现MySQL数据的实时同步Elasticsearch中。Canal工具可以很好地解析MySQL的增量日志并将数据发送到Elasticsearch,保证数据的实时性和一致性。同时,Canal还支持分布式部署和高可用性,可以满足大规模数据同步的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值