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

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 支持集群部署,通过负载均衡和故障转移机制,提高数据同步的稳定性和可靠性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

理解计算属性等

计算属性 计算属性的作用是将写在computed内的写了对应的属性名,属性值都是函数,将这属性值的函数调用之后的返回值赋给属性名的变量。因此其实计算属性内的是值,不是方法,因此写插值等语句是只是写变量,而不是调用。且…

第三篇 - 概述- IAB受众和技术标准 - IAB视频广告标准《数字视频和有线电视广告格式指南》

第三篇 - 概述- IAB受众和技术标准​​​​​​​ - 我为什么要翻译介绍美国人工智能科技公司IAB技术标准系列(2) 本文目录 一、IAB技术实验室简介 二、概述及IAB受众 三、资源- IAB倡导的相关视频广告技术标准 四、案例分享-介绍一家数字化营销服务…

STM32F407_多点电容触摸(GT911)驱动

目录标题 前言1、简单介绍2、触摸芯片与主机的硬件连接3、内部寄存器3.1、控制寄存器(0X8040)3.2、配置寄存器组(0X8047~0X8100)3.3、状态寄存器(0x814E)3.4、坐标寄存器(0x8150-0x8177) 4、初始化流程4.1、IIC地址选择4.2、更新G…

OpenHarmony—应用UX设计原则

设计原则 当为多种不同的设备开发应用时,有如下设计原则: 差异性 充分了解所要支持的设备,包括屏幕尺寸、交互方式、使用场景、用户人群等,对设备的特性进行针对性的设计。 一致性 除了要考虑每个设备的特性外,还…

修复 error Delete `␍` prettier/prettier 错误

修复 error Delete ␍ prettier/prettier 错误 问题背景报错信息报错原因解决办法修改CRLF----针对单个文件yarn run lint --fix 一键修复(官方提供) 问题背景 今天在使用 openapi 自动生成前端接口代码的时候,爆了一个类似 eslint 规范的错…

AtCoder Beginner Contest 345 A - E 题解

A - Leftrightarrow 思路 判断第一个字符是否为&#xff0c;最后一个字符是否为&#xff0c;都满足的话&#xff0c;再判断中间字符是否都为 代码 #include<iostream> using namespace std; #define int long longbool check(string s){int ns.size();if(s[0]!<) …

Elasticsearch 索引库操作 文档操作

索引库就类似数据库表&#xff0c;mapping映射就类似表的结构。要向es中存储数据&#xff0c;必须先创建“库”和“表”。 mapping映射属性 mapping是对索引库中文档的约束&#xff0c;常见的mapping属性包括&#xff1a; type&#xff1a; 字段数据类型&#xff0c;常见的简…

Gogs 创建新的仓库并提交代码

Gogs 创建新的仓库并提交代码 1. 登录2. 仓库 -> 我的仓库3. 创建新的仓库4. 仓库5. Copy6. 公开代码​7. 提交成功 Gogs - gitReferences Gogs 是一款极易搭建的自助 Git 服务。 1. 登录 2. 仓库 -> 我的仓库 3. 创建新的仓库 4. 仓库 5. Copy 6. 公开代码 strongfo…

SpringBoot(RESTful,统一响应结构,输出日志,增删改查功能,分页功能,批量删除,常见bug)【详解】

目录 一、准备工作 1. 前后端分离开发流程 2. 开发规范 1.RESTful请求风格 2.统一响应结果 3.代码中输出日志 二、部门管理&#xff08;增删改查功能&#xff09; 1. 查询部门列表 2. 删除部门 3. 新增部门 4. 修改部门 三、员工管理&#xff08;分页功能和批量删除…

数字后端 EDA 软件分享

数字后端 EDA 软件分享 推荐这几家的EDA工具吧&#xff0c;虽说我也支持国产工具&#xff0c;但是我还是选择了这几家的工具 apache cadence mentor synopsys 下图我现在用的eda环境&#xff0c;利用网上的资源&#xff0c;自己独立在vmware上搭建好的EDA环境 除去pdk&#…

MySQL语法分类 DQL(6)分页查询

为了更好的学习这里给出基本表数据用于查询操作 create table student (id int, name varchar(20), age int, sex varchar(5),address varchar(100),math int,english int );insert into student (id,name,age,sex,address,math,english) values (1,马云,55,男,杭州,66,78),…

Matlab/simulink基于模糊PID智能控制的温度控制系统建模仿真

参考文献 Matlab/simulink基于模糊PID智能控制的温度控制系统建模仿真 该系统主要对某小区换热站的温度控制策略和控制方案进行了设计&#xff0c;其设计内 容主要包括三部分。首先是基于模糊PID智能控制的温度控制系统设计。在温度控制 算法方面&#xff0c;该设计于传统的P…

MySQL实战:监控

监控指标 性能类指标 名称说明QPS数据库每秒处理的请求数量TPS数据库每秒处理的事务数量并发数数据库实例当前并行处理的会话数量连接数连接到数据库会话的数量缓存命中率Innodb的缓存命中率 功能类指标 名称说明可用性数据库是否正常对外提供服务阻塞当前是否有阻塞的会话…

操作系统:malloc与堆区内存管理

malloc是函数而不是系统调用&#xff0c;他的底层是同调调用brk和mmap这两个系统调用实现功能的&#xff0c;具体选择brk还是mmap要看申请的空间大小以及malloc中的阈值&#xff08;一般是128kb&#xff09; 注意申请的空间只有使用才会触发缺页中断映射到物理内存 不理解的话先…

搞机笔记 MI8 dipper

刷回MIUI 之前刷了 lineage-19.1-20220728-nightly-dipper-signed 基于安卓12&#xff0c;实现了以下功能 TWRPmagisk & ROOTmicroG 退回MIUI的原因有&#xff1a; lineage 墓碑 管不住APP后台&#xff0c;太卡了MIUI提供了3GB的虚拟内存lineage 不支持人脸识别lineag…

小蓝的漆房——算法思路

题目链接&#xff1a;1.小蓝的漆房 - 蓝桥云课 (lanqiao.cn) 本题只要是通过枚举的方法&#xff0c;算出涂成每一种颜色所需的天数&#xff0c;最后在所有天数中找出最小值&#xff08;由题可知&#xff0c;最多只有60种颜色&#xff0c;所以可以尝试算出每种颜色所需的时间&am…

在雄安新区买新房要注意什么?有哪些注意事项?

雄安新区新建住宅均价每平方米11735元起&#xff0c;二手房每平方米8950元起。 整体价格非常有优势。 雄安新区房价走势与区域发展直接相关。 而且&#xff0c;雄安新区已经成立五周年了。 2022年&#xff0c;雄安新区多项重点项目将陆续竣工。 雄安新区城市基础设施建设已初具…

Spring注解开发(Spring学习笔记六)

1、在Spring4之后&#xff0c;要使用注解开发&#xff0c;必须保证aop包的导入 2、使用注解需要导入context约束&#xff0c;增加注解的支持(没有注解和支持注解是使用不了的) <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http:/…

用尾插的思路实现 “合并两个有序链表”

一、题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#…

二. CUDA编程入门-CUDA中的线程与线程束

目录 前言0. 简述1. 执行一下我们的第一个CUDA程序2. CUDA中的grid和block3. block和thread的遍历(traverse)4. nvcc编译器5. Makefile部分6. 执行我们的第二个CUDA程序7. Makefile添加的部分总结参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接…