✅技术社区—通过Canal框架实现MySQL与ElasticSearch的数据同步

news2025/1/13 13:54:33

Canal 是一个由阿里巴巴开源的,基于 Java 的数据库变更日志解析的中间件,其原理是基于Binlog订阅的方式实现,模拟一个MySQL Slave 订阅Binlog日志,从而实现CDC,主要用于实现 MySQL 数据库的增量数据同步。它主要的使用场景包括数据库备份、实时数据同步、以及构建数据湖等。Canal 通过模拟 MySQL Slave 的行为,连接到 MySQL Master,实时地解析 Master 节点的 Binlog 日志,然后提取出数据变更信息,支持将数据变更同步到多种类型的下游系统,如 Kafka、ElasticSearch、HBase 等。

为什么要选Canal来进行数据同步

MySQL向ES(elasticsearch)做数据同步其实同步数据有很多方式,有双写同步数据,异步同步数据:前者双写同步数据我们肯定不用的,它实现原理是同时向MVSQL和ES中写入数据,这种性能慢不说,还存在二者还涉及到了分布式事务了,无法保证数据一致性问题,而且还将业务深深耦合起来了,无法做扩展,因此pass。后者异步同步数据方案比较多,比如目前市面上比较火的阿里的Canal和Debezium工具等等,他们都是利用的CDC(数据抓取变更),监听binlog日志做的同步。由于后者Debezium需要集成Kafka,而且需要手写Kafka消费者代码去同步,使得系统更加复杂,实现起来相对Canal比较复杂,因此采用了阿里Canal去做数据同步。

主从复制原理

MySQL的主从复制是依赖于 binlog,也就是记录 MySQL 上的所有变化并以二进制形式保存在磁盘上二进制日志文件。

主从复制就是将 binlog 中的数据从主库传输到从库上,一般这个过程是异步的,即主库上的操作不会等待 binlog 同步地完成。

详细流程如下:

1.主库写 binlog:主库的更新 SQL(update、insert、delete) 被写到 binlog;

2.主库发送 binlog:主库创建一个 log dump 线程来发送 binlog 给从库;

3.从库写 relay log:从库在连接到主节点时会创建一个 IO 线程,以请求主库更新的 binlog,并且把接收到的 binlog 信息写入一个叫做 relay log 的日志文件;

4.从库回放:从库还会创建一个 SQL 线程读取 relay log 中的内容,并且在从库中做回放,最终实现主从的一致性。

Canal工作原理

  1. 模拟 Slave:Canal 服务端模拟 MySQL 的 Slave,通过 MySQL 提供的dump协议连接到 MySQL 的 Master 节点。
  2. 读取和解析Binlog:MySQL 的 master 节点接收到 dump 请求后推送 Binlog 日志给 Canal 服务端,解析 Binlog 对象(原始为byte 流)转成 Json 格式;
  3. 数据同步:Canal 客户端通过 TCP 协议或 MQ 形式监听 Canal 服务端,将解析后的数据变更信息推送到配置的下游系统或应用(Kafka、ElasticSearch、HBase),如通过 Canal Client API 拉取数据变更,或者配置 Canal Adapter 自动同步到特定的数据存储系统。

工作流程

  1. 配置 MySQL:开启 MySQL 的 Binlog 日志记录,并配置 Canal 连接 MySQL 的权限,确保 Canal 可以作为 Slave 连接到 MySQL Server。
  2. 启动 Canal Server:部署并启动 Canal Server,Canal Server 会连接到 MySQL Server,开始监听 Binlog 日志的变更。
  3. 数据解析:Canal Server 解析 Binlog 日志文件,识别数据变更事件,并将这些事件转换为内部数据格式。
  4. 数据同步:通过 Canal Client API 或者配置 Canal Adapter,将解析后的数据变更同步到 ElasticSearch。这一步可以根据实际业务需求定制数据同步的逻辑,例如根据数据变更类型(插入、更新、删除)更新 ElasticSearch 的索引。
  5. 实时搜索:随着 ElasticSearch 索引的实时更新,搜索服务能够提供基于最新数据的搜索结果,保证了搜索的准确性和高效性。

术语补充解释:

Canal Server:Canal的服务端组件,负责连接到MySQL服务器,实时读取并解析MySQL的Binlog日志,然后将解析后的数据变更信息提供给Canal Client或同步到其他中间件。

Canal Adapter:Canal的适配器组件,用于将Canal Server解析出的数据变更信息同步到各种类型的下游系统或中间件中,如Elasticsearch、Kafka等。

instance:实例,在这里通常指Canal的一个运行实例,对应于MySQL中的一个数据库或一组数据库。每个instance独立工作,可以有自己的配置和同步逻辑。

Relay Log:在 MySQL 的主从复制架构中,中继日志(Relay Log)是从服务器(Slave)上的一个关键组件。中继日志用于存储从主服务器(Master)复制过来的二进制日志(Binary Log)事件。这些日志文件在从服务器上被重放(执行),以此来确保从服务器的数据与主服务器保持一致。

操作流程

要在本地使用 Canal 实现 MySQL 数据库和 Elasticsearch 的同步,需要先部署 Canal 和配置 Elasticsearch,然后通过 Canal Adapter 实现数据的同步。

增量同步指的是仅同步自上次同步以来在数据库中发生变更的数据,而不是每次都同步全部数据。

步骤概述

  1. 部署 Canal Server:首先需要在本地安装并启动 Canal Server,使其连接到你的 MySQL 数据库,并开始监听 Binlog 日志。
  2. 配置 Elasticsearch:确保本地已经安装并启动 Elasticsearch。
  3. 使用 Canal Adapter:Canal 提供了官方的 Adapter,用于将数据同步到 Elasticsearch。需要配置 Adapter 以连接到你的 Elasticsearch 实例。

示例配置

1. Canal Server 配置

在 Canal 的配置文件 instance.properties 中,配置 MySQL 数据源信息,以及开启的 Binlog 文件和位置:

canal.instance.master.address=127.0.0.1:3306
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.connectionCharset=UTF-8
canal.instance.tsdb.enable=true
canal.instance.gtidon=false

2. Canal Adapter 配置

application.yml 中配置 Elasticsearch 的连接信息:

spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
server:
  port: 8081
logging:
  level:
    com.alibaba.otter: DEBUG
canal.conf:
  canalServerHost: 127.0.0.1:11111
  flatMessage: true
  canalInstances:
  - instance: example # Canal instance 名称
    groups:
    - outAdapters:
      - key: es
        hosts: 127.0.0.1:9200 # Elasticsearch 地址
        properties:
          cluster.name: elasticsearch

还需要在 src/main/resources/es/mapping 目录下配置同步的表和索引的映射关系。例如,如果你想同步 mydb.user 表到 Elasticsearch,你需要创建一个对应的映射文件 user.yml

dataSourceKey: defaultDS
destination: example
groupId: g1
esMapping:
  _index: user_index
  _type: _doc
  _id: _id
  sql: "SELECT id as _id, name, age FROM user"
  commitBatch: 3000

3. 启动 Canal Adapter

配置好之后,启动 Canal Adapter。它会自动连接到 Canal Server 和 Elasticsearch,根据配置的映射关系同步数据。

增量同步说明

Canal 通过监听 MySQL 的 Binlog 来实现增量数据同步。当在 MySQL 中对数据进行 INSERT、UPDATE、DELETE 操作时,这些变更会被记录在 Binlog 中。Canal Server 解析 Binlog,获取这些变更,然后 Canal Adapter 根据配置将变更的数据同步到 Elasticsearch。这个过程只同步变更的数据,而不是数据库中的全部数据,因此被称为增量同步。

注意:本示例的配置和代码只是一个基本的指导,具体细节(如版本兼容性、安全设置等)需要根据你的实际环境和需求进行调整。

使用场景

  • 数据库同步:实现从一个数据库实时同步数据到另一个数据库,常见于主从复制、读写分离等场景。
  • 数据迁移与备份:在不影响源数据库性能的前提下,实时备份数据,用于灾备或者数据迁移。
  • 数据仓库构建:将业务数据库的增量数据实时同步到数据仓库中,用于后续的数据分析和挖掘。
  • 搜索引擎索引更新:实时将数据库中的变更同步到搜索引擎(如 ElasticSearch),保持搜索数据的实时性和准确性。

优势

  • 实时性:Canal 基于 Binlog 的增量数据同步机制,能够实现接近实时的数据同步。
  • 低侵入性:Canal 通过模仿 MySQL Slave 的方式进行数据同步,无需修改 MySQL Server 的任何配置(只需开启 Binlog)。
  • 灵活性:Canal 支持多种数据源和数据目的地的同步,用户可以根据需要灵活配置同步任务。
  • 高可用性:Canal 支持集群部署,通过负载均衡和故障转移机制,提高数据同步的稳定性和可靠性。

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

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

相关文章

Linux:PostGreSQL|PostGIS部署

由于更换了云服务器,需要重新部署PostGreSQL|PostGIS,所以记录一下Linux CentOS 7 x86-64环境下,PostGreSQL|PostGIS的部署过程。 参考文档:PostgreSQL: Linux downloads (Red Hat family)。 yum安装PostGreSQL 通过yum安装PostG…

PC-DARTS: PARTIAL CHANNEL CONNECTIONS FOR MEMORY-EFFICIENT ARCHITECTURE SEARCH

PC-DARTS:用于内存高效架构搜索的部分通道连接 论文链接:https://arxiv.org/abs/1907.05737 项目链接:https://github.com/yuhuixu1993/PC-DARTS ABSTRACT 可微分体系结构搜索(DARTS)在寻找有效的网络体系结构方面提供了一种快速的解决方案…

网络编程-套接字相关基础知识

1.1. Socket简介 套接字&#xff08;socket&#xff09;是一种通信机制&#xff0c;凭借这种机制&#xff0c; 客户端<->服务器 模型的通信方式既可以在本地设备上进行&#xff0c;也可以跨网络进行。 Socket英文原意是“孔”或者“插座”的意思&#xff0c;在网络编程…

ROS——ROS安装遇到的问题

1、添加ROS软件源 打开终端&#xff0c;将下面这条命令复制到ubuntu的终端执行 sudo sh -c . /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.list2、添加密钥 …

Java面试题总结200道(三)

51、什么是 Spring IOC 容器 Spring 框架的核心是 Spring 容器。容器创建对象&#xff0c;将它们装配在一起&#xff0c;配置它 们并管理它们的完整生命周期。Spring 容器使用依赖注入来管理组成应用程序的 组件。容器通过读取提供的配置元数据来接收对象进行实例化&#xff0…

Windows Docker 部署 Solr 搜索引擎

一、简介 Solr 是 Apache 下的一个顶级开源项目&#xff0c;采用 Java 开发&#xff0c;它是基于 Lucene 的全文搜索服务器。Solr 可以独立运行在 Jetty、Tomcat 等这些 Servlet 容器中。Solr 提供了比 Lucene 更为丰富的查询语言&#xff0c;同时实现了可配置、可扩展&#x…

OpenHarmony4.0对RK3566的烧写过程

前面已经编译的过程搞了比较长的时间,因为遇到了不少问题,老是编译出错,后来经过努力还是编译成功了。 我这里主要针对RK3566的Purple Pi OH开发板,如下图: 因为开源鸿蒙里没有针对这个板的特殊配置,需要下载下面这个文件: purple-pi-oh-patch.zip 这个文件里包含了可…

(二)OpenOFDM频偏校正

频偏校正 This paper [1]解释了频率偏移发生的原因以及如何纠正它。简而言之&#xff0c;有两种类型的频率偏移。第一个称为载波频率偏移 (CFO)&#xff0c;是由发射器和接收器的本地振荡器 (LO) 之间的差异引起的。这种偏移的症状是输入 I/Q 样本&#xff08;时域&#xff09…

国际前十正规外汇实时行情走势app软件最新排名(综合版)

外汇交易&#xff0c;作为当今世界金融市场上一个重要的板块&#xff0c;备受关注和热议。随着金融市场的日益发展&#xff0c;外汇交易也发展成为一个新兴的投资交易渠道。为了更好地满足投资者对外汇市场的需求&#xff0c;外汇实时行情走势app软件应运而生&#xff0c;它为投…

R语言聚类分析-K均值聚类与系统聚类法

一、数据集为firm.csv&#xff0c;给出了22家美国公用事业公司的相关数据集&#xff0c;各数据集变量的名称和含义如下&#xff1a;X1为固定费用周转比&#xff08;收入/债务&#xff09;&#xff0c;X2为资本回报率&#xff0c;X3为每千瓦容量成本&#xff0c;X4为年载荷因子&…

YOLOv9详解

1.概述 在逐层进行特征提取和空间转换的过程中&#xff0c;会损失大量信息&#xff0c;例如图中的马在建模过程中逐渐变得模糊&#xff0c;从而影响到最终的性能。YOLOv9尝试使用可编程梯度信息PGI解决这一问题。 具体来说&#xff0c; PGI包含三个部分&#xff0c;&#xff0…

LeetCode每日一题[C++]-310.最小高度树

题目描述 树是一个无向图&#xff0c;其中任何两个顶点只通过一条路径连接。 换句话说&#xff0c;一个任何没有简单环路的连通图都是一棵树。 给你一棵包含 n 个节点的树&#xff0c;标记为 0 到 n - 1 。给定数字 n 和一个有 n - 1 条无向边的 edges 列表&#xff08;每一个…

数据过滤的练习

定义一个集合&#xff0c;并添加一些整数1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#xff0c;7&#xff0c;8&#xff0c;9&#xff0c;10&#xff0c;过滤奇数&#xff0c;只留下偶数&#xff0c;并将结果保存起来。 package MyStream;import j…

SAP Activate项目管理方法论路线图

SAP Activate 是 SAP 推出的一种基于敏捷方法论的灵活、快速且引导式的实施方法论&#xff0c;专为加速SAP S/4HANA和其他SAP解决方案的部署而设计。这个方法论结合了最佳实践、引导配置和方法论本身的强大能力&#xff0c;以确保项目的快速实施和成功部署。SAP Activate的核心…

MySQL中出现‘max_allowed_packet‘ variable.如何解决

默认情况下&#xff0c;MySQL的max_allowed_packet参数可能设置得相对较小&#xff0c;这对于大多数常规操作来说足够了。但是&#xff0c;当你尝试执行包含大量数据的操作&#xff08;如大批量插入或大型查询&#xff09;时&#xff0c;可能会超过这个限制&#xff0c;从而导致…

Bit的下载及安装和错误解决方案

文章目录 一、Git初识二、Git安装三、使用四、*可能出现的问题及解决方案1、vscode中没有Git Bash 一、Git初识 1、概念&#xff1a;一个免费开源、分布式的代码版本控制系统&#xff0c;帮助开发团队维护代码 2、作用&#xff1a;记录代码内容&#xff0c;切换代码版本&#x…

(官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell

前言 查了很多资料都不靠谱&#xff0c;在安装过程中遇到很多的坑&#xff0c;mangoDB 服务重视起不来&#xff1b;出现了很多难以解决的报错&#xff0c;现在把安装过程中遇到的问题&#xff0c;和如何闭坑说一下&#xff0c;很多时候都是准备工作不足导致的&#xff1b;很多方…

【论文笔记合集】ARIMA 非平稳过程通过差分转化为平稳过程

本文作者&#xff1a; slience_me 文章目录 ARIMA 非平稳过程通过差分转化为平稳过程文章原文具体解释详解参照 ARIMA 非平稳过程通过差分转化为平稳过程 文章原文 Many time series forecasting methods start from the classic tools [38, 10]. ARIMA [7, 6] tackles the fo…

【C/C++】C/C++招聘信息管理系统(源码)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

多线程(代码案例: 单例模式, 阻塞队列, 生产者消费者模型,定时器)

设计模式是什么 类似于棋谱一样的东西 计算机圈子里的大佬为了能让小菜鸡的代码不要写的太差 针对一些典型的场景, 给出了一些典型的解决方案 这样小菜鸡们可以根据这些方案(ACM里面叫板子, 象棋五子棋里叫棋谱, 咱这里叫 设计模式), 略加修改, 这样代码再差也差不到哪里去 … …