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

初试Canal 1.1.4异构数据同步

万能修实验室 2021-07-14
968





随着业务复杂度和规模的增长,RDBMS、NoSQL、OLAP等多种数据源间的数据传输越来越多,在企业内部甚至外部,数据迁移/订阅/同步需求逐渐增加。

目前数据同步类产品很多,如国外的Maxwell、Databus、mysqlstreamer,国产阿里系也推出了很多不错的软件,如:canal、otter、drc、datax、dts、drds愚公精卫等,其中很多都是在canal的基础上开发包装出来的。


引用:https://blog.csdn.net/wwwdc1012/article/details/88388552


几个月前Canal进行了更新,新版本1.1.4有几个亮点:

  • 支持WebUI的canal管理

  • 提供全面兼容MySQL DDL的解析能力

  • 支持ACL提升安全性




下面就测试下用canal同步MySQL的数据到其他的数据库中吧, 出发。





1 部署 Canal-Admin


文档:
https://github.com/alibaba/canal/wiki/Canal-Admin-QuickStart

1 下载Canal-Admin,目前最新1.1.4版本:

    cd  caihao/
    wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.admin-1.1.4.tar.gz


    2 解压

      mkdir caihao/canal-admin
      tar zxvf canal.admin-1.1.4.tar.gz -C caihao/canal-admin


         目录结构:

        cd caihao/canal-admin
        [root@mysql1 canal-admin]# ll
        drwxr-xr-x 2 root root 4096 11月 1 11:42 bin
        drwxr-xr-x 3 root root 4096 11月 1 11:42 conf
        drwxr-xr-x 2 root root 4096 11月 1 11:42 lib
        drwxrwxrwx 2 root root 4096 9月 2 15:26 logs


        3 配置修改:

        * 注意:datasource对应canal-admin数据库配置信息,下面canal部分对应canal应用配置中的信息

        配置文件:

        vi caihao/canal-admin/conf/application.yml

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


          spring.datasource:
          address: 127.0.0.1:3306
          database: canal_manager
          username: canal
          password: Admin_canal_8888
          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: Server_canal_8888


          4 在数据库中执行初始化SQL,脚本会创建canal_manager库
          * 脚本canal_manager.sql在canal-admin的conf目录下

            [root@localhost][(none)]> source conf/canal_manager.sql


            # 建立用户并授权:

              [root@localhost][(none)]> CREATE USER 'canal'@'127.0.0.1' IDENTIFIED BY 'Admin_canal_8888';
              Query OK, 0 rows affected (0.05 sec)
              [root@localhost][(none)]> GRANT ALL ON canal_manager.* TO 'canal'@'127.0.0.1';
              Query OK, 0 rows affected (0.03 sec)


              5 启动Canal-Admin

                sh caihao/canal-admin/bin/startup.sh


                查看 admin 日志
                * 如java版本过久可能导致启动无日志产生

                  tail -200 caihao/canal-admin/logs/admin.log


                  查看管理页面
                  http://10.7.70.49:8089/

                  默认密码:  admin/123456


                  6 关闭Canal-Admin

                    sh caihao/canal-admin/bin/stop.sh
                    -----------------------遇到问题------------------------
                    报错:页面中添加配置提示:
                    Error[Column 'modified_time' cannot be null]
                    解决:(5.7)
                    set global explicit_defaults_for_timestamp = 0;
                    重启canal-admin


                     2 部署 Canal-Server


                    1 下载:

                    必须要1.1.4版本,才支持canal-admin

                      cd caihao/
                      wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deployer-1.1.4.tar.gz


                      2 解压安装:

                        cd /caihao/
                        mkdir canal-server
                        tar zxvf canal.deployer-1.1.4.tar.gz -C caihao/canal-server


                        3 修改配置文件:(注意修改加密的密码)

                          vi caihao/canal-server/conf/canal_local.properties

                          # 修改内容

                            # register ip
                            canal.register.ip =


                            # canal admin config
                            canal.admin.manager = 127.0.0.1:8089 # canal-admin web 页面
                            canal.admin.port = 11110 # canal-admin 默认端口
                            canal.admin.user = admin # canal-admin 账号
                            canal.admin.passwd = A5F634A262D04AFADD349C50CD5D13E55BD764DE # canal-admin 加密密码
                            # admin auto register
                            canal.admin.register.auto = true
                            canal.admin.register.cluster = # 集群名


                            这里的passwd是一个密文,和canal-admin里application.yml里的密码原文做对应.
                            找个MySQL数据库执行以下即可加密:(去掉前面的星号)

                              (root@localhost:mysql.sock)[(none)]select password('Server_canal_8888');
                              +-------------------------------------------+
                              | password('Server_canal_8888') |
                              +-------------------------------------------+
                              | *A5F634A262D04AFADD349C50CD5D13E55BD764DE |
                              +-------------------------------------------+
                              1 row in set (0.00 sec)


                              4 启动Canal-Server:

                                sh caihao/canal-server/bin/startup.sh local


                                5 停止Canal-Server:

                                  sh caihao/canal-server/bin/stop.sh local


                                  启动方式2:
                                  变更默认配置,备份canal.properties,重命名canal_local.properties为canal.properties,则不用加参数local


                                  6 查看启动日志:

                                    tail  -200 /caihao/canal-server/logs/canal/canal.log
                                    2019-11-04 11:47:57.326 [main] INFO com.alibaba.otter.canal.deployer.CanalLauncher - ## set default uncaught exception handler
                                    2019-11-04 11:47:57.358 [main] INFO com.alibaba.otter.canal.deployer.CanalLauncher - ## load canal configurations
                                    2019-11-04 11:47:57.750 [main] INFO com.alibaba.otter.canal.deployer.CanalStarter - ## start the canal server.
                                    2019-11-04 11:47:57.778 [main] INFO com.alibaba.otter.canal.deployer.CanalController - ## start the canal server[192.168.122.1(192.168.122.1):11111]
                                    2019-11-04 11:47:57.844 [main] INFO com.alibaba.otter.canal.deployer.CanalStarter - ## the canal server is running now ......


                                     3 配置同步 


                                    1 左边的Server部分配置:
                                    # 图形操作即可:
                                    # 在Server管理中已经自动识别启动的CanalServer


                                    # 点击:操作 -> 修改  

                                    配置项说明:

                                    • 所属集群,可以选择为单机 或者 集群。一般单机Server的模式主要用于一次性的任务或者测试任务

                                    • Server名称,唯一即可,方便自己记忆

                                    • Server Ip,机器ip

                                    • admin端口,canal 1.1.4版本新增,会在canal-server上提供远程管理操作,默认值11110

                                    • tcp端口,canal提供netty数据订阅服务的端口

                                    • metric端口, promethues的exporter监控数据端口 (未来会对接监控)


                                    # 点击:操作 -> 配置
                                    修改如下配置:对应 canal.properties


                                      # 以下instance用户密码验证,注释关闭:
                                      # canal instance user/passwd
                                      # canal.user = canal
                                      # canal.passwd = E3619321C1A937C46A0D8BD1DAC39F93B27D4458


                                      # canal admin config 以下注意修改加密的密码
                                      canal.admin.manager = 127.0.0.1:8089
                                      canal.admin.port = 11110
                                      canal.admin.user = admin
                                      canal.admin.passwd = A5F634A262D04AFADD349C50CD5D13E55BD764DE


                                      # 以下需修改成对应的目标实例名 instance_name,如同步多实例,可以逗号分隔
                                      canal.destinations = mysql171


                                      2 左边的Instance部分配置:
                                      # MySQL源端数据库配置

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


                                        建立同步账号:
                                        GRANT SELECTREPLICATION SLAVEREPLICATION CLIENT ON *.* TO 'canal'@'%' IDENTIFIED BY 'AB_canal_2019'


                                        页面操作添加Instance:
                                        1 点击:Instance管理 -> 新建instance


                                        2 点击:载入模板


                                        3 修改配置文件 

                                        # 对应原来的:

                                        /caihao/canal-server/conf/example/instance.properties

                                          # position info
                                          canal.instance.master.address = 10.7.91.171:3306


                                          # username/password
                                          canal.instance.dbUsername = canal
                                          canal.instance.dbPassword = AB_canal_2019
                                          canal.instance.connectionCharset = UTF-8


                                          # 订阅实例中所有的数据库和表
                                          canal.instance.filter.regex = .*\\..*


                                          ## canal.instance.defaultDatabaseName =xttblog



                                          4 点击:确认新建


                                          5 检查日志:

                                          # 查看server状态与日志:


                                          # 查看 instance  状态与日志

                                           (关键字:start successful)


                                          # 查看binlog同步进度的日志:

                                            [root@zabbix mysql171]# pwd
                                            /caihao/canal-server/logs/mysql171
                                            [root@zabbix mysql171]# tail -10 meta.log
                                            2019-11-06 16:32:12.159 - clientId:1001 cursor:[bin.000310,562521259,1573029130000,170,] address[10.7.91.171/10.7.91.171:3306]
                                            2019-11-06 16:33:02.159 - clientId:1001 cursor:[bin.000310,562522291,1573029180000,170,] address[10.7.91.171/10.7.91.171:3306]
                                            2019-11-06 16:33:03.159 - clientId:1001 cursor:[bin.000310,562523419,1573029181000,170,] address[10.7.91.171/10.7.91.171:3306]
                                            2019-11-06 16:44:42.159 - clientId:1001 cursor:[bin.000310,562524451,1573029880000,170,] address[10.7.91.171/10.7.91.171:3306]
                                            2019-11-06 16:45:03.159 - clientId:1001 cursor:[bin.000310,562525015,1573029901000,170,] address[10.7.91.171/10.7.91.171:3306]
                                            2019-11-06 16:54:03.159 - clientId:1001 cursor:[bin.000310,562525582,1573030441000,170,] address[10.7.91.171/10.7.91.171:3306]
                                            2019-11-06 16:55:47.159 - clientId:1001 cursor:[bin.000310,562526313,1573030545000,170,] address[10.7.91.171/10.7.91.171:3306]
                                            2019-11-06 16:56:03.159 - clientId:1001 cursor:[bin.000310,562526867,1573030561000,170,] address[10.7.91.171/10.7.91.171:3306]
                                            2019-11-06 16:57:02.159 - clientId:1001 cursor:[bin.000310,562527938,1573030620000,170,] address[10.7.91.171/10.7.91.171:3306]
                                            2019-11-06 16:57:03.159 - clientId:1001 cursor:[bin.000310,562528500,1573030621000,170,] address[10.7.91.171/10.7.91.171:3306]
                                            [root@zabbix mysql171]#


                                            4 安装canal-adapter


                                            文档:
                                            https://github.com/alibaba/canal/wiki/Sync-RDB

                                            1 下载canal.adapter-1.1.4.tar.gz

                                              wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.adapter-1.1.4.tar.gz


                                              2 解压安装

                                                mkdir canal.adapter-1.1.4
                                                cd canal.adapter-1.1.4
                                                tar -zxvf ../canal.adapter-1.1.4.tar.gz


                                                3 修改配置文件,添加目的端的数据库:

                                                  vi  caihao/canal.adapter-1.1.4/conf/application.yml
                                                    canal.conf:
                                                    mode: tcp # kafka rocketMQ
                                                    canalServerHost: 127.0.0.1:11111
                                                    # zookeeperHosts: slave1:2181
                                                    # mqServers: 127.0.0.1:9092 #or rocketmq
                                                    # flatMessage: true
                                                    batchSize: 500
                                                    syncBatchSize: 1000
                                                    retries: 0
                                                    timeout:
                                                    accessKey:
                                                    secretKey:
                                                    srcDataSources:
                                                    defaultDS:
                                                    url: jdbc:mysql://10.7.91.171:3306/sbtest?useUnicode=true
                                                    username: canal
                                                    password: ****
                                                    canalAdapters:
                                                    - instance: mysql171 # canal instance Name or mq topic name
                                                    groups:
                                                    - groupId: g1
                                                    outerAdapters:
                                                    - name: logger
                                                    - name: rdb
                                                    key: mysql1
                                                    properties:
                                                    jdbc.driverClassName: com.mysql.jdbc.Driver
                                                    jdbc.url: jdbc:mysql://10.7.91.169:3306/sbtest?useUnicode=true
                                                    jdbc.username: root
                                                    jdbc.password: ****
                                                    threads: 5 # 并行执行的线程数, 默认为1

                                                          
                                                    在/conf/rdb/下新建一个和instance名字一样的文件:mysql171.yml 文件

                                                      vi /caihao/canal.adapter-1.1.4/conf/rdb/mysql171.yml


                                                      dataSourceKey: defaultDS
                                                      destination: mysql171 # canal instance
                                                      groupId: g1
                                                      outerAdapterKey: mysql1
                                                      concurrent: true
                                                      dbMapping:
                                                      mirrorDb: true
                                                      database: sbtest


                                                      4 启动canal-adapter

                                                        sh caihao/canal.adapter-1.1.4/bin/startup.sh


                                                        查看进程

                                                          ps -ef|grep adapter


                                                          查看日志:

                                                            tail -100 caihao/canal.adapter-1.1.4/logs/adapter/adapter.log


                                                            5 停止canal-adapter

                                                              sh /caihao/canal.adapter-1.1.4/bin/stop.sh


                                                              * 配置失败报错了怎么办?*

                                                                常见问题一般都是destination 与instance不一致导致
                                                                他们出现的地方:
                                                                1 Sverver 配置页面中 配置项 canal.destinations = mysql171
                                                                (对应文件 /caihao/canal-server/conf/canal.properties)
                                                                2 instance配置页面中 实例名 mysql171
                                                                (对应文件 /caihao/canal-server/conf/example/instance.properties)
                                                                3 adapter配置文件application.yml 中 - instance: mysql171
                                                                /conf/rdb/mysql171.yml 的文件名、文件中的的配置项
                                                                destination: mysql171


                                                                5 性能测试:


                                                                # 测试的环境:


                                                                # 用sb做单表插入百万数据测试下:


                                                                # 源端是MySQL,数据量:


                                                                # 目标端用的MemSQL内存数据库,数据量一致:


                                                                # 数据大小与内存占用情况





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

                                                                评论