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

canal简介及canal部署、原理和使用介绍

Bug生产站 2022-05-31
6268

Canal简介

canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费

早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。

基于日志增量订阅和消费的业务包括

  • 数据库镜像

  • 数据库实时备份

  • 索引构建和实时维护(拆分异构索引、倒排索引等)

  • 业务 cache 刷新

  • 带业务逻辑的增量数据处理

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

github 地址:https://github.com/alibaba/canal/wiki

工作原理

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 )

  • canal 解析 binary log 对象(原始为 byte 流)

环境搭建

对于自建 MySQL , 需要先开启 Binlog 写入功能,配置 binlog-format 为 ROW 模式,my.cnf 中配置如下

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

    注意:针对阿里云 RDS for MySQL , 默认打开了 binlog , 并且账号默认具有 binlog dump 权限 , 不需要任何权限或者 binlog 设置,可以直接跳过这一步授权 canal 链接 MySQL 账号具有作为 MySQL slave 的权限, 如果已有账户可直接 grant

      CREATE USER canal IDENTIFIED BY 'canal'; 
      GRANT SELECTREPLICATION SLAVEREPLICATION CLIENT ON *.* TO 'canal'@'%';
      -- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
      FLUSH PRIVILEGES;

      canal-admin (可选)

      介绍

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

      准备

      1. 初始化元数据库:

        首先下载sql文件

        https://raw.githubusercontent.com/alibaba/canal/master/canal-admin/canal-admin-server/src/main/resources/canal_manager.sql

        mysql -h127.1 -uroot -p


        # 导入初始化SQL
        > source conf/canal_manager.sql

        2. 下载&运行命令

          docker run -it -p 8089:8089 \
          -e spring.datasource.address=192.168.255.128:3306 \
          -e spring.datasource.database=canal_manager \
          -e spring.datasource.username=root \
          -e spring.datasource.password=123456 \
          --name=canal-admin -d canal/canal-admin:v1.1.5

          3. 查看日志

            docker logs -f canal-admi

            • 此时代表canal-admin已经启动成功,可以通过 http://127.0.0.1:8089/ 访问,默认密码:admin/123456


            注意:如日志只打印到 start admin ... ,则表示未启动成功。需要服务器剩余可用内存大于2G才可启动成功,死坑死坑的这里!!!


            如需配置集群,需搭建zookeeper,目前采用单机版

            安装 canal-server

            1. 安装&运行命令

              docker run -it -p 11111:11111 \
              -e canal.admin.manager=192.168.1.125:8089 \
              -e canal.instance.master.address=192.168.1.125:3306 \
              -e canal.instance.dbUsername=root \
              -e canal.instance.dbPassword=123456 \
              -e canal.instance.connectionCharset=UTF-8 \
              -e canal.instance.tsdb.enable=true \
              -e canal.instance.gtidon=false \
              --name=canal-server -d canal/canal-server:v1.1.5


              # 注意容器之间不要用 127.0.0.1 不然连不上,用ip 192.168.1.xxx
              # -p 11111:11111 需要把端口从容器映射出来,不会然连接不上
              # canal.admin.manager 安装的canal-admin地址
              # canal.instance.master.address 数据库地址

              2. 查看日志

                docker logs -f canal-server

                • 此时代表canal-server已经启动成功,启动成功会自动连接canal-admin


                注意:如日志只打印到 start canal ... ,则表示未启动成功。需要服务器剩余可用内存大于2G才可启动成功,死坑死坑的这里!!!


                3. 登录canal-amin 控制台可查看server已经成功启动


                canal-server 日志信息


                4. 新建instance配置文件


                消费订阅 canal.instance.filter.regex 表达式

                示例:

                全库全表.*\\..*.*\\..*
                指定库全表库名\..*test\..*
                单表库名.表名test.user


                多规则组合使用

                库名1\..*,库名2.表名1,库名3.表名2 (逗号分隔)test\..*,test2.user1,test3.user2 (逗号分隔) 
                • instance名称为 example ,选择启动的canal-server


                配置完成效果:

                • instance 启动成功......................


                • Ok,到这里canal-server 已搭建完毕!!!

                安装 canal-adapter

                1. 下载&安装   

                   注意:canal官方还没提供docker镜像,这不是官方的镜像~


                   这一步启动是为了拷贝文件

                  docker run --name canal-adapter -p 8081:8081 -d slpcat/canal-adapter:v1.1.5

                  2. 创建配置文件目录,后续容器映射到宿主机

                    mkdir -p mydata/canal-adapter/conf

                    3. 复制canal-adapter容器内文件到本地目录

                      docker cp canal-adapter:/opt/canal-adapter/conf mydata/canal-adapter/conf

                      4. 删除刚刚启动的镜像

                        docker rm -f canal-adapter

                        5. 进入本地配置文件目录

                          cd mydata/canal-adapter/conf


                          6. 修改application.yml 文件


                          • 第一处canal-server 地址


                          • 第二处,数据库地址,账号密码,还有数据库



                          • 第三处,打开ES注释,修改ES地址。


                          7. 进入es7 ,新建你的canal_sync.yml


                          8. 重启canal-adapter

                            docker restart canal-adapter

                            9. 查看 canal-adapter 日志

                            同步成功~~~

                            其他 ES 配置请查看官方文档:

                              https://github.com/alibaba/canal/wiki/Sync-ES

                              警告!!!

                                注意: 
                                   1.   配置 _index 不能使用索引别名,canal 不支持
                                2. sql 中不能 5 as num 这样写,改:'5' as num
                                   3.   需要把canal-adapter conf文件下的全拷贝出来,漏了会报错
                                   4.   这几个东西有点吃内存,建议 8G 内存,才够把这几个服务跑起来
                                   5.   账号的权限要给大点,不然也会报错

                                   以上几个点死坑死坑的,调了我好久,  靠!!!

                                以上这些都是经过我实测的总结~

                                如果这样还是启动出错,请检查配置,肯定是你的权限、配置文件有问题。

                                与我文档无关~

                                 



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

                                评论