概述
DockerCompose方式部署Canal同步MySQL至ES
- Canal
- Canal 简介
- 前提条件
- 成功部署后我所挂载的Canal server与adapter的目录结构
- DockerCompose部署Mysql开启Binlog
- Yaml文件配置
- 验证是否开启Binlog
- DockerCompose部署Canal-Server
- Yaml文件配置
- 验证启动成功
- DockerCompose部署Canal-Adapter
- Yaml文件配置
- 验证成功
- 启动所有容器
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将数据同步到其他数据库
前提条件
- mysql开启Binlog,并且为ROW模式
- 使用canal连接MySQL的用户需要拥有对应的从站等权限
- 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
最后
以上就是淡然摩托为你收集整理的DockerCompose方式部署CanalCanal的全部内容,希望文章能够帮你解决DockerCompose方式部署CanalCanal所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复