• 基于Docker的安装和配置Canal


    基本介绍

    Canal介绍:Canal 是用 Java 开发的基于数据库增量日志解析,提供增量数据订阅&消费的中间件(数据库同步需要阿里的 Otter 中间件,基于 Canal)。

    Canal背景:阿里巴巴 B2B 公司,因为业务的特性,卖家主要集中在国内,买家主要集中在国外,所以衍生出了同步杭州和美国异地机房的需求,从 2010 年开始,阿里系公司开始逐步的尝试基于数据库的日志解析,获取增量变更进行同步,由此衍生出了增量订阅&消费的业务。

    canal的工作原理是将自己伪装成mysql的slave节点,来订阅mysql binlog的变更,所以在配置启动canal前,需要先配置mysql。

    Canal是基于mysql的主从同步来实现的,MySQL主从同步的原理如下:

    • 1)MySQL master 将数据变更写入二进制日志( binary log),其中记录的数据叫做binary log events

    • 2)MySQL slave 将 master 的 binary log events拷贝到它的中继日志(relay log)

    • 3)MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据

    而Canal就是把自己伪装成MySQL的一个slave节点,从而监听master的binary log变化。再把得到的变化信息通知给Canal的客户端,进而完成对其它数据库的同步。  

    安装配置MySQL

    安装mysql

    1. docker run \
    2. --name mysql \
    3. -e MYSQL_ROOT_PASSWORD=root \
    4. -p 3306:3306 \
    5. -v /mysql/conf/myLocal.cnf:/etc/mysql/conf.d \
    6. -v /mysql/data:/var/lib/musql \
    7. -d \
    8. mysql:5.7.25
    1. docker run \ # 创建并运行一个容器
    2. --name mysql \ # 给容器个名字叫mysql
    3. -e MYSQL_ROOT_PASSWORD=root \ # 设置mysql登录,密码为root
    4. -p 3306:3306 # 把宿主机3306端口和容器的3306端口相关联
    5. -v /mysql/conf/myLocal.cnf:/etc/mysql/conf.d \ # 宿主myLocal.cnf文件挂载到容器conf.d文件
    6. -v /mysql/data:/var/lib/musql \ # 宿主data目录挂载到容器mysql目录
    7. -d \ # 后台运行
    8. mysql:5.7.25 # 需要启动的镜像名称

    修改配置文件 

    打开mysql容器挂载的日志文件,比如我的在`/tmp/mysql/conf`目录。对my.cnf进行修改,添加以下内容:

    1. log-bin=/var/lib/mysql/mysql-bin
    2. binlog-do-db=heima

    配置解读:

    • log-bin=/var/lib/mysql/mysql-bin:设置binary log文件的存放地址和文件名,叫做mysql-bin

    • binlog-do-db=heima:指定对哪个database记录binary log events,这里记录heima这个库

    最终效果:

    1. [mysqld]
    2. skip-name-resolve
    3. character_set_server=utf8
    4. datadir=/var/lib/mysql
    5. server-id=1000
    6. log-bin=/var/lib/mysql/mysql-bin
    7. binlog-do-db=heima

    设置用户权限

     接下来添加一个仅用于数据同步的账户,出于安全考虑,这里仅提供对heima这个库的操作权限。

    1. create user canal@'%' IDENTIFIED by 'canal';
    2. GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%' identified by 'canal';
    3. FLUSH PRIVILEGES;

     然后重启MySQL

    安装Canal

    创建网络

    需要创建一个网络,将MySQL、Canal、MQ放到同一个Docker网络中:

    docker network create heima

    让mysql加入这个网络:

    docker network connect heima mysql

    安装运行Cannal

    拉取Canal的镜像文件:

    docker pull canal/canal-server:v1.1.5

    然后运行命令创建Canal容器:

    1. docker run -p 11111:11111 --name canal \
    2. -e canal.destinations=heima \
    3. -e canal.instance.master.address=mysql:3306 \
    4. -e canal.instance.dbUsername=canal \
    5. -e canal.instance.dbPassword=canal \
    6. -e canal.instance.connectionCharset=UTF-8 \
    7. -e canal.instance.tsdb.enable=true \
    8. -e canal.instance.gtidon=false \
    9. -e canal.instance.filter.regex=heima\\..* \
    10. --network heima \
    11. -d canal/canal-server:v1.1.5

    说明:

    • -p 11111:11111:这是canal的默认监听端口

    • -e canal.instance.master.address=mysql:3306:数据库地址和端口,如果不知道mysql容器地址,可以通过docker inspect 容器id来查看

    • -e canal.instance.dbUsername=canal:数据库用户名

    • -e canal.instance.dbPassword=canal :数据库密码

    • -e 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  

  • 相关阅读:
    java支持多任务之间的依赖协作关系
    这几个 Python 小游戏,上班摸鱼我能玩一天 | 内附源码
    吴恩达机器学习笔记(一)
    十六、 代码校验(3)
    可变参数模板
    Python3 面向对象
    VMware虚拟机 Centos7 配置静态IP和DNS
    安装VMware
    day04-前台首页、导出项目依赖
    Programming abstractions in C阅读笔记:p144-p160
  • 原文地址:https://blog.csdn.net/m0_62436868/article/details/134351734