前言
大家好,我是小郭,在前面的文章中,我们在Docker下安装了MySQL和MySQL的主备,最近在工作中遇到了需求,主要是为了完成对Binlog日志的监听和消费,做了一些数据同步的技术选型,最后选择了Canal。
一、Canal什么,它主要是干什么的
从官网上,我们直接引用他们的图,来了解一下Canal
主要的作用: MySQL数据库Binlog解析
网络异常,图片无法展示
|
主要的应用场景:
- 数据库镜像
- 数据库实时备份
- 索引构建和实时维护(拆分异构索引、倒排索引等)
- 业务 cache 刷新
- 带业务逻辑的增量数据处理
二、Canal工作原理
原理:是基于二进制日志(binlog)进行数据增量同步。
- 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议。
- master 收到 dump 请求,开始推送 binary log 给 slave。
- canal 解析 binary log 对象。
看完这个原理是不是感觉和主备搭建的时候,感觉很相似,没错的,他们的原理是一样的,都是等待主机发送binlog日志文件,然后对文件进行解析。
三、在Docker下搭建Canal
我们在之间的文章中已经在Docker中搭建了一个3306的数据环境,为了满足Canal的需要。
接下来,我们在搭建一个Canal。
- 下载对应版本,启动pull下来的镜像
docker pull canal/canal-server
- 进入容器
docker exec -it canal bash
- 将文件替换到外部
可以选择在服务器上一个位置,将主要的两个配置文件canal.properties和instance.properties复制过去
docker cp canal:/home/admin/canal-server/conf/canal.properties /home/canal
docker cp canal:/home/admin/canal-server/conf/example/instance.properties /home/canal
- 重新加载镜像 注意:这里的配置文件需要映射,docker里面的文件
docker run --name canal -p 11111:11111 -v /home/canal/instance.properties:/home/admin/canal-server/conf/example/instance.properties -v /home/canal/canal.properties:/home/admin/canal-server/conf/canal -d canal/canal-server
- 修改配置
# 设置serverd,一般设置为IP,同一局域网内注意要唯一,如果相同,则它们之间不能设定为主备关系 canal.instance.mysql.slaveId=23 # 数据地址 canal.instance.master.address = xxx
这里需要创建canal用户的账号,步骤与搭建主备的方法一致,这里就不在重复了
# 创建的账号 canal.instance.dbUsername=canal canal.instance.dbPassword=canal
四、docker环境下安装admin
- 拉取 canal-admin
docker pull canal/canal-admin:v1.1.5
- 也可以下载canal-admin脚本
wget https://raw.githubusercontent.com/alibaba/canal/master/docker/run_admin.sh
- 可以使用docker启动,也可以使用脚本启动
sh run_admin.sh -e server.port=8089 \ -e spring.datasource.address=xxx \ -e spring.datasource.database=xx \ -e spring.datasource.username=xx \ -e spring.datasource.password=xx
或者
docker run -d -it -h 127.0.0.1 -e server.port=8089 -e canal.adminUser=admin -e canal.adminPasswd=admin -e spring.datasource.address=:3306 -e spring.datasource.database= canal_manager -e spring.datasource.username= canal -e spring.datasource.password= canal --name=canal-admin -p 8089:8089 -m 1024m canal/canal-admin
- 默认账号密码: admin/123456
三个步骤,就可以完成admin的搭建,也是官方为我们提供的管理工具。
了解canal-server架构
canal-server主要是由server,instance组成
- 每个Instance对应于一个数据队列
- 每个server代表一个canal-server运行实例jvm
- 每个server上可以运行一个或多个Instance; 在实际的使用中,通常我们一个任务就是一个Instance
Instance的主要组件
- EventParser :数据源接入,模拟MySQL slave协议从master上dump binlog,并进行解析
- EventSink :对dump的数据进行过滤、加工、分发,连接Parser和Store
用来把多个instance上的数据进行归并 - EventStore :对sink模块处理后的数据进行临时存储
利用RingBuffer来进行点位记录,只为一个消费者维护信息 - MetaManager:元数据管理器
HA机制设计
网络异常,图片无法展示
|
实战中遇到的异常问题
- Canal报错:Could not find first log file name in binary log index file
错误原因:与主机的Binlog文件,记录的位置不一致
解决方案:需删除example下的meta.dat文件,再重新启动
思考问题
- Canal在同一时间产生大量的数据,如何处理?
- 有没有可能出现数据丢失或者重复消费的情况?
文章有限,我们下一篇再展开说说
总结
今天的文章,主要介绍了Canal的搭建和原理,有利于我们后面学习和使用,
也可以看到Canal的机制其实是很简单的,我们可以了理解为伪装的salve节点,但是在数据处理上还有一些瑕疵,需要我们手动去处理。
最后一图总结
网络异常,图片无法展示
|