利用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/

​ 解压后为:

利用Canal全量/增量同步mysql数据至ES_第1张图片

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中建立索引及映射

你可能感兴趣的:(Elastic,Search,canal)