Canal原理及源码剖析

拥有回忆 提交于 2019-12-02 06:18:16

canal原理

MySQL主备复制原理

  • MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可以通过 show binlog events 进行查看)
  • MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)
  • MySQL slave 重放 relay log 中事件,将数据变更反映到自己的数据

canal 工作原理

  • canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议
  • MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal server)
  • canal 解析 binary log 对象(原始为 byte 流)
  • 整个处理过程,数据转换如下:
    1. binlog (Mysql)
    2. LogBuffer
    3. LogEvent
    4. CanalEntry
    5. Message
    6. Dml

canal应用

mysql

  • mysql主备原理

  • 当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x。详情

  • mysql 相关配置说明

    • mysql配置
    # sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
    [mysqld]
    log-bin=mysql-bin # 开启 binlog
    binlog-format=ROW # 选择 ROW 模式
    server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
    
    • 新建用户
    CREATE USER canal IDENTIFIED BY 'canal'; # or password canal123456
    GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
    -- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
    FLUSH PRIVILEGES;
    
  • 注意

    • 针对阿里云 RDS for MySQL , 默认打开了 binlog , 并且账号默认具有 binlog dump 权限 , 不需要任何权限或者 binlog 设置,可以直接跳过这一步
    • 阿里云 mysql 5.6 只读实例 binlog是精简过的,binlog无法使用,方案不可用。

canal server 主要配置

  • deployer/src/main/resources/canal.properties
# tcp, kafka, RocketMQ
# 如果是 kafka 或者 RocketMQ,还需要配置其他 canal.mq 参数
canal.serverMode = tcp
  • deployer/src/main/resources/example/instance.properties
canal.instance.master.address=127.0.0.1:3306
canal.instance.dbUsername = canal
canal.instance.dbPassword = canal

client-adapter

  • client-adapter/launcher/src/main/resources/application.yml
canal.conf.mode: tcp
canal.conf.canalServerHost: 127.0.0.1:11111

how to debug

client-adapter 是通过 SPI 插件技术实现EShbaseOuterAdapter 功能。所以,在调试 client-adapter/launcher 之前,先要执行 mvn clean install -Dmaven.test.skip -Denv=dev,该命令会生成相关插件并把相关插件复制到 client-adapter/launcher/target 相关目录。ES插件的相关配置文件可能不会被复制到 target/classes 下,如果不在,就手动复制。具体操作实例如下:

# cd  $CANAL_HOME
mvn clean install -Dmaven.test.skip -Denv=release
mvn clean install -Dmaven.test.skip -Denv=dev

cp  client-adapter/elasticsearch/target/classes/es/*    client-adapter/launcher/target/class/es/* 

canal源码剖析

canal server UML

在这里插入图片描述

  • CanalServerWithEmbeded: 负责从Mysql数据库获得变更
  • CanalServerWithNetty: 负责通知变更给 Canal Client
  • AbstractEventParser: 最大化共用mysql, oracle binlog解析代码,开源Canal中不包含具体Oracle解析功能
  • MysqlConnection: 继承自ErosaConnection, 是模拟Mysql Slave,读取binlog的核心代码,具体见函数 connect 和 dump 函数
  • SessionHandler: 当变更是通过TCP方式传输时,利用netty异步网络框架与Canal Client通信,发送的消息是 Message

canal client adapter UML

在这里插入图片描述

  • SimpleCanalConnector:TCP通信方式下,从Canal Server获得数据库并以Message,提供给消费方
  • OuterAdapter: 消费Message的基类,派生类有:ESAdapter, LoggerAdapter, UrlAdapterMQAdapter 等等
  • AbstractCanalAdapterWorker: Adapter消费Dml(由Message转化而来)核心代码在该类
  • AbstractOuterAdapter: 核心函数 initSyncConfig, 解析同步配置文件
  • XXXXAdapter:待优化的方向,收到Dml,进入各自任务MQ,简化处理出错或异常情况

相关资源

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!