canal应用-1个server+2个instance+2个client+2个mysql

Canal、Canaladmin、Canaladapter多instance数据库表双向同步,TCP/Zookeeper、Rocketmq配置 目录背景配置下载MySQL配置单机模式配置Canaladmin配置Instance配置Canal配置Canaladapter配置集群模式(ZK)Canaladmin配置Canal配置使用RocketMQCanaladmin配置 Instance配置Canaladapter配置两个MySQL数据库实例中,实现order表双向同步增删改操作准备一台Linux,用来安装canal环境,需要提前安装JDK和MySQL,安装JDK是为了启动canal这三个项目,这个是必要的安装MySQL是因为admin用到了cana 阅读详情

一 canal应用架构设计


组件说明:

  • 1 . linux内核版本(CentOS Linux 7):(命令:uname -a)
    Linux slave1 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
  • 2.mysql版本:(SQL命令:select version(); 或 status)
    Server version: 5.6.43-log MySQL Community Server (GPL)
  • 3.canal版本:canal-1.1.3
  • 4.JDK版本: 1.8

canal工作原理:

  • 1.模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议;
  • 2.mysql master收到dump请求,开始推送binary log给slave(也就是canal);
  • 3.解析binary log对象(原始为byte流)

了解更多详细更新可以查看文章:【了解canal,看这个就够了】

二 架构落地实现流程

2.1 mysql配置与安装
1. 下载安装

在192.168.175.21和192.168.175.22上分别安装mysql,具体安装流程可参考文章:Linux-安装MySQL.

2. 创建canal账户

在创建root账号并设置远程访问之后,接着创建canal账号并设置远程访问和权限:

mysql> CREATE USER 'canal'@'%' IDENTIFIED BY 'canal';
mysql> GRANT ALL ON canal.* TO 'canal'@'%';
mysql> GRANT SELECT, REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'canal'@'%';
mysql>FLUSH PRIVILEGES;
3. 验证登录
#远程登录
mysql -h 192.168.175.22 -P 3306 -u canal -pcanal

#本地登录
mysql -ucanal -pcanal
4. 修改my.cnf配置

分别在175.21和175.22两台服务器修改my.conf配置,查找my.cnf配置位置命令:whereis my.

192.168.175.21中的my.cnf配置新增如下内容:

log_bin=mysql-bin  #指定bin-log的名称,尽量可以标识业务含义
binlog_format=row  #选择row模式,必须!!!
server_id=1  #mysql服务器id
2.2 canal server配置与启动
1. 下载canal

下载地址: https://github.com/alibaba/canal/releases/download/canal-1.1.3/canal.deployer-1.1.3.tar.gz

2.上传并解压

进入192.168.175.20服务器,使用rz命令上传,使用如下命令进行解压至/usr/local/hadoop/app/canal:

tar xzvf canal.deployer-1.1.3.tar.gz -C canal
3. 修改配置

新解压的文件夹/usr/local/hadoop/app/canal/conf/有一个example文件夹,一个example就代表一个instance实例.而一个instance实例就是一个消息队列,所以这里可以将文件名改为example1,同时再复制出来一个叫example2.(命名可以使用监听的数据库名)

修改/usr/local/hadoop/app/canal/conf/example1/instance.properties配置文件:

canal.instance.master.address=192.168.175.21:3306
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.connectionCharset = UTF-8
canal.mq.topic=example1

修改/usr/local/hadoop/app/canal/conf/example2/instance.properties配置文件:

canal.instance.master.address=192.168.175.22:3306
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.connectionCharset = UTF-8
canal.mq.topic=example2

配置文件参数说明,可查看:https://github.com/alibaba/canal/wiki/AdminGuide

4. 启动canal server

进入文件夹/usr/local/hadoop/app/canal/bin执行如下命令:

./startup.sh

查看日志/usr/local/hadoop/app/canal/logs/canal/canal.log,出现如下内容,即表示启动成功:

2019-06-07 21:15:03.372 [main] INFO  com.alibaba.otter.canal.deployer.CanalLauncher - ## load canal configurations
2019-06-07 21:15:03.427 [main] INFO  c.a.o.c.d.monitor.remote.RemoteConfigLoaderFactory - ## load local canal configurations
2019-06-07 21:15:03.529 [main] INFO  com.alibaba.otter.canal.deployer.CanalStater - ## start the canal server.
2019-06-07 21:15:06.251 [main] INFO  com.alibaba.otter.canal.deployer.CanalController - ## start the canal server[192.168.175.22:11111]
2019-06-07 21:15:22.245 [main] INFO  com.alibaba.otter.canal.deployer.CanalStater - ## the canal server is running now ......
5. 启动canal client

注意运行canal客户端代码时,一定要先启动canal server!!!

(1) 添加pom依赖

    <!--canal-->
    <dependency>
      <groupId>com.alibaba.otter</groupId>
      <artifactId>canal.client</artifactId>
      <version>1.1.3</version>
    </dependency>

(2) canal client代码:

package com.xgh.canal;


import java.net.InetSocketAddress;
import java.util.List;

import com.alibaba.otter.canal.client.CanalConnector;
import com.alibaba.otter.canal.client.CanalConnectors;
import com.alibaba.otter.canal.protocol.CanalEntry.Column;
import com.alibaba.otter.canal.protocol.CanalEntry.Entry;
import com.alibaba.otter.canal.protocol.CanalEntry.EntryType;
import com.alibaba.otter.canal.protocol.CanalEntry.EventType;
import com.alibaba.otter.canal.protocol.CanalEntry.RowChange;
import com.alibaba.otter.canal.protocol.CanalEntry.RowData;
import com.alibaba.otter.canal.protocol.Message;

public class CanalClientTest {

    public static void main(String args[]) {
        // 创建链接
        CanalConnector connector = CanalConnectors.newSingleConnector(new InetSocketAddress("192.168.175.20", 11111),
                "example1", "", "");//或者example2
        int batchSize = 1000;
        int emptyCount = 0;
        try {
            connector.connect();
            connector.subscribe(".*\\..*");//订阅所有库下面的所有表
            //connector.subscribe("canal.t_canal");//订阅库canal库下的表t_canal
            connector.rollback();
            int totalEmtryCount = 1200;
            while (emptyCount < totalEmtryCount) {//实际生产中需要设置为true,死循环
                Message message = connector.getWithoutAck(batchSize); // 获取指定数量的数据
                long batchId = message.getId();
                int size = message.getEntries().size();
                if (batchId == -1 || size == 0) {
                    emptyCount++;
                    System.out.println("empty count : " + emptyCount);//此時代表當前數據庫無遍更數據
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    emptyCount = 0;
                    System.out.printf("message[batchId=%s,size=%s] \n", batchId, size);
                    printEntry(message.getEntries());
                }

                connector.ack(batchId); // 提交确认
                // connector.rollback(batchId); // 处理失败, 回滚数据
            }

            System.out.println("empty too many times, exit");
        } finally {
            connector.disconnect();
        }
    }

    private static void printEntry(List<Entry> entrys) {
        for (Entry entry : entrys) {
            if (entry.getEntryType() == EntryType.TRANSACTIONBEGIN
                    || entry.getEntryType() == EntryType.TRANSACTIONEND) {
                continue;
            }

            RowChange rowChage = null;
            try {
                rowChage = RowChange.parseFrom(entry.getStoreValue());
            } catch (Exception e) {
                throw new RuntimeException("ERROR ## parser of eromanga-event has an error , data:" + entry.toString(),
                        e);
            }
            System.out.println("rowChare ======>"+rowChage.toString());

            EventType eventType = rowChage.getEventType(); //事件類型,比如insert,update,delete
            System.out.println(String.format("================> binlog[%s:%s] , name[%s,%s] , eventType : %s",
                    entry.getHeader().getLogfileName(),//mysql的my.cnf配置中的log-bin名稱
                    entry.getHeader().getLogfileOffset(), //偏移量
                    entry.getHeader().getSchemaName(),//庫名
                    entry.getHeader().getTableName(), //表名
                    eventType));//事件名

            for (RowData rowData : rowChage.getRowDatasList()) {
                if (eventType == EventType.DELETE) {
                    printColumn(rowData.getBeforeColumnsList());
                } else if (eventType == EventType.INSERT) {
                    printColumn(rowData.getAfterColumnsList());
                } else {
                    System.out.println("-------> before");
                    printColumn(rowData.getBeforeColumnsList());
                    System.out.println("-------> after");
                    printColumn(rowData.getAfterColumnsList());
                }
            }
        }
    }

    private static void printColumn(List<Column> columns) {
        for (Column column : columns) {
            System.out.println(column.getName() + " : " + column.getValue() + "    update=" + column.getUpdated());
        }
    }

}

canal client运行实例:

empty count : 1
empty count : 2
empty count : 3
empty count : 4
6. 触发数据库变更

创建库:create database canal;
创建表:create table t_canal (id int,name varchar(20),status int);
插入数据:insert into t_canal values(10,'hello',1);

canal client输出日志:

================> binlog[mysql-bin.000001:6764] , name[canal,t_canal] , eventType : INSERT
id : 10    update=true
name : hello    update=true
status : 1    update=true

三. 自问自答-为何设置了数据表的过滤条件,但貌似没有生效?

答:首先看文档AdminGuide,了解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 (逗号分隔)

检查binlog格式,过滤条件只针对row模式的数据有效(ps. mixed/statement因为不解析sql,所以无法准确提取tableName进行过滤)。

检查下CanalConnector是否调用subscribe(filter)方法;有的话,filter需要和instance.properties的canal.instance.filter.regex一致,否则subscribe的filter会覆盖instance的配置,如果subscribe的filter是.…,那么相当于你消费了所有的更新数据 【特别注意】

参考文章:
  1. https://www.cnblogs.com/jayinnn/p/9606466.html
  2. https://github.com/alibaba/canal
canal-server的安装部署 概述 canal是阿里巴巴旗下的一款开源项目,纯Java开发。基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了MySQL(也支持mariaDB)。 部署 jdk canal属于纯java开发,所以要先安装java环境,参照网上教程,注意配置环境变量 mysql 第一步: 编辑mysql配置文件 $ sudo vim /etc/my.cnf log-... 阅读详情

相关推荐

Canal实战指南:MySQL实时数据同步原理、部署与高可用架构

在数据驱动的现代应用中,数据同步是连接不同系统、实现数据一致性的关键技术。其核心原理在于捕获数据源的变更事件,并将其可靠地传递到下游系统。Change Data Capture(CDC)是实现这一目标的主流技术范式,它通过解析数据库日志(如MySQL的binlog)来获取数据变更,对业务代码无侵入,保证了数据同步的实时性和准确性。这项技术的核心价值在于解耦业务逻辑与数据同步逻辑,构建高效、可靠的实时数据管道。其典型应用场景包括实时报表生成、搜索索引更新、缓存刷新和用户画像实时计算等。本文聚焦于阿里巴巴开源的

weixin_34405557的博客 529

canal第三篇:配置多个instance

基于前两篇文章中的docker-composer.yaml调整 canal-server 在canal-server/conf/canal.properties 加入如下信息 …… # 多个使用 逗号 分割 canal.destinations = example,example2 …… instance.properties 在 canal-server/conf 创建文件夹 example 新建instance.properties example2 新建instance.properties.

凯 4459

详解 canal 同步 MySQL 增量数据到 ES

canal 是阿里知名的开源项目,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。这篇文章,我们手把手向同学们展示。

2023年最新地推相关信息 785

canal admin管理端配置-多个实例的创建(二)

单节点的canal服务注册到canal admin中

后端开发 3170

canal原理解析

目录 1原理 2.整体架构 2.重点解释 2.1instance 2.2 server,client 集群关系和原理 2.3 spring配置文件区别 上文已经介绍过canal的基本安装和使用,现在来看看canal的实现原理吧。 1原理 首先看一张图,这是canal官网上的mysql master-slave原理图。canal就是将自己伪装成slave,所以原理类似。 1.Mysql-master 将数据变更保存到 二进制日志Binary lo...

skyboertao的博客 1788

Canal架构及工作流程

Canal架构 Caner Server 一个Caner Server就代表一个canal运行实例,其对应于一个jvm 一个Caner Server同时对应着n个instance 一个instance对应着一个Mysql实例 Instance组成 一个instance由 EventParser eventSink eventStore MetaManager 这几部分组成 eventPa...

zhou12314的专栏 1560

多实例 canal应用-1个server+2个instance+2个client+2个mysql

canal应用-1个server+2个instance+2个client+2个mysql原创 一 canal应用架构设计 组件说明: 1 . linux内核版本(CentOS Linux 7):(命令:uname -a)Linux slave1 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x...

z69183787的专栏 4832

数据异构之 Canal 初探(技巧篇),2024年最新java面试常见算法题

在 Linux 环境中安装 canal 比较简单,大家可以安装官方手册一步一步操作即可,在这里我就不重复介绍,本节主要的目的是希望在开发工具中运行 Canal 的 Demo,以便后续在研究源码的过程中遇到难题时可以进行 Debug。接下来我根据官方的一些提示,结合自己的理解,编写出如下测试代码,在 IDEA 开发工具中实现运行 Canal 相关的 Demo。eventSink (Parser和Store链接器,进行数据过滤,加工,分发的工作)

2401_87555332的博客 831

mysql 2 instance_canal应用-1个server+2个instance+2个client+2个mysql

一 canal应用架构设计组件说明:linux内核版本(CentOS Linux 7):(命令:uname -a)Linux slave1 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linuxmysql版本:(SQL命令:select version(); 或 status)...

weixin_39611666的博客 199

canal应用三:启动多个Instance实例

文章目录前言2个Instance监听不同的库2个Instance监听相同的库 前言 Canal通过 canal.destinations 来配置对应的 Instance 实例,这里允许配置多个Instance,中间用逗号分开即可。 2个Instance监听不同的库 修改 canal.properties 文件,找到 canal.destinations 把他修改成 example1,example2 canal.destinations = example1,example2 在 conf 目录下

qq_28834355的博客 2946

大数据Canal(三):使用Canal同步MySQL数据

首先需要在Canal中配置CanalServer 对应的canal.properties,这个文件中主要配置Canal对应的同步数据实例(Canal Instance)位置信息及数据导出的模式,例如:我们需要将某个mysql中的数据同步到Kafka中,那么就可以创建一个“数据同步实例”,导出到Kafka就是一种模式。下面我们使用Canal同步MySQL数据到Kafka为例,学习下Canal如何同步MySQL数据。注意:“canal_topic”不需要提前创建,默认创建就是1个分区。

Lansonli(蓝深李)的博客 3823

canal-server使用

canal-server一直无法启动, 查看日志显示 admin:auth error原因: canal-server配置的参数, 账号密码使用错误(使用了canal-admin ui的登录账号和密码)部署的admin当天登录正常, 隔天登录后台就显示 network error原因: 使用启动canal-admin, 其限定了容器的内存为1G(参数 -m 1024), 因此服务启动后内存过大导致服务自动关闭.

ss810540895的博客 4424

【Canal】Canal 的整体架构图是怎样的?请描述 Server、Client、ZooKeeper(或 Manager)之间的关系

Canal 1.1.8 核心架构解析 Canal采用分层架构设计,关键组件包括: Server层:作为JVM进程容器,负责托管多个Instance(默认TCP 11111端口),提供资源隔离和生命周期管理 Instance层:每个Instance对应一个MySQL实例的CDC处理单元,包含Parser(拉取Binlog)、Sink(解析转换)、Store(内存队列)三模块 Client层:通过Canal协议订阅数据,支持Java SDK/Adapter/Flink CDC等形态,采用get/ack机制保证消

九师兄 110

Canal Server+Canal Admin

一、 Docker安装 二、 修改MySQL配置 2.1 修改my.cnf配置 对于自建 MySQL , 需要先开启 Binlog 写入功能,配置 binlog-format 为 ROW 模式,my.cnf 中配置如下 log-bin=mysql-bin # 开启 binlog binlog-format=ROW # 选择 ROW 模式 server_id=1 # 配置 MyS...

qq_29860591的博客 2124

手把手教学:用国产GLM-4.6替代Claude4.0,实现AI自动化编程全流程

本文提供了一份详细的教程,指导开发者使用国产GLM-4.6模型替代Claude 4.0,实现AI自动化编程。内容涵盖从获取API密钥、搭建本地环境、改造Claude Code工具到实战开发与VSCode集成的全流程,旨在帮助用户低成本、高效率地体验AI自主编程。

weixin_29070861的博客 553

海康视觉平台VisionMaster使用学习笔记(1)

双击图像源设置图像源的属性,像素格式分为Mono8和RDB24分别对应导入的图像是彩色还是黑白。打开相机驱动软件MVS,对连接的相机进行属性上的配置,先对相机的IP进行对应的设置。将自动触发的使能打开,保存配置好的相机属性,默认保存到用户集1中。点击MVS软件中的触发按钮,查看相机是否进行正常的触发拍照。打开VM软件添加一个图像源,选择图像源选项拖出图像源。回到VM软件中将选择相机选项选择到配置好参数的相机。取图方式也可以调整为相机取图,将图像源改为相机。双击相机进行连接后对相机的属性进行配置。

A567852的博客 1万+

canal容器安装

下载镜像: docker pull docker.io/canal/canal-server 容器安装 docker run -p 11111:11111 --name canal -d docker.io/canal/canal-server 进入容器,修改核心配置canal.properties 和instance.properties,canal.properties 是canal自身的配置,instance.properties是需要同步数据的数据库连接配置。 执行代码如下: do

myStyle的博客 2645

免费测试国外大模型Claude 3.7 Sonnet API:无需api key(秘钥)

Claude 3.7 Sonnet是Anthropic公司推出的第三代Claude系列AI模型中的中规模版本(2024年发布),在性能与效率间实现平衡。该模型基于改进的Transformer架构,支持128K上下文窗口,擅长复杂推理、数学计算和创意写作,在GSM8K数学基准测试中准确率达92%。其采用"宪法AI"伦理框架,通过多轮对抗训练减少有害输出,同时新增多模态理解能力(可解析图片/图表内容)。Claude 3.7 Sonnet是Anthropic推出的高效轻量级大模型,主打快速响应与成本优化。

Explinks的博客 1497

Canal技术解析:MySQL实时数据同步实战

数据库增量日志解析是构建实时数据管道的关键技术,其核心原理是通过监听数据库变更事件实现低延迟数据同步。作为阿里巴巴开源的MySQL binlog解析组件,Canal采用主从复制协议模拟机制,以毫秒级延迟捕获DDL/DML变更,广泛应用于缓存更新、搜索索引同步等场景。该技术通过Zookeeper实现高可用部署,支持将数据实时同步至Elasticsearch等下游系统。在数据集成领域,相比传统ETL工具,基于binlog的增量同步能显著降低源库压力,典型应用包括实时数仓构建、跨系统数据一致性保障等工程实践。

weixin_33724659的博客 542

告别卡顿!用AVPro Video在Unity 2022.3里流畅播放4K视频的保姆级配置流程

本文详细介绍了如何在Unity 2022.3中使用AVPro Video插件实现4K视频的流畅播放。从环境配置、插件选型到核心性能优化技巧,包括解码器设置、内存管理策略和多平台适配方案,帮助开发者彻底解决卡顿问题,提升视频播放体验。

weixin_32349561的博客 318

YOLOv8改进 | 注意力机制 | 添加HAttention(HAT)超分辨率重建助力小目标检测 (全网首发,超分辨率检测)

本文给大家带来的改进机制是HAttention注意力机制,混合注意力变换器(HAT)的设计理念是通过融合通道注意力和自注意力机制来提升单图像超分辨率重建的性能。通道注意力关注于识别哪些通道更重要,而自注意力则关注于图像内部各个位置之间的关系。HAT利用这两种注意力机制,有效地整合了全局的像素信息,从而提供更为精确的结果(这个注意力机制挺复杂的光代码就700+行),但是效果挺好的也是10月份最新的成果非常适合添加到大家自己的论文中。⭐⭐⭐⭐⭐(最新的改进机制)

Snu77的博客 1万+
上一篇: Centos7上安装Git
下一篇: canal之高可用架构设计与应用
javaee_sunny
博客等级 码龄11年 90粉丝 54原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值