记录使用cannel做数据同步

Canal介绍

canal官网地址:https://github.com/alibaba/canal

在这里插入图片描述
由上面两张图片可知:
Canal 模拟 MySql Slave 的交互协议,伪装自己为 MySql Slave ,向 MySql Master 发送dump 协议。

  • MySQL master将数据变更写入二进制日志binary log,简称Binlog。
  • MySQL slave将master的binary log拷贝到它自己的中级日志relay log
  • MySQL slave重放relay log操作,将变更数据同步到最新状态
    在这里插入图片描述

MySQL Binlog日志

MySQL 的Binlog可以说 MySQL 最重要的日志,它记录了所有的 DDL 和 DML语句,以事件形式记录。
MySQL默认情况下是不开启Binlog,因为记录Binlog日志需要消耗时间,官方给出的数据是有1%的性能损耗。

是否打开MySQL的binlog根据实际情况取舍
一般来说,在下面两种场景下会打开BinLog:

  • MySQL 主从集群部署时,需要将在 Master 端开启 Binlog,方便将数据同步到Slaves中。
  • 数据恢复,通过使用 MySQL Binlog 工具来使恢复数据。

Canal安装部署

MySQL配置

首先得有一个MySQL服务,并检查数据库配置是否正常,可以在数据库中执行以下语句查看:

--查看是否开启bin_log日志,value = on表示开启
SHOW VARIABLES LIKE 'log_bin';
-- 查看bin_log日志文件
SHOW BINARY LOGS;
--查看bin_log写入状态
SHOW MASTER STATUS;
--查看bin_log存储格式 = row
SHOW VARIABLES LIKE 'binlog_format';
--查看数据库服务id
SHOW VARIABLES LIKE 'server_id';

如果说没有上面的配置,与预期不符,大家需要修改配置文件 my.cnf(Linux)或者 my.ini(windows)

log-bin=D:/Apache/mysql-8.0.29-winx64/binlogs/mysql-bin.log//指定binlog存储的目录
binlog-format=row//选择ROW模式
binlog-do-db= xxxxDb //选择开启的数据库名
server-id=1 //配置mysql replaction需要定义,不要和canal的slavveID重复

正常开启状态下:
在这里插入图片描述
MySQL服务器这边基本上就搞定了,easy。
如果想给Canal担负一个账号,单独创建一个 并授权就可以了

-- 使用命令登录:mysql -u root -p
-- 创建用户 用户名:canal 密码:Canal@123456
create user 'canal'@'%' identified by 'Canal@123456';
--授权 *.*表示所有的库
grant SELECT.REPLICATION SLAVE,REPLICATION CLIENT on *.* to 'canal'@'%' identified by 'Canal@123456'

安装Canal

去官网下载页面进行下载 canal官网
在这里插入图片描述
下载后解压到本地目录,目录结构:
在这里插入图片描述
修改conf/canal.properties
在这里插入图片描述
对应的实例文件对应conf目录下的文件夹名称
在这里插入图片描述
修改example目录下的instance.properties配置文件,
将数据库链接和对应用户名密码修改成自己数据库的信息
在这里插入图片描述

项目代码中加入canal的依赖

<dependency>
     <
### 如何在Spring Boot中集成Cannel #### 背景介绍 Spring Boot 是一种流行的 Java 开发框架,它通过约定优于配置的方式简化了开发流程。而 Cannel 并不是一个标准的技术名称或者组件,可能是用户指代某种特定技术(如 Canal 或者 Channel)。如果假设这里的 “Cannel” 实际指的是阿里巴巴开源的 **Canal** 工具,则可以进一步探讨其与 Spring Boot 的集成。 Canal 是由阿里巴巴团队开发的一款用于捕获 MySQL 数据库 Binlog 日志并实时同步数据变化到其他系统的工具[^4]。它可以广泛应用于异步消息队列、搜索引擎索引更新以及缓存刷新等场景。 --- #### 集成步骤概述 以下是基于 Spring Boot 和 Canal 的典型集成方法: 1. **引入依赖** 在 `pom.xml` 文件中添加 Canal 客户端的相关 Maven 依赖项。 ```xml <!-- Canal Client --> <dependency> <groupId>com.alibaba.otter</groupId> <artifactId>canal.client</artifactId> <version>1.1.5</version> </dependency> <!-- 如果需要使用 JSON 解析 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> ``` 2. **编写 Canal 连接逻辑** 创建一个服务类来初始化 Canal 连接,并监听数据库的变化事件。 ```java import com.alibaba.otter.canal.client.CanalConnector; import com.alibaba.otter.canal.client.CanalConnectors; import com.alibaba.otter.canal.protocol.Message; public class CanalService { private static final String DESTINATION_NAME = "example"; // 替换为目标实例名 private static final String SERVER_IP = "127.0.0.1"; private static final int SERVER_PORT = 11111; // 默认端口 public void start() { CanalConnector connector = CanalConnectors.newSingleConnector(SERVER_IP, SERVER_PORT, DESTINATION_NAME, "", ""); try { connector.connect(); connector.subscribe(".*\\..*"); // 订阅所有表的数据变更 while (true) { Message message = connector.getWithoutAck(100); // 获取最多100条记录 long batchId = message.getId(); // 批次ID int size = message.getEntries().size(); // 当前批次的消息数量 if (batchId != -1 || size > 0) { // 判断是否有新数据 System.out.println(String.format("=====================> batchId:[%s], count:[%d]", batchId, size)); // 处理日志数据... } connector.ack(batchId); } } catch (Exception e) { e.printStackTrace(); } finally { connector.disconnect(); } } } ``` 3. **启动 CanalClientListener** 将上述逻辑封装为 Spring Bean 组件,并利用定时任务或其他触发机制运行该服务。 ```java @Component public class CanalStarter implements CommandLineRunner { @Autowired private CanalService canalService; @Override public void run(String... args) throws Exception { canalService.start(); } } ``` 4. **处理业务逻辑** 对于每一条获取的日志信息,可以根据实际需求将其写入 Kafka、RabbitMQ 等中间件,或者直接存储至目标数据库中。 --- #### 关键点说明 - **Canal Server 配置**: 确保已经部署好 Canal Server,并正确连接到对应的 MySQL 数据源[^4]。 - **线程安全**: 上述代码仅作为基础实现示例,在生产环境中需考虑多线程并发访问等问题。 - **异常处理**: 建议增加重试机制和断开重连功能以提高稳定性。 --- ### 性能优化建议 为了提升性能表现,可采取以下措施: 1. 使用批量读取代替单条查询操作; 2. 减少不必要的序列化/反序列化进程; 3. 合理设置订阅范围减少无用数据传输量。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值