暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Canal的配置管理、监控与性能测试

万能修实验室 2021-07-14
5879


上周测试了一把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 115 18:45 example ## 默认的instance配置
    -rwxrwxrwx 1 root root 3119 92 14:53 logback.xml ## 日志文件
    drwxrwxrwx 2 root root 38 114 10:39 metrics
    drwxr-xr-x 2 root root 36 116 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.dirconf/目录所在的路径../conf
    canal.auto.scan.intervalinstance自动扫描的间隔时间,单位秒5


    2.  common参数定义
    比如可以将instance.properties的公用参数,抽取放置到这里,这样每个instance启动的时候就可以共享.  【instance.properties配置定义优先级高于canal.properties】

    参数名字参数说明默认值
    canal.ipcanal server绑定的本地IP信息,如果不配置,默认选择一个本机IP进行启动服务
    canal.register.ipcanal server注册到外部zookeeper、admin的ip信息 (针对docker的外部可见ip)
    canal.portcanal server提供socket服务的端口11111
    canal.zkServerscanal server链接zookeeper集群的链接信息
    例子:10.20.144.22:2181,10.20.144.51:2181
    canal.zookeeper.flush.periodcanal持久化数据到zookeeper上的更新频率,单位毫秒1000
    canal.instance.memory.batch.modecanal内存store中数据缓存模式
    1. ITEMSIZE : 根据buffer.size进行限制,只限制记录的数量
    2. MEMSIZE : 根据buffer.size  * buffer.memunit的大小,限制缓存记录的大小
    MEMSIZE
    canal.instance.memory.buffer.sizecanal内存store中可缓存buffer记录数,需要为2的指数16384
    canal.instance.memory.buffer.memunit内存记录的单位大小,默认1KB,和buffer.size组合决定最终的内存使用大小1024
    canal.instance.transactionn.size最大事务完整解析的长度支持
    超过该长度后,一个事务可能会被拆分成多次提交到canal store中,无法保证事务的完整可见性
    1024
    canal.instance.fallbackIntervalInSecondscanal发生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.parallelBufferSizebinlog并行解析的异步ringbuffer队列
    (必须为2的指数)

    256

    canal.admin.managercanal链接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.slaveIdmysql集群配置中的serverId概念,需要保证和当前mysql集群中id唯一
    (v1.1.x版本之后canal会自动生成,不需要手工指定)
    canal.instance.master.addressmysql主库链接地址127.0.0.1:3306
    canal.instance.master.journal.namemysql主库链接时起始的binlog文件
    canal.instance.master.positionmysql主库链接时起始的binlog偏移量
    canal.instance.master.timestampmysql主库链接时起始的binlog的时间戳
    canal.instance.gtidon是否启用mysql gtid的订阅模式false
    canal.instance.master.gtidmysql主库链接时对应的gtid位点
    canal.instance.dbUsernamemysql数据库帐号canal
    canal.instance.dbPasswordmysql数据库密码canal
    canal.instance.defaultDatabaseNamemysql链接时默认schema
    canal.instance.connectionCharsetmysql 数据解析编码UTF-8
    canal.instance.filter.regex

    mysql 数据解析关注的表,Perl正则表达式.

    多个正则之间以逗号(,)分隔,转义符需要双斜杠(\\)


    常见例子:

    1.  所有表:.*   or  .*\\..*
    2.  canal schema下所有表:canal\\..*
    3.  canal下的以canal打头的表:
    如 canal\\.canal.*

    4.  canal schema下的一张表:canal\\.test1

    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的同步和解析上是完全不输原生复制的。

               

              以下是官方提供的测试报告,看看就得:




               




              文章转载自万能修实验室,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论