上周测试了一把Canal 搭建和简单的功能测试,今天继续搞。
Canal同步的基本原理:
canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送 dump 协议
MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
canal 解析 binary log 对象(原始为 byte 流)
类似下面:

以下参考自管理手册:
https://github.com/alibaba/canal/wiki/AdminGuide
配置文件
# properties配置分为两部分:
canal.properties (系统根配置文件)
instance.properties (instance级别的配置文件,每个instance一份)
# 对应关系:
1. canal.properties中的配置canal.destinations后,要对应在canal.conf.dir目录下建立同名文件
比如:
canal.destinations = example,mysql171
要创建example和mysql171两个目录,每个目录里各自有一份instance.properties. 内容可参考conf/example下的自带那个。
2. 如果canal.properties未定义instance列表,但开启了canal.auto.scan
server第一次启动时,会自动扫描conf目录下,将文件名做为instance name,启动对应的instance
server运行过程中,会根据canal.auto.scan.interval定义的频率,进行扫描
1. 发现目录有新增,启动新的instance
2. 发现目录有删除,关闭老的instance
3. 发现对应目录的instance.properties有变化,重启instance
3. 本次测试的conf目录内容:
[root@zabbix conf]# pwd/caihao/canal-server/conf[root@zabbix conf]# ls -l总用量 24-rwxrwxr-x 1 root root 292 11月 4 10:42 canal_local.properties ##系统配置drwxrwxrwx 2 root root 47 11月 5 18:45 example ## 默认的instance配置-rwxrwxrwx 1 root root 3119 9月 2 14:53 logback.xml ## 日志文件drwxrwxrwx 2 root root 38 11月 4 10:39 metricsdrwxr-xr-x 2 root root 36 11月 6 13:51 mysql171 ## 自定义instance配置drwxrwxrwx 3 root root 143 11月 4 10:39 spring ## spring instance
# canal.properties参数列表:
1. instance列表定义
(当前server上有多少个instance,每个instance的加载方式等)
| 参数名字 | 参数说明 | 默认值 |
| canal.destinations | 当前server上部署的instance列表 | 无 |
| canal.conf.dir | conf/目录所在的路径 | ../conf |
| canal.auto.scan.interval | instance自动扫描的间隔时间,单位秒 | 5 |
2. common参数定义
比如可以将instance.properties的公用参数,抽取放置到这里,这样每个instance启动的时候就可以共享. 【instance.properties配置定义优先级高于canal.properties】
| 参数名字 | 参数说明 | 默认值 |
| canal.ip | canal server绑定的本地IP信息,如果不配置,默认选择一个本机IP进行启动服务 | 无 |
| canal.register.ip | canal server注册到外部zookeeper、admin的ip信息 (针对docker的外部可见ip) | 无 |
| canal.port | canal server提供socket服务的端口 | 11111 |
| canal.zkServers | canal server链接zookeeper集群的链接信息 例子:10.20.144.22:2181,10.20.144.51:2181 | 无 |
| canal.zookeeper.flush.period | canal持久化数据到zookeeper上的更新频率,单位毫秒 | 1000 |
| canal.instance.memory.batch.mode | canal内存store中数据缓存模式 1. ITEMSIZE : 根据buffer.size进行限制,只限制记录的数量 2. MEMSIZE : 根据buffer.size * buffer.memunit的大小,限制缓存记录的大小 | MEMSIZE |
| canal.instance.memory.buffer.size | canal内存store中可缓存buffer记录数,需要为2的指数 | 16384 |
| canal.instance.memory.buffer.memunit | 内存记录的单位大小,默认1KB,和buffer.size组合决定最终的内存使用大小 | 1024 |
| canal.instance.transactionn.size | 最大事务完整解析的长度支持 超过该长度后,一个事务可能会被拆分成多次提交到canal store中,无法保证事务的完整可见性 | 1024 |
| canal.instance.fallbackIntervalInSeconds | canal发生mysql切换时,在新的mysql库上查找binlog时需要往前查找的时间,单位秒 说明:mysql主备库可能存在解析延迟或者时钟不统一,需要回退一段时间,保证数据不丢 | 60 |
| canal.instance.filter.query.dcl | 是否忽略dcl语句 | false |
| canal.instance.filter.query.dml | 是否忽略dml语句 (mysql5.6之后,在row模式下每条DML语句也会记录SQL到binlog中,可参考MySQL文档) | false |
| canal.instance.filter.query.ddl | 是否忽略ddl语句 | false |
| canal.instance.filter.table.error | 是否忽略binlog表结构获取失败的异常 (主要解决回溯binlog时,对应表已被删除或者表结构和binlog不一致的情况) | false |
| canal.instance.filter.rows | 是否dml的数据变更事件 (主要针对用户只订阅ddl/dcl的操作) | false |
| canal.instance.binlog.format | 支持的binlog format格式列表 (otter会有支持format格式限制) | ROW,STATEMENT,MIXED |
| canal.instance.binlog.image | 支持的binlog image格式列表 (otter会有支持format格式限制) | FULL,MINIMAL,NOBLOB |
| canal.instance.parser.parallel | 是否开启binlog并行解析模式 (串行解析资源占用少,但性能有瓶颈, 并行解析可以提升近2.5倍+) | true |
| canal.instance.parser.parallelBufferSize | binlog并行解析的异步ringbuffer队列 (必须为2的指数) | 256 |
| canal.admin.manager | canal链接canal-admin的地址 (v1.1.4新增) | 无 |
| canal.admin.port | admin管理指令链接端口 (v1.1.4新增) | 11110 |
| canal.admin.user | admin管理指令链接的ACL配置 (v1.1.4新增) | admin |
| canal.admin.passwd | admin管理指令链接的ACL配置 (v1.1.4新增) | 密码默认值为admin的密文 |
| canal.user | canal数据端口订阅的ACL配置 (v1.1.4新增) 如果为空,代表不开启 | 无 |
| canal.passwd | canal数据端口订阅的ACL配置 (v1.1.4新增) 如果为空,代表不开启 | 无 |
# instance.properties参数列表:
| 参数名字 | 参数说明 | 默认值 |
| canal.instance.mysql.slaveId | mysql集群配置中的serverId概念,需要保证和当前mysql集群中id唯一 (v1.1.x版本之后canal会自动生成,不需要手工指定) | 无 |
| canal.instance.master.address | mysql主库链接地址 | 127.0.0.1:3306 |
| canal.instance.master.journal.name | mysql主库链接时起始的binlog文件 | 无 |
| canal.instance.master.position | mysql主库链接时起始的binlog偏移量 | 无 |
| canal.instance.master.timestamp | mysql主库链接时起始的binlog的时间戳 | 无 |
| canal.instance.gtidon | 是否启用mysql gtid的订阅模式 | false |
| canal.instance.master.gtid | mysql主库链接时对应的gtid位点 | 无 |
| canal.instance.dbUsername | mysql数据库帐号 | canal |
| canal.instance.dbPassword | mysql数据库密码 | canal |
| canal.instance.defaultDatabaseName | mysql链接时默认schema | |
| canal.instance.connectionCharset | mysql 数据解析编码 | UTF-8 |
| canal.instance.filter.regex | mysql 数据解析关注的表,Perl正则表达式. 多个正则之间以逗号(,)分隔,转义符需要双斜杠(\\)
1. 所有表:.* or .*\\..* 5. 多个规则组合使用:canal\\..*,mysql.test1,mysql.test2 (逗号分隔) | .*\\..* |
| canal.instance.filter.black.regex | mysql 数据解析表的黑名单,表达式规则见白名单的规则 | 无 |
| canal.instance.rds.instanceId | aliyun rds对应的实例id信息 (如果不需要在本地binlog超过18小时被清理后自动下载oss上的binlog,可以忽略该值) | 无 |
几个参数说明:
1. mysql链接时的起始位置
canal.instance.master.journal.name + canal.instance.master.position : 精确指定一个binlog位点,进行启动
canal.instance.master.timestamp : 指定一个时间戳,canal会自动遍历mysql binlog,找到对应时间戳的binlog位点后,进行启动
不指定任何信息:默认从当前数据库的位点,进行启动。(show master status)
2. mysql解析关注表定义
标准的Perl正则,注意转义时需要双斜杠:\\
3. mysql链接的编码
目前canal版本仅支持一个数据库只有一种编码,如果一个库存在多个编码,需要通过filter.regex配置,将其拆分为多个canal instance,为每个instance指定不同的编码
监控
Canal可以使用prometheus进行监控。在配置canal-server时,文件canal.properties中有一个提供给prometheus的端口配置:canal.metrics.pull.port,默认是11112。
通过浏览器可直接看到指标的值
http://10.7.70.49:11112/
通过grafana展示监控,甚至模板都已经准备好了。
prometheus安装步骤就略过了。这里我们直接使用PMM里自带的prometheus来部署。
1. 进入运行pmm-server的容器:
docker exec -it pmm-server bin/bash
2. 修改配置文件,加入:
vi etc/prometheus.yml
- job_name: 'canal'static_configs:- targets: ['10.7.70.49:11112']
3. 配置生效:
curl -XPOST http://127.0.0.1:9090/prometheus/-/reload
退出容器
4. 导入模板:

模板内容:
https://raw.githubusercontent.com/alibaba/canal/master/deployer/src/main/resources/metrics/Canal_instances_tmpl.json

数据来源选择prometheus

模板导入后,可以在仪表盘中找到

监控面板就是这个样的


同步数据性能测试
仍然是用sb来做单表插入的测试:大概1万3每秒

主库(双1):单表插入 13K的TPS

原生复制的从库(双1):2.2K的TPS

Canal同步的库(memsql):4.3K的TPS

计算下 (1031227-626471)/93 = 4352

这起码可以说明Canal在SQL的同步和解析上是完全不输原生复制的。
以下是官方提供的测试报告,看看就得:

完





