linux环境canal实现mysql两库的数据同步

1、系列介绍

canal是基于mysql数据库增量日志解析工具,提供增量数据订阅&消费。本系列将部署三个服务。分别为:

  • canal-deployer。对mysql binlog进行监听的服务。(另一个称呼是:canal-server)
  • canal-adapter。客户端数据落地的适配及启动服务,可用于同步数据。
  • canal-admin。提供相对友好的WebUI操作界面,方便更多用户快速和安全的操作。(本模块非必须)

2、canal-deployer有关操作

canal-deployer的作用是监听源MySQL的binlog,从中获取到有关源数据库的操作信息

1、检查源数据库配置

需要检查一下源数据库binlog是否开启(开启为ON),binlog-format模式是否为ROW。

SHOW VARIABLES WHERE variable_name LIKE 'log_bin' OR variable_name LIKE 'binlog_format';

image-20250609145752319

如果不是如上配置,需要修改mysql配置,在[mysqld]加上如下配置。

[mysqld]
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复

授权 canal 链接 MySQL 账号具有作为 MySQL slave 的权限。如果已有账户可直接 grant。如果是root可直接跳过这一步。

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

2、下载与解压

下载完成后上传至服务器并解压。

cd /usr/local/src
wget https://mirrors.chenby.cn/https://github.com/alibaba/canal/releases/download/canal-1.1.8/canal.deployer-1.1.8.tar.gz
mkdir canal.deployer
tar -zxv -f canal.deployer-1.1.8.tar.gz -C /usr/local/src/canal.deployer

下载适配数据库版本的连接器

wget https://cdn.mysql.com/archives/mysql-connector-java-8.0/mysql-connector-java-8.0.25.tar.gz
解压缩后把mysql-connector-java-8.0.25.jar文件上传到canal.deployer的lib目录下,替换掉低版本的
mv mysql-connector-java-8.0.25.jar canal.deployer/lib
mv canal.deployer/lib/mysql-connector-java-5.1.48.jar canal.deployer/lib/mysql-connector-java-5.1.48.jar.bak

3、修改配置文件

如果不是新部署的mysql和数据库,需要查一下mysql主库最新的binlog文件位置名称和mysql主库链接时起始的binlog偏移量。

show master status;

image-20250609150128024

修改如下配置文件/usr/local/src/canal.deployer/conf/example/instance.properties

# 不要和源数据库中的server_id一样
canal.instance.mysql.slaveId=5555

# 需要改成自己的源数据库信息
canal.instance.master.address=XX.XX.XX.XX:3306
# mysql主库的最新binlog文件位置名称
canal.instance.master.journal.name=mysql-bin.000072
# mysql主库链接时起始的binlog偏移量
canal.instance.master.position=673943695

# 需要改成自己的源数据库信息
canal.instance.dbUsername=root
canal.instance.dbPassword=123456

# table regex .*\\..*表示监听所有表 也可以写具体的表名,用,隔开
canal.instance.filter.regex=pm_dev2.0.pm_project_info,pm_dev2.0.pm_requirement_info
# mysql 数据解析表的黑名单,多个表用,隔开
canal.instance.filter.black.regex=mysql\\.slave_.*

4、启动并查看日志

启动deployer

cd /usr/local/src/canal.deployer
# 启动
bash bin/startup.sh
# 查看 server 日志
tail -n 30 logs/canal/canal.log
# 查看 instance 的日志
tail -n 30 logs/example/example.log

5、配置开机自启动

vim /etc/systemd/system/canal_deployer.service

[Unit]
Description=My Custom Canal deployer Service

[Service]
User=root
Type=forking
WorkingDirectory=/usr/local/src/canal.deployer/bin
ExecStart=/usr/local/src/canal.deployer/bin/restart.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target

systemctl daemon-reload
systemctl enable canal_deployer.service --now

3、canal-adapter有关操作

canal-adapter的作用是从canal-deployer中获取到对源数据库的操作后,把这些操作给同步到其他目的数据库或其他服务中去。

基本说明

canal 1.1.1版本之后, 增加客户端数据落地的适配及启动功能, 目前支持功能:

  • 客户端启动器
  • 同步管理REST接口
  • 日志适配器, 作为DEMO
  • 关系型数据库的数据同步(表对表同步), ETL功能
  • HBase的数据同步(表对表同步), ETL功能
  • (后续支持) ElasticSearch多表数据同步,ETL功能

环境版本

  • 操作系统:无要求
  • java版本: jdk1.8 以上
  • canal 版本: 请下载最新的安装包,本文以当前v1.1.1 的canal.deployer-1.1.1.tar.gz为例
  • MySQL版本 :8.0.25
  • HBase版本: Apache HBase 1.1.2, 若和服务端版本不一致可自行替换客户端HBase依赖

1、下载与解压

下载完成后上传至服务器并解压。

cd /usr/local/src
wget https://mirrors.chenby.cn/https://github.com/alibaba/canal/releases/download/canal-1.1.8/canal.adapter-1.1.8.tar.gz
mkdir canal.adapter
tar -zxv -f canal.adapter-1.1.8.tar.gz -C /usr/local/src/canal.adapter

下载适配数据库版本的连接器

wget https://cdn.mysql.com/archives/mysql-connector-java-8.0/mysql-connector-java-8.0.25.tar.gz
解压缩后把mysql-connector-java-8.0.25.jar文件上传到canal.adapter的lib目录下,替换掉低版本的
mv mysql-connector-java-8.0.25.jar canal.adapter/lib
mv canal.adapter/lib/mysql-connector-java-5.1.48.jar canal.adapter/lib/mysql-connector-java-5.1.48.jar.bak

2、总配置文件 application.yml

修改如下配置文件 /usr/local/src/canal.adapter/conf/application.yml

  • 默认是监听tcp,跟canal-deployer配置文件保持一致(canal.deployer/conf/canal.properties)
  • 默认监听canal-deployer的地址和端口号,修改成实际canal-deployer使用的地址和端口号,跟canal-deployer配置文件保持一致(canal.deployer/conf/canal.properties)
  • 配置连接源数据库的账号密码信息
  • 配置连接目的数据库的账号密码信息
server:
  port: 8012
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
    default-property-inclusion: non_null

canal.conf:
  mode: tcp #tcp kafka rocketMQ rabbitMQ
  flatMessage: true
  zookeeperHosts:
  syncBatchSize: 1000
  retries: -1
  timeout:
  accessKey:
  secretKey:
  ddlSync: true  # 新增这行:开启 DDL 同步
  consumerProperties:
    # 对应单机模式下的# canal-deployer的ip:port,修改这个
    canal.tcp.server.host: XXX.XXX.XXX.XXX:11111
    # 对应集群模式下的zk地址, 如果配置了canalServerHost, 则以canalServerHost为准
    canal.tcp.zookeeper.hosts:
    canal.tcp.batch.size: 500
    canal.tcp.username:
    canal.tcp.password:
  # 配置源数据库,修改这个
  srcDataSources:
    # 自定义数据源名称
    defaultDS:
      url: jdbc:mysql://XXX.XXX.XXX.XX:3306/pm_dev2.0?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true
      username: root
      password: 123456
      
  
  # 适配器列表
  canalAdapters:
  # canal 实例名或者 MQ topic 名,跟canal-deployer配置文件中保持默认
  - instance: example
    # 分组列表
    groups:
    # 分组id, 如果是MQ模式将用到该值
    - groupId: g1
      # 分组内适配器列表
      outerAdapters:
      # 日志打印适配器
      - name: logger
      # mysql同步数据库适配器,修改这个,目的MySQL数据库
      # 指定为rdb类型同步
      - name: rdb
        # 指定adapter的唯一key, 与表映射配置中outerAdapterKey对应
        key: mysql1
        properties:
          # jdbc驱动名, 部分jdbc的jar包需要自行放致lib目录下
          jdbc.driverClassName: com.mysql.jdbc.Driver
          # jdbc url用户名密码等配置
          jdbc.url: jdbc:mysql://XXX.XXX.XXX.XXX:3307/pm_validation?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true
          jdbc.username: root
          jdbc.password: 123456
          # druid连接池相关配置
          druid.stat.enable: false
          druid.stat.slowSqlMillis: 1000

3、表映射配置文件 xxxx.yml

表映射文件在canal.adapter/conf/rdb目录下,adapter将会自动加载 conf/rdb 下的所有.yml结尾的表映射配置文件。 所以我们需要把原来的mytest_user.yml文件删掉,然后替换为我们对应的yml文件。需要同步几个表就放几个yml文件,文件名称随意,只要后缀为.yml即可。推荐使用表名作为文件名。

# 源数据源的key, 对应上面配置的srcDataSources中的值
dataSourceKey: defaultDS
# cannal的instance或者MQ的topic
destination: example
# 对应MQ模式下的groupId, 只会同步对应groupId的数据
groupId: g1
# adapter key, 对应上面配置outAdapters中的key
outerAdapterKey: mysql1
# 是否按主键hash并行同步, 并行同步的表必须保证主键不会更改及主键不能为其他同步表的外键!!
concurrent: true
dbMapping:
  database: pm_dev2.0  # 源数据库
  table: pm_project_info # 源数据库中的表,也就是要同步的表
  # 注意!!!!!!!!!!!!!!!!!!!!!!!!
  # 这里官网给的说明是放目标数据源的库名.表名,但实际操作下来发现同步数据的时候报错
  # 只放表名同步就正常了
  targetTable: pm_project_info  # 目的数据库中的表
  targetPk:
    id: id
  mapAll: true  # 注意:开启整表所有字段都映射后,下方的个别字段映射需要注释掉
  #targetColumns:
  #  id:
  #  name:
  #  role_id:
  #  c_time:
  #  test1:
  # 批量提交的大小
  commitBatch: 3000 

官网对配置文件的说明

dataSourceKey: defaultDS        # 源数据源的key, 对应上面配置的srcDataSources中的值
destination: example            # cannal的instance或者MQ的topic
groupId:                        # 对应MQ模式下的groupId, 只会同步对应groupId的数据
outerAdapterKey: oracle1        # adapter key, 对应上面配置outAdapters中的key
concurrent: true                # 是否按主键hash并行同步, 并行同步的表必须保证主键不会更改及主键不能为其他同步表的外键!!
dbMapping:
  database: mytest              # 源数据源的database/shcema
  table: user                   # 源数据源表名
  targetTable: mytest.tb_user   # 目标数据源的库名.表名
  targetPk:                     # 主键映射
    id: id                      # 如果是复合主键可以换行映射多个
#  mapAll: true                 # 是否整表映射, 要求源表和目标表字段名一模一样 (如果targetColumns也配置了映射,则以targetColumns配置为准)
  targetColumns:                # 字段映射, 格式: 目标表字段: 源表字段, 如果字段名一样源表字段名可不填
    id:
    name:
    role_id:
    c_time:
    test1: 

4、启动并查看日志

启动canal-adapter

cd /usr/local/src/canal.adapter
# 启动
bash bin/startup.sh
# 查看日志
tail -n 30 logs/adapter/adapter.log

插入几条记录,发现同步成功,再次查看日志。其实至此,数据同步已经完成。

5、配置开机自启动

vim /etc/systemd/system/canal_adapter.service

[Unit]
Description=My Custom Canal adapter Service

[Service]
User=root
Type=forking
WorkingDirectory=/usr/local/src/canal.adapter/bin
ExecStart=/usr/local/src/canal.adapter/bin/restart.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target

systemctl daemon-reload
systemctl enable canal_adapter.service --now

6、使用Mysql配置canal-adapter(可选)

本步骤主要是为了将总配置文件application.yml和表映射配置文件xxxx.yml通过数据库进行配置。使用的数据库为图形管理界面canal-admin所在的数据库,但是,canal-admin并不能通过图形化界面管理adapter的配置文件。只能通过数据库直接操作表。如果您不需要从mysql的配置直接使用配置文件,可以将bootstrap.yml内容注释掉,然后跳过这一步。

如果您未部署canal-admin,需要先下载数据库sql脚本,建立数据库然后执行脚本。

该数据库脚本从软件:canal.admin中获取:conf/canal_manager.sql

https://mirrors.chenby.cn/https://github.com/alibaba/canal/releases/download/canal-1.1.8/canal.admin-1.1.8.tar.gz

注意:脚本里存在建库语句,如果您已经建好了数据库,请把脚本前三行删掉再执行!

1、在表canal_config中插入记录,其中:

  • id为2。
  • 设置字段name值为application.yml
  • content值为application.yml文件中的内容(直接拷贝粘贴)
  • content_md5值为内容md5标识(暂时没啥用,可以随便写一个)
  • 默认3秒刷新一次

image-20250609152837660

2、在表canal_adapter_config中插入记录,其中:

  • 设置字段category为了adapter数据源类型,如es7、rdb、hbase等,对应conf下的目录
  • 设置name为adapter文件名,如pm_requirement_info.yml(必须.yml结尾),对应conf/{db type}下的目录。
  • content内容为adapter数据源配置文件里的内容,pm_requirement_info.yml的内容

修改/usr/local/src/canal.adapter/conf/bootstrap.yml如下:

canal:
  manager:
    jdbc:
      url: jdbc:mysql://XXX.XXX.XXX.XXX:3307/pm_canal_manager?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true
      username: root
      password: 123456

删除掉原来 conf/application.yml 和 conf/rdb/下所有文件。

4、canal-admin介绍

canal-admin是canal运维的图形化界面,官网介绍如下:

canal-admin设计上是为canal提供整体配置管理、节点运维等面向运维的功能,提供相对友好的WebUI操作界面,方便更多用户快速和安全的操作。 canal-admin的限定依赖:

  1. MySQL,用于存储配置和节点等相关数据
  2. canal版本,要求>=1.1.4 (需要依赖canal-server提供面向admin的动态运维管理接口,也就是:canal-deployer)

1、下载与解压

cd /usr/local/src
wget https://mirrors.chenby.cn/https://github.com/alibaba/canal/releases/download/canal-1.1.8/canal.admin-1.1.8.tar.gz
mkdir canal.admin
tar -zxv -f canal.admin-1.1.8.tar.gz -C /usr/local/src/canal.admin

下载适配数据库版本的连接器

默认自带的是:mysql-connector-j-8.0.33.jar,可以不用进行替换

wget https://cdn.mysql.com/archives/mysql-connector-java-8.0/mysql-connector-java-8.0.25.tar.gz
解压缩后把mysql-connector-java-8.0.25.jar文件上传到canal.admin的lib目录下,替换掉低版本的
mv mysql-connector-java-8.0.25.jar canal.admin/lib
mv canal.admin/lib/mysql-connector-java-5.1.48.jar canal.admin/lib/mysql-connector-java-5.1.48.jar.bak

默认lib目录下jar包文件权限是:-rwsrwsrwt,调成到744(跟deployer的保持一致)

cd lib/
chmod 744 *.jar

2、初始化数据库

如果还没有执行canal_manager.sql脚本生成数据库,需要先初始化数据库。数据库脚本位置为conf/canal_manager.sql。

注意:脚本里存在建库语句,如果您已经建好了数据库,请把脚本前三行删掉再执行!

3、修改配置文件application.yml

根据实际情况修改conf/application.yml配置文件,内容如下:

server:
  port: 8089
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8

spring.datasource:
  address: XXX.XXX.XXX.XXX:3306
  database: canal_manager
  username: root
  password: 123456
  driver-class-name: com.mysql.jdbc.Driver
  url: jdbc:mysql://${spring.datasource.address}/${spring.datasource.database}?useUnicode=true&characterEncoding=UTF-8&useSSL=false
  hikari:
    maximum-pool-size: 30
    minimum-idle: 1

canal:
  adminUser: admin
  adminPasswd: 123456  # 注意:这个密码是web登录密码,web登录密码默认是123456,在导入的默认数据表数据表canal_user该字段是加密的

4、启动

cd /usr/local/src/canal.admin
# 启动
bash bin/startup.sh

# 查看日志
tail -n 30 logs/admin.log

5、配置canal-deployer

停止服务

cd /usr/local/src/canal.deployer
sh bin/stop.sh

到其conf目录下,删除canal.properties(如果做了个性化配置,需要将其找个文本文档复制过去)。然后修改canal_local.properties如下:

mv canal.properties canal.properties.bak

# register ip
canal.register.ip =

# canal admin config
canal.admin.manager = XXX.XXX.XXX.XXX:8089
canal.admin.port = 11110
canal.admin.user = admin
canal.admin.passwd = 4ACFE3202A5FF5CF467898FC58AAB1D615029441  # 注意:配置的这个是web登录后的加密密码,可以从数据表canal_user中获取到
# admin auto register
canal.admin.register.auto = true
canal.admin.register.cluster =
canal.admin.register.name = 

将 canal_local.properties 重命名为 canal.properties。

启动服务

cd /usr/local/src/canal.deployer
# 启动
bash bin/startup.sh

6、图形化界面配置canal-admin

1、访问admin地址和端口号 http://ip:8089

默认用户名:admin

默认密码:123456

2、配置server(deployer)

在上一步已经配置了deployer接入到admin中,所以进来就有一条server记录。

3、配置deployer中的instance

新建instance,将canal-deployer中example下的instance.properties拿过来。

instance名称如果有adapter,就是adapter配置文件application.yml中的canalAdapters.instance。

4、分别启动server和instance

至此,图形化界面配置完成。

posted @ 2025-06-09 15:43  哈喽哈喽111111  阅读(86)  评论(0)    收藏  举报