Canal 和 MySQL 配置指南

1. 环境依赖

在开始配置之前,请确保已安装并配置以下环境:

  • Docker:用于运行 MySQL 和 Canal 的容器化服务。

  • MySQL:确保安装的是支持 binlog 的版本。

  • Canal:阿里巴巴开源的数据库增量订阅和消费组件。

2. MySQL 配置

为了使 Canal 能够正确监听 MySQL 的 binlog 日志,必须进行如下配置:

2.1 开启 binlog

MySQL 使用 binlog 来记录所有的数据库更改。确保 MySQL 配置文件中开启了 binlog,并将日志格式设置为 ROW

在 MySQL 的配置文件 my.cnfmy.ini 中添加或修改以下内容:

# 开启 binlog
log-bin=mysql-bin
​
# 设置 binlog 格式为 ROW 模式
binlog-format=ROW
​
# 为 MySQL 设置 server_id,确保唯一,避免与 Canal 的 slaveId 冲突
server_id=1

2.2 设置 MySQL 用户权限

为 Canal 分配足够的权限以读取 binlog。进入 MySQL 并执行以下命令,为 Canal 用户分配 REPLICATION SLAVEREPLICATION CLIENT 权限:

CREATE USER 'test'@'%' IDENTIFIED BY '123456';
​
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'test'@'%';

确保用户名、密码和主机名与 Canal 的配置一致。

3. Canal 配置

3.1 启动 Canal 容器

通过 Docker 启动 Canal 容器:

docker run --name canal -p 11111:11111 -d canal/canal-server

3.2 复制配置文件

为了自定义配置文件,可以将 Canal 容器内的 instance.properties 文件复制到宿主机,便于修改:

docker cp canal:/home/admin/canal-server/conf/example/instance.properties "D:/docker/canal/conf/"

其中"D:/docker/canal/conf/"是绝对路径,因为我发现如果输入 /d/docker/canal/conf/它其实寻找的是 "C:/d/docker/canal/conf/",所以这里设置绝对路径。

3.3 修改 instance.properties 配置文件

打开复制到本地的 instance.properties 文件,进行如下配置修改:

#################################################
## MySQL 配置
canal.instance.mysql.slaveId=1
​
# MySQL 地址与端口
canal.instance.master.address=172.17.0.3:3306  # MySQL 容器的 IP 地址
​
# MySQL 用户名与密码
canal.instance.dbUsername=test
canal.instance.dbPassword=123456
​
# 数据库表过滤规则
canal.instance.filter.regex=.*\\..*  # 订阅所有表

canal.instance.master.address=172.17.0.3:3306启动容器的时候指定自定义网络那么IP就可以换成容器名,如果默认是bridge网络,那么需要指定IP。

3.4 重新启动 Canal 容器并挂载配置文件

修改完配置文件后,重新启动 Canal 容器,并将本地修改过的配置文件挂载到容器内:

docker run --name canal -p 11111:11111 \-v /d/docker/canal/conf/instance.properties:/home/admin/canal-server/conf/example/instance.properties \--network bridge -d canal/canal-server

在这里,bridge 是你设置的 Docker 自定义网络,用于确保 Canal 和 MySQL 容器能通过网络相互通信。

4. Canal 集成到项目

4.1 Maven 依赖

将以下依赖添加到项目的 pom.xml 文件中:

<dependency><groupId>com.alibaba.otter</groupId><artifactId>canal.client</artifactId><version>1.1.5</version>
</dependency>
​
<dependency><groupId>com.alibaba.otter</groupId><artifactId>canal.protocol</artifactId><version>1.1.5</version>
</dependency>

4.2 编写 Canal 客户端代码

以下是 Canal 客户端代码的示例,用于连接 Canal 服务并监听 MySQL 数据库的变更:

package com.example.demo;
​
import com.alibaba.otter.canal.client.CanalConnector;
import com.alibaba.otter.canal.client.CanalConnectors;
import com.alibaba.otter.canal.protocol.CanalEntry;
import com.alibaba.otter.canal.protocol.Message;
​
import java.net.InetSocketAddress;
import java.util.List;
​
public class CanalClient {
​// Canal 服务地址private static final String CANAL_SERVER = "127.0.0.1";private static final int CANAL_PORT = 11111;private static final String DESTINATION = "example";
​public static void main(String[] args) {// 连接 Canal 服务CanalConnector connector = CanalConnectors.newSingleConnector(new InetSocketAddress(CANAL_SERVER, CANAL_PORT),DESTINATION, "", "");
​connector.connect();connector.subscribe(".*\\..*");connector.rollback();
​while (true) {// 获取数据Message message = connector.getWithoutAck(100);long batchId = message.getId();if (batchId != -1) {processEntries(message.getEntries());connector.ack(batchId);  // 确认处理成功}}}
​private static void processEntries(List<CanalEntry.Entry> entries) {for (CanalEntry.Entry entry : entries) {if (entry.getEntryType() != CanalEntry.EntryType.ROWDATA) {continue;}try {CanalEntry.RowChange rowChange = CanalEntry.RowChange.parseFrom(entry.getStoreValue());for (CanalEntry.RowData rowData : rowChange.getRowDatasList()) {switch (rowChange.getEventType()) {case INSERT:System.out.println("新增数据: " + rowData.getAfterColumnsList());break;case UPDATE:System.out.println("更新数据: " + rowData.getAfterColumnsList());break;case DELETE:System.out.println("删除数据: " + rowData.getBeforeColumnsList());break;default:break;}}} catch (Exception e) {e.printStackTrace();}}}
}

5. 常见问题及排查

5.1 Canal 无法连接 MySQL

  • 问题:出现 Connection refused 错误。

  • 原因:MySQL 容器的 IP 地址或端口未正确配置,或 MySQL 没有正确暴露端口。

  • 解决方案:检查 MySQL 容器的 IP 地址并确认在 instance.properties 中配置正确。

    • 进入到容器里面:docker exec -it canal /bin/bash

    • 找到存放日志的文件夹:cd canal-server/logs/example/

    • 查看最后一百行日志:tail -100 example.log

5.2 MySQL 用户权限问题

  • 问题:出现 SHOW MASTER STATUS 错误。

  • 原因:Canal 用户没有足够的权限读取 binlog。

  • 解决方案:确保 MySQL 中的 Canal 用户拥有 REPLICATION SLAVEREPLICATION CLIENT 权限。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/56381.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于ESP32的灌溉系统

精准灌溉优化与高效水资源利用&#xff1a;基于IoT的农业解决方案 引言 传统农业实践缺乏实时监控和高效操作&#xff0c;导致效率低下和产量不高。本项目旨在利用物联网&#xff08;IoT&#xff09;技术和低成本通信协议&#xff0c;设计一个解决方案来解决这一问题。提出的…

C++算法练习-day1——704.二分查找

题目来源&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目思路分析 二分查找是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始&#xff0c;如果中间元素正好是要查找的元素&#xff0c;则搜索过程结束&#xff1b;如果某一特定元素大…

Linux基础 -- 使用 cgroups 变更进程的CPU亲和性绑核

使用 cgroups 设置 CPU 绑定的教学文档 1. 使用 cgroups 设置 CPU 绑定 在 Linux 中&#xff0c;使用 cgroups 可以对进程进行 CPU 绑定&#xff0c;从而控制它们在哪些 CPU 核心上运行。以下是基本步骤&#xff1a; 创建 cgroup&#xff1a; mkdir /sys/fs/cgroup/cpuset/my…

Docker实践与应用举例

目录 1. 引言 2. Docker的基本概念 2.1 什么是Docker容器 2.2 Docker镜像 2.3 Docker架构 3. Docker的应用场景 3.1 开发与测试环境的隔离 3.2 持续集成与持续交付&#xff08;CI/CD&#xff09; 3.3 微服务架构 4. Docker的实践案例 4.1 部署Nginx反向代理 4.2 使用…

研发线上事故风险解读之缓存篇

专业在线打字练习平台-巧手打字通&#xff0c;只输出有价值的知识。 一 前言 本文继续基于《线上事故案例集》&#xff0c;进一步深入梳理线上事故缓存使用方面的问题点&#xff0c;重点关注缓存在使用和优化过程中可能出现的问题&#xff0c;旨在为读者提供具有实践指导意义的…

学习如何将Spring Boot Jar包注册成Windows服务

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 在开发Spring Boot应用时&#xff0c;我们通常通过命令行或IDE手动启动项目。然而&#xff0c;在生产环境中&#xff0c;为了提升效率和稳定性&#xff0c;我们更希望应用能够自动启动&#xff0c;并且作为Wi…

OpenCV高级图形用户界面(5)获取指定滑动条(trackbar)的当前位置函数getTrackbarPos()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 返回滑动条的位置。 该函数返回指定滑动条的当前位置。 cv::getTrackbarPos() 函数用于获取指定滑动条&#xff08;trackbar&#xff09;的当前…

【H2O2|全栈】JS入门知识(二)

目录 JS 前言 准备工作 运算符 算数运算符 比较运算符 自增、自减运算符 逻辑运算符 运算符的优先级 分支语句 if-else语句 switch语句 三元表达式 结束语 JS 前言 本系列博客主要分享JavaScript的基础语法知识&#xff0c;本期为第二期&#xff0c;包含一些简…

Linux基础命令系列一小白必掌握

前言 为了有一个大概的复习框架所以先给出总的思维导图&#xff0c;如图&#xff1a; 目录 1.Linux的目录结构&#xff1f;Linux命令与命令行是什么&#xff1f;Linux命令基础格式&#xff1f; 2.ls命令 3.cd命令 4.mkdir命令 5.touch命令 6.cat命令 7.cp命令 8.mv命令…

大数据开发电脑千元配置清单

大数据开发电脑配置清单 电脑型号HUANANZHI 台式电脑操作系统Windows 11 专业版 64位&#xff08;Version 23H2 / DirectX 12&#xff09;处理器英特尔 Xeon(至强) E5-2673 v3 2.40GHz主板HUANANZHI X99-P4T&#xff08;P55 芯片组&#xff09;显卡NVIDIA GeForce GT 610 ( 2…

PLM预训练语言模型Pre-trained Language Model

预训练语言模型&#xff08;Pre-trained Language Model&#xff0c;PLM&#xff09; gpt就是一个典型的例子 一、PLM 的定义与概念 预训练语言模型是一种在大规模文本数据上进行无监督学习得到的语言模型。它通过学习语言的统计规律、语法结构和语义表示&#xff0c;为各种自…

模板方法模式、策略模式(C++)

模板方法模式&#xff1a; 定义&#xff1a;定义一个操作算法的框架&#xff0c;实现步骤延迟到子类中去实现 策略模式&#xff1a; 定义&#xff1a;定义一系列的算法&#xff0c;把它们一个个封装起来&#xff0c;并且使它们可相互替换。该模式使得算法可独立于使用它的客户…

开源GenImage的图片检测工具使用指南

引言 GenImage是一款开源的图片检测工具&#xff0c;旨在帮助用户在各种应用场景中进行图像处理和分析。该工具具有灵活性、可扩展性和高效性&#xff0c;适合从事计算机视觉、图像处理和深度学习的研究人员和开发者使用。本文将详细介绍如何安装、配置和使用GenImage进行图片…

深入剖析递归算法:原理、特点、应用与优化策略

在上一篇文章&#x1f449;【剖析十大经典二叉树题目】中&#xff0c;运用到了大量的递归算法&#xff0c;故本文将解析递归算法。 目录 &#x1f4af;引言 &#x1f4af;递归算法的定义与原理 ⭐定义 ⭐原理 &#x1f4af;递归算法的特点 ⭐简洁性 ⭐可读性 ⭐通用性 …

linux下编译鸿蒙版boost库

我在上一篇文章中介绍了curl和openssl的编译方式&#xff08;linux下编译鸿蒙版curl、openssl-CSDN博客&#xff09;&#xff0c;这篇再介绍一下boost库的编译。 一.环境准备 1.鸿蒙NDK 下载安装方式可以参考上篇文章&#xff0c;完毕后NDK的路径为&#xff1a;/home/ubuntu…

Java学习Day47:戏耍黑手道人(项目记录)

1.项目背景 2.技术选择 3.环境搭建 1.创建空项目 创建health_parent父文件用来控制依赖&#xff0c;类型为quickStart 打包方式为&#xff0c;pom&#xff1a;用在父级工程或聚合工程中&#xff0c;用来做jar包的版本控制&#xff0c;必须指明这个聚合工程的打包方式为pom。…

信息抽取数据集处理——RAMS

引言 RAMS数据集&#xff08;RAMS&#xff1a;Richly Annotated Multilingual Schema-guided Event Structure&#xff09;由约翰斯霍普金斯大学于2020年发布&#xff0c;是一个以新闻为基础的事件抽取数据集。它标注了9,124个事件&#xff0c;涵盖了139种不同的事件类型和65种…

服务端技术架构演进之路

服务端技术架构演进之路 目录 服务端技术架构演进之路 0.架构中常见概念及理解 1.单机架构 2.应用数据分离架构 3.应用服务器集群架构 4.读写分离/主从分离架构 5.冷热分离架构 6.垂直分库架构 7.微服务架构 8.容器编排架构 本文以一个 " 电子商务 " 应…

Android 未来可能支持 Linux 应用,Linux 终端可能登陆 Android 平台

近日&#xff0c;根据 android authority 的消息&#xff0c;Google 正在开发适用于 Android 的 Linux 终端应用&#xff0c;而终端应用可以通过开发人员选项启用&#xff0c;并将 Debian 安装在虚拟机中。 在几周前&#xff0c;Google 的工程师开始为 Android 开发新的 Termi…

R语言绘图——文本注释

在R语言中&#xff0c;文本注释通常用于向图形中添加注释或说明&#xff0c;可以通过一些函数在图形上添加文字、标签等。以下是R中处理文本注释的常见函数和方法。 0x01 text()函数 一、常见语法 text() 函数允许你在绘图的指定位置上添加文字注释。其常用语法如下&#xf…