利用Canal全量/增量同步mysql数据至ES

Canal同步mysql数据至ES

1、更改Mysql配置

1.1 开启 Binlog 写入功能

配置 binlog-format 为 ROW 模式,配置my.cnf

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

1.2 授权

授权 canal 链接 MySQL 账号具有作为 MySQL slave 的权限, 如果已有账户可直接 grant

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

2、下载canal.deployer

2.1 建议下载最新稳定版,我下载的是1.1.4版本。

wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deployer-1.1.4.tar.gz

2.2 解压缩

mkdir /data/canal/deployer
tar -zxvf canal.deployer-1.1.4.tar.gz -C deployer/

​ 解压后为:

在这里插入图片描述

2.3 修改canal配置

vi conf/example/instance.properties

## mysql serverId
canal.instance.mysql.slaveId = 1234
#position info,需要改成自己的数据库信息
canal.instance.master.address = 127.0.0.1:3306 
canal.instance.master.journal.name = 
canal.instance.master.position = 
canal.instance.master.timestamp = 
#canal.instance.standby.address = 
#canal.instance.standby.journal.name =
#canal.instance.standby.position = 
#canal.instance.standby.timestamp = 
#username/password,需要改成自己的数据库信息
canal.instance.dbUsername = canal  
canal.instance.dbPassword = canal
canal.instance.defaultDatabaseName =
canal.instance.connectionCharset = UTF-8
#table regex
canal.instance.filter.regex = .\*\\\\..\*

2.4 启动

sh bin/startup.sh

3、下载canal.adapter

3.1 下载

wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.adapter-1.1.4.tar.gz

3.1 适配器整体结构

client-adapter分为适配器和启动器两部分, 适配器为多个fat jar, 每个适配器会将自己所需的依赖打成一个包, 以SPI的方式让启动器动态加载, 目前所有支持的适配器都放置在plugin目录下

启动器为 SpringBoot 项目, 支持canal-client启动的同时提供相关REST管理接口, 运行目录结构为:

- bin
    restart.sh
    startup.bat
    startup.sh
    stop.sh
- lib
   ...
- plugin 
    client-adapter.logger-1.1.1-jar-with-dependencies.jar
    client-adapter.hbase-1.1.1-jar-with-dependencies.jar
    ...
- conf
    application.yml
    - hbase
        mytest_person2.yml
- logs

以上目录结构最终会打包成 canal-adapter-1.1.4.tar.gz 压缩包

3.1 适配器配置介绍

1、总配置文件application.yml

1.1 adapter定义配置部分

canal.conf:
  mode: tcp  # canal client的模式: tcp kafka rocketMQ
  canalServerHost: 123.126.41.204:20482  # 对应单机模式下的canal server的ip:port
  batchSize: 500  # 每次获取数据的批大小, 单位为K
  syncBatchSize: 1000 # 每次同步的批数量
  retries: 0  # 重试次数, -1为无限重试
  timeout:  # 同步超时时间, 单位毫秒
  srcDataSources:
    defaultDS:  # 自定义名称
      url: jdbc:mysql://123.126.41.204:20456/canal_test?useUnicode=true
      username: root
      password: root
  canalAdapters:  # 适配器列表
  - instance: example   # canal 实例名或者 MQ topic 名
    groups:
    - groupId: g1  # 分组id
      outerAdapters:  # 分组内适配器列表
      - name: logger  # 日志
      - name: es   #elasticsearch
        hosts: 123.126.41.204:20475 
        properties:
          cluster.name: eshao-application
  - instance: one
    groups:
    - groupId: g1
      outerAdapters:
      - name: logger
      - name: es
        hosts: 123.126.41.204:20475
        properties:
          cluster.name: eshao-application

说明:

一份数据可以被多个group同时消费, 多个group之间会是一个并行执行, 一个group内部是一个串行执行多个outerAdapters, 比如例子中logger和es

3.1 适配器启动

3.1.1、启动canal server

见2.4

3.1.2、修改conf/application.yml
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
  canalServerHost: ip:port
  batchSize: 500
  syncBatchSize: 1000
  retries: 0
  timeout:
  srcDataSources:
    defaultDS:
      url: jdbc:mysql://ip:port/db?useUnicode=true
      username: username
      password: password
  canalAdapters:
  - instance: example
    groups:
    - groupId: g1
      outerAdapters:
      - name: logger
3.1.3、启动
bin/startup.sh
3.1.4、测试:adapter管理REST接口

查询所有订阅同步的canal instance或MQ topic

curl http://127.0.0.1:8081/destinations

数据同步开关

curl http://127.0.0.1:8081/syncSwitch/example/off -X PUT

针对 example 这个canal instance/MQ topic 进行开关操作. off代表关闭, instance/topic下的同步将阻塞或者断开连接不再接收数据, on代表开启

数据同步开关状态

curl http://127.0.0.1:8081/syncSwitch/example

手动同步

curl http://127.0.0.1:8081/etl/es/mytest_person2.yml -X POST

导入数据到指定类型的库, 如果params参数为空则全表导入, 参数对应的查询条件在配置中的etlCondition指定

查看相关库总数据

curl http://127.0.0.1:8081/count/hbase/mytest_person2.yml

3.2 同步至ES

3.2.1 修改启动器配置: application.yml
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
  canalServerHost: ip:port
  batchSize: 500
  syncBatchSize: 1000
  retries: 0
  timeout:
  srcDataSources:
    defaultDS:
      url: jdbc:mysql://ip:port/db?useUnicode=true
      username: root
      password: root
  canalAdapters:
  - instance: example
    groups:
    - groupId: g1
      outerAdapters:
      - name: logger
      - name: es
        hosts: ip:port
        properties:
          cluster.name: eshao-application
  - instance: one
    groups:
    - groupId: g1
      outerAdapters:
      - name: logger
      - name: es
        hosts: ip:port
        properties:
          cluster.name: eshao-application

adapter将会自动加载 conf/es 下的所有.yml结尾的配置文件

3.2.2 适配器表映射文件

修改 conf/es/mytest_user.yml文件:

dataSourceKey: defaultDS # 源数据源的key, 对应上面配置的srcDataSources中的值
destination: example # cannal的instance或者MQ的topic
esMapping:
  _index: mytest_person # es 的索引名称
  _type: _doc # es 的type名称
  _id: _id # es 的_id, 如果不配置该项必须配置下面的pk项_id则会由es自动分配
  upsert: true
#  pk: id # 如果不需要_id, 则需要指定一个属性为主键属性
  sql: "SELECT p.id as _id,name,age,last_update_time as time from person p"
#  objFields:
#    _labels: array:; # 数组或者对象属性, array:; 代表以;字段里面是以;分隔的
#  etlCondition: "where a.c_time>={}"
  commitBatch: 3000

修改 conf/es/one.yml文件:

dataSourceKey: defaultDS # 源数据源的key, 对应上面配置的srcDataSources中的值
destination: one # cannal的instance或者MQ的topic
esMapping:
  _index: index_one # es 的索引名称
  _type: _doc # es 的type名称
  _id: _id # es 的_id, 如果不配置该项必须配置下面的pk项_id则会由es自动分配
  upsert: true
#  pk: id # 如果不需要_id, 则需要指定一个属性为主键属性
  sql: "SELECT o.id as _id, name from one o"
#  objFields:
#    _labels: array:; # 数组或者对象属性, array:; 代表以;字段里面是以;分隔的
#  etlCondition: "where a.c_time>={}"
  commitBatch: 3000

注意:进行同步时需要先在ES中建立索引及映射

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
方案是为解决特定问题或达成特定目标而制定的一系列计划或步骤。它的作用是提供一种系统性的方法,以有效地应对挑战、优化流程或实现目标。以下是方案的主要作用: 问题解决: 方案的核心目标是解决问题。通过系统性的规划和执行,方案能够分析问题的根本原因,提供可行的解决方案,并引导实施过程,确保问题得到合理解决。 目标达成: 方案通常与明确的目标相关联,它提供了一种达成这些目标的计划。无论是企业战略、项目管理还是个人发展,方案的制定都有助于明确目标并提供达成目标的路径。 资源优化: 方案在设计时考虑了可用资源,以最大化其效用。通过明智的资源分配,方案可以在有限的资源条件下实现最大的效益,提高效率并减少浪费。 风险管理: 方案通常会对潜在的风险进行评估,并制定相应的风险管理策略。这有助于减轻潜在问题的影响,提高方案的可行性和可持续性。 决策支持: 方案提供了决策者所需的信息和数据,以便做出明智的决策。这种数据驱动的方法有助于减少不确定性,提高决策的准确性。 团队协作: 复杂的问题通常需要多个人的协同努力。方案提供了一个共同的框架,帮助团队成员理解各自的职责和任务,促进协作并确保整个团队朝着共同的目标努力。 监控与评估: 方案通常包括监控和评估的机制,以确保实施的有效性。通过定期的评估,可以及时调整方案,以适应变化的环境或新的挑战。 总体而言,方案的作用在于提供一种有序、有计划的方法,以解决问题、实现目标,并在实施过程中最大化资源利用和风险管理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值