Canal的安装与部署

本文详细介绍Canal数据同步工具的环境要求、安装部署、单节点与高可用模式配置、MySQL多节点解析设置等核心内容,助您快速掌握Canal的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、环境要求

1.1 操作系统

  • Canal 是由 Java 开发,Windows/Linux 均可支持。
  • 不同的 Canal 版本所需的 JDK 版本亦不同,下表展示了它们之间关系。
    CanalJDK
    1.1.41.8
    1.1.0 ~ 1.1.31.7
    1.0.19 ~ 1.0.251.6

1.2 MySQL 要求

  • 目前 Canal 已支持 MySQL 5.7.13/5.6.10 及以下的版本,MariaDB 5.5.35 和 10.0.7(理论上可支持以下版本)。

  • Canal 的原理是基于 MySQL binlog 复制技术,所以这里一定需要开启 MySQL 的 binlog 写入功能,建议配置 binlog 模式为 row(ps. 目前 Canal 已经支持 mixed/statement/row 模式) 。配置 my.cnf

      [mysql]
      log-bin=mysql-bin #添加这一行就 ok   
      binlog-format=ROW #选择 row 模式    
      server_id=1       #配置 mysql replaction 需要定义,不能和canal的slaveId重复
    

     可在 mysql 控制台通过执行下述命令查看变更结果。

    show variables like 'binlog_format%'
    
  • Canal 的原理是把自己模拟成 MySQL Slave,所以这里一定需要为 canal 使用的用户在数据库赋相关权限。

    CREATE USER canal IDENTIFIED BY 'canal';
    GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';    
    -- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;    
    FLUSH PRIVILEGES;
    

     针对已有的账户,可通过 grants 查询权限:

    show grants for 'canal';
    

二、获取发布包

 发布包可直接在 Canal 的官方社区下载,当前最新版本为:canal.deployer-1.1.4.tar.gz

2.1 下载安装包

 通常情况下,社区每发布一个版本,都会将把发布的版本程序封装成安装包,访问 https://github.com/alibaba/canal/releases 会列出所有发布的历史版本安装包。以 1.1.4 版本为例:

canal.adapter-1.1.4.tar.gz    # 全组件安装包
canal.admin-1.1.4.tar.gz      # 管理端安装包
canal.deployer-1.1.4.tar.gz   # server安装包
canal.example-1.1.4.tar.gz    # 客户端示例程序
Source code(zip)              # zip 压缩方式的源码
Source code(tar.gz)           # tar.gz 压缩方式的源码          

2.2 自行编译

 该方式需要编程工具 IDE 、git 的支持,请具备一定 Java 编程基础并热衷源码研究的人采用此方式。如下仅简略描述一下关键步骤。

git clone https://github.com/alibaba/canal.git
git checkout canal-$version # 切换到对应的版本上
mvn clean install -Denv=release # 在deployer目录下执行

 执行完成后,会在 deployer 模块下生成一个 target 目录,里面会包含一个:canal.deployer-$version.tar.gz。

三、创建用户及配置环境变量

创建用户和配置环境变量其实是可选项,读者可忽略该小节。只是笔者惯于将各不同的服务进行环境隔离,以降低误操作的可能性。

  1. 创建用户
     最好不要直接使用 root 用户,当然用 root 也是可以的,只是生产环境没人这么干,太危险了。如果你不知道怎么取名, 就跟我一样用 canal 这个用户吧。请使用拥有 root 权限的用户执行下述命令:

    useradd canal  # 创建名为 canal 的用户
    passwd canal   # 修改 canal 用户的密码
    
  2. 创建 canal 服务的安装根目录
     Canal 服务的安装目录其实也可以自行定义,只是笔者惯于将数据文件夹放到 /data 下面,程序文件夹放到 /usr/local 下面。请使用拥有 root 权限的用户执行下述命令:

    mkdir /usr/local/canal             # 创建canal安装目录
    chown canal:canal /usr/local/canal # 更改目录所有者
    
  3. 配置环境变量
     环境变量其实也是可选配置项,如果不配置,则每次操作 canal 服务时,需要追加绝对路径,为了后续操作的便利性,所以此处为其配置环境变量。

    vi /home/canal/.bashrc
    

     把下述信息追加到文本中。

     export CANAL_HOME=/usr/local/canal
     export PATH=$PATH:$CANAL_HOME/bin
    

    注意:CANAL_HOME 的值为 canal 的安装根目录,若你未将程序放在 /usr/local/canal 目录下,请将该值调整为你的实际目录。

     使用:wq保存退出后,再用下述命令让配置生效。

    source /home/canal/.bashrc
    

四、单节点模式部署

从此小节开始至文末,请皆使用 canal 用户操作。

  1. 上传、解压
     先把 Canal 安装包上传至指定服务器上(具体命令略),再将安装包解压到 /usr/local/canal 目录中。

    tar -zxvf canal.deployer-1.1.4.tar.gz -C /usr/local/canal
    

     解压完成之后,进入 /usr/local/canal 目录,可以看到如下结构:

     drwxrwxr-x. 2 canal canal 4096 May 30 12:27 bin
     drwxrwxr-x. 6 canal canal 4096 May 30 12:27 conf
     drwxrwxr-x. 2 canal canal 4096 May  6 12:27 lib
     drwxrwxr-x. 9 canal canal 4096 May 30 12:27 logs
    
  2. 修改配置
     进入到 canal 的安装目录 /usr/local/canal 下,编辑打开 instance 名为 example 的配置文件:

    vi conf/example/instance.properties
    

    example 仅是为 instance 起的一个别名,该名称可自定义;当需要定义多个 instance 时,可参考 conf/example 文件夹的范式,在相同的目录下复制多个与 conf/example 仅名称不同的文件夹,且文件夹里的文件也应相同。再把 instance 名称(即刚创建的文件夹名)追加到 conf/canal.properties 文件的 canal.destinations 属性值中,多个值之间以英文半角的逗号分隔。

     仅需要修改如下 3 个属性值,为 canal 指定需要同步数据的目标数据库的连接信息即可:

     canal.instance.master.address=127.0.0.1:3306
     canal.instance.dbUsername=root
     canal.instance.dbPassword=123456
    

    如果你定义了多个目标库,请为每个目标库修改其对应的连接信息。

  3. 启动或停止
     如果已经成功配置了环境变量信息,则可在任意目录下执行下述命令启动或停止 canal 服务。

    startup.sh # 启动
    stop.sh    # 停止
    
  4. 验证启动状态

    tail -f log/canal/canal.log  # 查阅服务的日志信息
    
     2020-06-02 11:26:13.159 [main] INFO com.alibaba.otter.canal.deployer.CanalLauncher - ## set default uncaught exception handler
     2020-06-02 11:26:13.206 [main] INFO com.alibaba.otter.canal.deployer.CanalLauncher - ## load canal configurations
     2020-06-02 11:26:13.220 [main] INFO com.alibaba.otter.canal.deployer.CanalStarter - ## start the canal server.
     2020-06-02 11:26:13.263 [main] INFO com.alibaba.otter.canal.deployer.CanalController - ## start the canal server[127.0.0.1(127.0.0.1):11111]
     2020-06-02 11:26:13.264 [main] INFO com.alibaba.otter.canal.deployer.CanalLauncher - ## the canal server is running now ......  
    

     日志中显示类似于如上信息,则表示 canal 服务启动成功。

    tail -f log/example/example.log  # 查阅instance日志
    
     2020-06-02 11:37:18.102 [main] INFO c.a.o.c.i.spring.support.PropertyPlaceholderConfigurer - Loading properties file from class path resource [canal.properties]
     2020-06-02 11:37:18.105 [main] INFO c.a.o.c.i.spring.support.PropertyPlaceholderConfigurer - Loading properties file from class path resource [example/instance.properties]
     2020-06-02 11:37:18.301 [main] INFO c.a.o.c.i.spring.support.PropertyPlaceholderConfigurer - Loading properties file from class path resource [canal.properties]
     2020-06-02 11:37:18.301 [main] INFO c.a.o.c.i.spring.support.PropertyPlaceholderConfigurer - Loading properties file from class path resource [example/instance.properties]
     2020-06-02 11:37:18.697 [main] INFO c.a.otter.canal.instance.spring.CanalInstanceWithSpring - start CannalInstance for 1-example 
     2020-06-02 11:37:18.713 [main] INFO c.a.otter.canal.instance.core.AbstractCanalInstance - start successful....
    

     日志中显示类似于如上信息,则表示 canal 的 instance 启动成功。

五、高可用(HA)模式部署

  1. 角色规划

    角色机器
    Canal Server158.220.71.138、158.220.71.139
    ZooKeeper158.222.189.90
    MySQL158.222.188.206
  2. 配置
     本文仅以 instance 名称为 example 示例。

    • conf/canal.properties
       请参照下述示例为 canal 指定 binlog 位置信息存储方式为 zooKeeper。

        canal.zkServers=158.222.189.90:2181  # 指定zookeeper服务地址
        canal.instance.global.spring.xml = classpath:spring/default-instance.xml
      

       Canal 默认的 binlog 位置信息存储方式是本地文件,此处为了实现高可用,需要将其变更为 zookeeper 方式,即将 canal.instance.global.spring.xml 的属性值变更为 classpath:spring/default-instance.xml

    • conf/example/instance.properties

        canal.instance.mysql.slaveId = 1234   # 取值范围为正整数,需保证各slaveId不重复即可
        canal.instance.master.address = 158.222.188.206:3306
      

      注意:两个 canal 服务的配置信息,唯一不同的地方仅是 slaveId。

  3. 启动
     在两台机器上分别使用startup.sh命令启动 canal 服务。通过查看 zookeeper 中的节点信息,可获知当前工作的节点。

    [zk: localhost:2181(CONNECTED) 1] get /otter/canal/destinations/example/running
    {"active":true,"address":"158.220.71.138:11111","cid":1}
    

     当前工作的节点是:158.220.71.138:11111。

  4. 连接客户端
     客户端可以直接指定 zookeeper 地址和 instance name,其会自动从 zookeeper 中的 running 节点,获取当前正在提供服务的节点信息,然后与其建立连接:

    CanalConnector connector = CanalConnectors.newClusterConnector("158.222.189.90:2181", "example", "", "");
    

     连接成功后,canal server 会记录当前正在提供服务的 canal client 信息,比如客户端 ip,连接的端口信息等(聪明的你,应该也可以发现,canal client 也可以支持 HA 功能)。

    [zk: localhost:2181(CONNECTED) 2] get /otter/canal/destinations/example/1001/running
    {"active":true,"address":"158.220.142.204:50544","clientId":1001}
    

     数据消费成功后,canal server 会在 zookeeper 中记录下当前最后一次消费成功的 binlog 位点(下次你重启 client 时,会从这最后一个位点继续进行消费)。

    [zk: localhost:2181(CONNECTED) 3] get /otter/canal/destinations/example/1001/cursor
    {"@type":"com.alibaba.otter.canal.protocol.position.LogPosition","identity":{"slaveId":-1,"sourceAddress":{"address":"158.222.188.206","port":3306}},"postion":{"included":false,"journalName":"mysql-bin.002253","position":2574756,"timestamp":1363688722000}}
    
  5. 触发切换
     正常情况下触发 canal server 主备切换的有如下两种方式:

    • 正常关闭:通过在正在运行 158.220.71.38 机器上执行stop.sh命令停止 canal server,则会释放 instance 的所有资源,包括删除 running 节点。

    • 平滑切换:在 zk 中更新对应 instance 的 running 节点内容,将"active"设置为 false,对应的 running 节点收到消息后,会主动释放 running 节点,让出控制权但自己的 JVM 不退出。可在 zookeeper 查到的信息为:

        {"active":false,"address":"158.220.71.138:11111","cid":1}
      

     当位于 158.220.71.139 节点上处于 stanby 状态的 canal server 监测到的该状态变化,或 running 节点不存在时,会立马启动 example instance,提供新的服务。

    [zk: localhost:2181(CONNECTED) 4] get /otter/canal/destinations/example/running
    {"active":true,"address":"158.220.71.139:11111","cid":1}
    

     与此同时,客户端也会随着 canal server 的切换,通过获取 zookeeper 中的最新地址,与新的 canal server 建立链接,继续消费数据,整个过程自动完成。

六、MySQL 多节点解析配置

  1. MySQL 机器准备
     准备两个 MySQL 服务,配置为 M-M 模式。本文的 MySQL 示例 IP 和 port 地址为:158.220.71.140:3306、158.222.71.141:3306。

     [mysqld]
     log_slave_updates=true # 这个配置一定要打开
    
  2. 修改配置
     参照下述内容修改 conf/canal.properties 文件中的配置信息:

     # position info
     canal.instance.master.address = 158.220.71.140:3306
     canal.instance.standby.address = 158.220.71.141:3306
    
     # 需要开启心跳检查
     canal.instance.detecting.enable = true 
     # 心跳检查SQL,也可以选择类似 select 1 的查询语句
     canal.instance.detecting.sql = insert into retl.xdual values(1,now()) on duplicate key update x=now() 
     # 心跳检查频率
     canal.instance.detecting.interval.time = 3
     # 心跳检查失败次数阈值,超过该阈值后会触发 MySQL 连接切换,比如切换到 standby 机器上继续解析 binlog
     canal.instance.detecting.retry.threshold = 3
     # 心跳检查超过失败次数阀值后,是否开启 master/standby 的切换
     canal.instance.detecting.heartbeatHaEnable = true
    

    注意

    • 填写 master/standby 的地址,当前仅支持配置一个 standby。
    • 发生 master/standby 的切换的条件:(heartbeatHaEnable = true) && (失败次数>=retry.threshold)。
    • 多引入一个 heartbeatHaEnable 的考虑:开启心跳 sql 有时候是为 client 检测 canal server 是否正常工作,如果定时收到了心跳语句,那说明整个 canal server 工作正常。
  3. 启动 & 测试
     关闭一台机器的 MySQL,在经历大概 interval.time * retry.threshold 时间后,就会切换到 standby 机器上。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值