DockerCompose方式部署Canal

Canal

Canal 简介

主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。

canal的工作原理就是把自己伪装成MySQL slave,模拟MySQL slave的交互协议向MySQL Mater发送 dump协议,MySQL mater收到canal发送过来的dump请求,开始推送binary log给canal,然后canal解析binary log,再发送到存储目的地,比如MySQL,Kafka,Elastic Search等等。

canal的数据同步不是全量的,而是增量。基于binary log增量订阅和消费
原理:
Canal-Server监听MySQL Binlog
Canal-Adapter将数据同步到其他数据库
在这里插入图片描述

前提条件

  1. mysql开启Binlog,并且为ROW模式
  2. 使用canal连接MySQL的用户需要拥有对应的从站等权限
  3. MySQL与ES同步的表需要提前将表结构手动同步到ES结构中
    注意:canal是增量同步,对旧数据推荐使用CloudCanal工具进行一键同步

成功部署后我所挂载的Canal server与adapter的目录结构

在这里插入图片描述

DockerCompose部署Mysql开启Binlog

Yaml文件配置

mysql:
    image: mysql:5.7.27 # 此处镜像使用mysql5
    container_name: container-mysql # 容器名称
    restart: always # 重启方式
    privileged: true
    environment:
      TZ: Asia/Shanghai
      LANG: C.UTF-8
      MYSQL_ROOT_PASSWORD: 此处为MySQL Root账号密码
      MYSQL_DATABASE: 数据库名称
      MYSQL_USER: 用户名
      MYSQL_PASSWORD: 密码
    command: 
      --server_id=100 #主站ID
      --log-bin=/var/lib/mysql/mysql-bin #开启binlog的文件名
      --sync_binlog=1
      --binlog-ignore-db=mysql
      --binlog_format=ROW # binlog格式为ROW
      --expire_logs_days=7 # binlog文件存活时间
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    volumes:
      - ./database/mysql:/var/lib/mysql # 映射宿主机文件路径:容器内部路径
    networks:
      - container-net # 加入的Docker网络,Docker内可以做到网络互通

验证是否开启Binlog

进入MySQL或Navicat工具中连接MySQL,执行以下命令:

show variables like 'log_%';

如下图,即为开启binlog
在这里插入图片描述

DockerCompose部署Canal-Server

Yaml文件配置

canal-server:
    image: canal/canal-server:v1.1.5
    container_name: container-canal-server
    restart: always
    volumes:
      - ./config/canal-server:/home/admin/canal-server/conf
      - ./logs/canal-server:/home/admin/canal-server/logs
    privileged: true
    environment:
      - canal.auto.scan=true
      - canal.destinations=destinationName # canal实例名称,根据自己喜好命名
      - canal.instance.mysql.slaveId=1085 # canal作为模仿从站的ID,不可与主站重复
      - canal.instance.master.address=192.168.xxx.xxx:3306 #mysql的连接地址
      - canal.instance.dbUsername=root # mysql的用户
      - canal.instance.dbPassword=passwrod # mysql的密码
      - canal.instance.connectionCharset=UTF-8
      - canal.instance.tsdb.enable=true
      - canal.instance.gtidon=false
      - canal.instance.parser.parallelThreadSize=16
      - canal.instance.filter.regex=dbname.tablename # 此处为监听的正则表达式过滤,具体参考官网配置,多个用英文逗号隔开",",例如:dbname.tablename1,dbname.tablename2
    depends_on:
      - mysql
    links:
      - mysql
    networks:
      - container-net

在启动Canal-Server之前,先启动一个容器用于将容器内部文件Copy至宿主机,方便宿主机与容积进行挂载,具体操作步骤如下:

# 启动一个容器
docker run --name canal-server canal/canal-server:v1.1.5
# 将容器内部文件复制到宿主机
docker cp canal-server:/home/admin/canal-server/conf yaml文件中的绝对路径
docker cp canal-server:/home/admin/canal-server/logs yaml文件中的绝对路径
# 停止并删除容器
docker stop canal-server && docker rm canal-server

验证启动成功

在宿主机挂载的canal-server logs下查看对应实例名下的“实例名.log”,显示如下信息即代表启动成功:

2022-12-22 15:26:03.800 [main] INFO  c.a.otter.canal.instance.spring.CanalInstanceWithSpring - start CannalInstance for 1-collection 
2022-12-22 15:26:03.813 [main] WARN  c.a.o.canal.parse.inbound.mysql.dbsync.LogEventConvert - --> init table filter : ^dbname.tablename$
2022-12-22 15:26:03.813 [main] WARN  c.a.o.canal.parse.inbound.mysql.dbsync.LogEventConvert - --> init table black filter : ^mysql\.slave_.*$
2022-12-22 15:26:03.889 [destination = collection , address = /192.168.50.83:1026 , EventParser] WARN  c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - ---> begin to find start position, it will be long time for reset or first position
2022-12-22 15:26:03.904 [main] INFO  c.a.otter.canal.instance.core.AbstractCanalInstance - start successful....
2022-12-22 15:26:03.904 [destination = collection , address = /192.168.50.83:1026 , EventParser] WARN  c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - prepare to find start position just show master status
2022-12-22 15:26:04.484 [destination = collection , address = /192.168.50.83:1026 , EventParser] WARN  c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - ---> find start position successfully, EntryPosition[included=false,journalName=mysql-bin.000001,position=51110,serverId=100,gtid=,timestamp=1671693025000] cost : 585ms , the next step is binlog dump

DockerCompose部署Canal-Adapter

Yaml文件配置

canal-adapter:
    image: slpcat/canal-adapter:v1.1.5 # 所使用的的镜像
    container_name: coll-canal-adapter # 容器名
    restart: always
    volumes: # 数据卷挂载
      - ./canal-adapter/conf:/opt/canal-adapter/conf
      - ./canal-adapter/logs:/opt/canal-adapter/logs
    privileged: true
    depends_on:
      - mysql
      - canal-server
    links:
      - mysql
      - canal-server
    networks:
      - cms_hook_net

同样启动Canal-Adapter之前,启动一个容器,将容器内文件复制出来

# 启动一个容器
docker run --name canal-adapter slpcat/canal-adapter:v1.1.5
# 将容器内部文件复制到宿主机
docker cp canal-adapter:/opt/canal-adapter/conf [yaml文件中的绝对路径]
docker cp canal-adapter:/opt/canal-adapter/logs [yaml文件中的绝对路径]
# 停止并删除容器
docker stop canal-adapter && docker rm canal-adapter

配置宿主机映射的容器内conf目录下的application文件,对以下内容进行修改

canal.conf:
  mode: tcp # 更改为TCP模型
  consumerProperties:
    # canal server暴露的11111端口
    canal.tcp.server.host: 192.168.xxx.xxx:11111
  srcDataSources: # 源数据库的连接信息
    defaultDS:
      url: jdbc:mysql://192.168.xxx.xxx:3306/dbname?useUnicode=true
      username: root
      password: root
  canalAdapters: # 同步至目标数据库的连接,此处以ES7为例
  - instance: destinationName # canal-server的yml文件中配置的canal.destinations项名称
    groups:
    - groupId: g1
      outerAdapters:
      - name: es7 # 1.1.5之后根据官网使用es7或es6命名
        hosts: 192.168.xxx.xxxx:9300 # ES的地址
        properties:
          mode: transport # or rest
          # security.auth: test:123456 #  only used for rest mode
          cluster.name: elasticsearch # ES集群名

配置宿主机映射的容器内conf目录下es7目录下yml文件
canal-adapter会扫描“conf/es7/”所有以.yml为后缀名的配置文件
此处仅保留一个以“destinationName.yml”命名的文件,具体内容如下:

dataSourceKey: defaultDS
destination: collection
groupId: g1
concurrent: true
esMapping:
  _index: _test # ES索引名称
  _type: _doc # ES类型为文档
  _id: _id # 主键映射
  sql: "select l.id AS _id, l.c_name AS c_name from tablename l"
  # Sql mysql数据库字段 AS ES字段,以此为对应关系
  # etlCondition: "where t.c_time>={}"
  commitBatch: 3000

验证成功

进入宿主机挂载的adapter的logs下,查看logs/adapter/adapter.log,显示如下信息并且无报错代表启动成功:

2022-12-22 15:43:57.377 [Thread-3] INFO  c.a.otter.canal.adapter.launcher.loader.AdapterProcessor - =============> Start to connect destination: collection <=============
2022-12-22 15:43:57.389 [main] INFO  o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port(s): 8081 (http) with context path ''
2022-12-22 15:43:57.392 [main] INFO  c.a.otter.canal.adapter.launcher.CanalAdapterApplication - Started CanalAdapterApplication in 4.79 seconds (JVM running for 5.553)
2022-12-22 15:43:57.420 [Thread-3] INFO  c.a.otter.canal.adapter.launcher.loader.AdapterProcessor - =============> Subscribe destination: collection succeed <=============

启动所有容器

进入docker-compose.yml所在的位置,启动所有容器

docker compose up -d
  • 25
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值