• canal集群部署及使用


    更多运维进阶知识请看:
    ​​https://edu.51cto.com/course/30254.html​​
    ​​https://edu.51cto.com/course/31241.html​

    背景

    为了优化查询效率,我们采用了如下的解决方式:
    首先,用canal集群同步mysql数据到elasticsearch集群
    然后,我们再通过elasticsearch来进行查询操作

    canal简介

    canal 工作原理
    canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议
    MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
    canal 解析 binary log 对象(原始为 byte 流)

    canal数据同步架构
    在这里插入图片描述
    mysql主从复制原理
    在这里插入图片描述

    规划:

    1、canal server两个节点
    3、zookeeper集群三个节点
    本文省略了zookeeper集群和mysql的部署及配置方式,需要注意的是mysql需要开启binlog日志

    canal集群部署

    mkdir /opt/canal
    cd /opt/canal
    wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.deployer-1.1.5.tar.gz
    tar xvf canal.deployer-1.1.5.tar.gz
    
    • 1
    • 2
    • 3
    • 4

    canal集群配置

    节点01

    修改canal.properties配置文件

    cp canal.properties canal.properties.bak
    cd /opt/canal/conf/
    
    vim canal.properties
    #主要配置例举如下:
    #保证canal集群中每个canal server的id都是唯一的
    canal.id = 11
    #canal server的地址
    canal.ip = 192.168.1.111
    #canal服务socket监听端口,代码中连接canal-server时,使用此段口连接
    canal.port = 11111
    canal.metrics.pull.port = 11112
    #canal server注册的zookeeper地址,集群各节点之间用逗号分隔
    canal.zkServers = 192.168.1.113:2181,192.168.1.114:2181,192.168.1.115:2181
    #表示实例的配置文件instance.properties地址
    canal.destinations = example
    # 所有的组件(parser , sink , store)都选择了持久化模式,
    # 目前持久化的方式主要是写入zookeeper,保证数据集群共享
    canal.instance.global.spring.xml = classpath:spring/default-instance.xml
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    修改 instance.properties配置文件

    cd /opt/canal/conf/example
    cp instance.properties instance.properties.bak
    
    vim instance.properties
    #主要配置例举如下:
    #canal集群中每个canal server的slaveld保持唯一
    canal.instance.mysql.slaveId=111
    #需要同步的数据库地址
    canal.instance.master.address=192.168.1.77:3306
    #数据库用户名、密码
    canal.instance.dbUsername=root
    canal.instance.dbPassword=xxxxx
    #数据库连接编码
    canal.instance.connectionCharset = UTF-8
    #mysql 数据解析关注的表,Perl正则表达式.多个正则之间以逗号(,)分隔,转义符需要双斜杠(\)
    canal.instance.filter.regex=.*\\..*
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    节点02

    修改canal.properties配置文件

    cd /opt/canal/conf/example
    cp canal.properties canal.properties.bak
    
    vim canal.properties
    #保证canal集群中每个canal server的id都是唯一的
    canal.id = 22
    #canal server的地址
    canal.ip = 192.168.1.113
    #canal服务socket监听端口,代码中连接canal-server时,使用此段口连接
    canal.port = 11111
    canal.metrics.pull.port = 11112
    #canal server注册的zookeeper地址,集群各节点之间用逗号分隔
    canal.zkServers = 192.168.1.113:2181,192.168.1.114:2181,192.168.1.115:2181
    #表示实例的配置文件instance.properties地址
    canal.destinations = example
    # 所有的组件(parser , sink , store)都选择了持久化模式,
    # 目前持久化的方式主要是写入zookeeper,保证数据集群共享
    canal.instance.global.spring.xml = classpath:spring/default-instance.xml
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    修改 instance.properties配置文件

    cd /opt/canal/conf/example
    cp instance.properties instance.properties.bak
    vim instance.properties
    canal.instance.mysql.slaveId=222
    #需要同步的数据库地址
    canal.instance.master.address=192.168.1.77:3306
    canal.instance.master.journal.name=mysql-bin.000001
    #数据库用户名、密码
    canal.instance.dbUsername=root
    canal.instance.dbPassword=xxxxx
    #数据库连接编码
    canal.instance.connectionCharset = UTF-8
    #mysql 数据解析关注的表,Perl正则表达式.多个正则之间以逗号(,)分隔,转义符需要双斜杠(\)
    canal.instance.filter.regex=.*\\..*
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    启动canal server

    cd /opt/canal
    ./startup.sh
    #查看进程状态
    ps -ef |grep canal
    #查看canal端口
    ss -ntlup |grep 111
    tcp    LISTEN     0      50     192.168.1.113:11111                 *:*                   users:(("java",pid=20672,fd=82))
    tcp    LISTEN     0      3         *:11112                 *:*                   users:(("java",pid=20672,fd=77))
    tcp    LISTEN     0      50     192.168.1.113:11110
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    验证canal集群

    #连上zookeeper
    ./zkCli.sh
    
    • 1
    • 2

    目录结构
    在这里插入图片描述

    #读取binlog信息
    ls /otter/canal/destinations/example
    [1001, cluster, running]
    
    get /otter/canal/destinations/example/1001/cursor
    {"@type":"com.alibaba.otter.canal.protocol.position.LogPosition","identity":{"slaveId":-1,"sourceAddress":{"address":"192.168.1.77","port":3306}},"postion":{"gtid":"","included":false,"journalName":"mysql-bin.000013","position":606163903,"serverId":1,"timestamp":1658313261000}}
    
    #查看当前哪个canal client在工作
    get /otter/canal/destinations/example/1001/running
    {"active":true,"address":"192.168.10.38:62071","clientId":1001}
    
    
    #查看canal集群状态
    ls /otter/canal/destinations/example/cluster
    [192.168.1.111:11111, 192.168.1.113:11111]
    #查看当前哪个canal server节点在工作
    get /otter/canal/destinations/example/running
    {"active":true,"address":"192.168.1.111:11111"}
    #从上面信息可以看下,现在canal工作节点是192.168.1.111,现在咱们来验证下canal server集群工作节点的自动切换功能。
    先停掉192.168.1.111的canal server
    cd /opt/canal
    ./stop.sh
    然后再次查看当前哪个canal节点在工作
    ./zkCli.sh
    get /otter/canal/destinations/example/running
    {"active":true,"address":"192.168.1.113:11111"}
    #从上面输出信息可以看到,canal集群当前工作节点自动切换到了另外一个canal server节点
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    总结:
    1、同一时间,两个canal(server),只会有一个工作,另一个处于阻塞状态;
    2、同一时间,两个canal(client),也只会有一个工作,另一个处于阻塞状态

  • 相关阅读:
    jquery datatable+bootstrap popover在表格里弹出对话框时只在表格内部,而不是外部
    Redis6搭建高可用的多主多从集群
    一、uniCloud的简介
    华为设备IPSG配置命令
    电商RN项目秒开优化实践
    动态规划问题(三)
    条件不一致的动态运算
    tf模型落地安卓之旧事重提
    【python】(六)python的封装、继承和多态
    Spring更简单的实现Bean对象的存取
  • 原文地址:https://blog.csdn.net/zenglingmin8/article/details/125902173