MySQL | 实战 | 4 种将数据同步到ES方案

文章目录

  • 1. 前言
  • 2. 数据同步方案
    • 2.1 同步双写
    • 2.2 异步双写
    • 2.3 定时更新
    • 2.4 基于 Binlog 实时同步
  • 3. 数据迁移工具选型
    • 3.1 Canal
    • 3.2 阿里云 DTS
    • 3.3 Databus
    • 3.4 Databus和Canal对比
    • 3.4 其它
  • 4. 后记

上周听到公司新同事分享 MySQL 同步数据到 ES 的方案,发现很有意思,感觉有必要将这块知识点再总结提炼一下,就有了这篇文章。

1. 前言

在实际项目开发中,我们经常将 MySQL 作为业务数据库,ES 作为查询数据库,用来实现读写分离,缓解 MySQL 数据库的查询压力,应对海量数据的复杂查询。
这其中有一个很重要的问题,就是如何实现 MySQL 数据库和 ES 的数据同步,今天和大家聊聊 MySQL 和 ES 数据同步的各种方案。
我们先看看下面 4 种常用的数据同步方案。

2. 数据同步方案

2.1 同步双写

这是一种最为简单的方式,在将数据写到 MySQL 时,同时将数据写到 ES。
在这里插入图片描述
优点:

  • 业务逻辑简单;
  • 实时性高。
    缺点:
  • 硬编码,有需要写入 MySQL 的地方都需要添加写入 ES 的代码;
  • 业务强耦合;
  • 存在双写失败丢数据风险;
  • 性能较差,本来 MySQL 的性能不是很高,再加一个 ES,系统的性能必然会下降。

2.2 异步双写

针对多数据源写入的场景,可以借助 MQ 实现异步的多源写入。
在这里插入图片描述
优点:

  • 性能高;
  • 不易出现数据丢失问题,主要基于 MQ 消息的消费保障机制,比如 ES 宕机或者写入失败,还能重新消费 MQ 消息;
  • 多源写入之间相互隔离,便于扩展更多的数据源写入。
    缺点:
  • 硬编码问题,接入新的数据源需要实现新的消费者代码;
  • 系统复杂度增加,引入了消息中间件;
  • MQ是异步消费模型,用户写入的数据不一定可以马上看到,造成延时。

2.3 定时更新

上面两种方案中都存在硬编码问题,代码的侵入性太强,如果对实时性要求不高的情况下,可以考虑用定时器来处理:

  1. 数据库的相关表中增加一个字段为 timestamp 的字段,任何 CURD 操作都会导致该字段的时间发生变化;
  2. 原来程序中的 CURD 操作不做任何变化;
  3. 增加一个定时器程序,让该程序按一定的时间周期扫描指定的表,把该时间段内发生变化的数据提取出来;
  4. 逐条写入到 ES 中。
    在这里插入图片描述

优点:

  • 不改变原来代码,没有侵入性、没有硬编码;
  • 没有业务强耦合,不改变原来程序的性能;
  • Worker 代码编写简单不需要考虑增删改查。
    缺点:
  • 时效性较差,由于是采用定时器根据固定频率查询表来同步数据,尽管将同步周期设置到秒级,也还是会存在一定时间的延迟;
  • 对数据库有一定的轮询压力,一种改进方法是将轮询放到压力不大的从库上。

经典方案:借助 Logstash 实现数据同步,其底层实现原理就是根据配置定期使用 SQL 查询新增的数据写入 ES 中,实现数据的增量同步。

2.4 基于 Binlog 实时同步

上面三种方案要么有代码侵入,要么有硬编码,要么有延迟,那么有没有一种方案既能保证数据同步的实时性又没有代入侵入呢?当然有,可以利用 MySQL 的 Binlog 来进行同步。
在这里插入图片描述
具体步骤如下:

  • 读取 MySQL 的 Binlog 日志,获取指定表的日志信息;
  • 将读取的信息转为 MQ;
  • 编写一个 MQ 消费程序;
  • 不断消费 MQ,每消费完一条消息,将消息写入到 ES 中。
    优点:
  • 没有代码侵入、没有硬编码;
  • 原有系统不需要任何变化,没有感知;
  • 性能高;
  • 业务解耦,不需要关注原来系统的业务逻辑。
    缺点:
  • 构建 Binlog 系统复杂;
  • 如果采用 MQ 消费解析的 Binlog 信息,也会像方案二一样存在 MQ 延时的风险。

3. 数据迁移工具选型

对于上面 4 种数据同步方案,“基于 Binlog 实时同步”方案是目前最常用的,也诞生了很多优秀的数据迁移工具,这里主要对这些迁移工具进行介绍。
这些数据迁移工具,很多都是基于 Binlog 订阅的方式实现,模拟一个 MySQL Slave 订阅 Binlog 日志,从而实现 CDC(Change Data Capture),将已提交的更改发送到下游,包括 INSERT、DELETE、UPDATE。

3.1 Canal

基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持 MySQL。
Canal 原理就是伪装成 MySQL 的从节点,从而订阅 master 节点的 Binlog 日志,主要流程为:

  1. Canal 服务端向 MySQL 的 master 节点传输 dump 协议;
  2. MySQL 的 master 节点接收到 dump 请求后推送 Binlog 日志给 Canal 服务端,解析 Binlog 对象(原始为 byte 流)转成 Json 格式;
  3. Canal 客户端通过 TCP 协议或 MQ 形式监听 Canal 服务端,同步数据到 ES。
    在这里插入图片描述
    下面是 Cannel 执行的核心流程,其中 Binlog Parser 主要负责 Binlog 的提取、解析和推送,EventSink 负责数据的过滤 、路由和加工,仅作了解即可。
    在这里插入图片描述

3.2 阿里云 DTS

数据传输服务 DTS(Data Transmission Service)支持 RDBMS、NoSQL、OLAP 等多种数据源之间的数据传输。
它提供了数据迁移、实时数据订阅及数据实时同步等多种数据传输方式。相对于第三方数据流工具,DTS 提供丰富多样、高性能、高安全可靠的传输链路,同时它提供了诸多便利功能,极大方便了传输链路的创建及管理。
特点:

  • 多数据源:支持 RDBMS、NoSQL、OLAP 等多种数据源间的数据传输;
  • 多传输方式:支持多种传输方式,包括数据迁移、实时数据订阅及数据实时同步;
  • 高性能:底层采用了多种性能优化措施,全量数据迁移高峰期时性能可以达到70MB/s,20万的TPS,使用高规格服务器来保证每条迁移或同步链路都能拥有良好的传输性能;
  • 高可用:底层为服务集群,如果集群内任何一个节点宕机或发生故障,控制中心都能够将这个节点上的所有任务快速切换到其他节点上,链路稳定性高;
  • 简单易用:提供可视化管理界面,提供向导式的链路创建流程,用户可以在其控制台简单轻松地创建传输链路;
  • 需要付费

再看看 DTS 的系统架构。
在这里插入图片描述

  • 高可用:数据传输服务内部每个模块都有主备架构,保证系统高可用。容灾系统实时检测每个节点的健康状况,一旦发现某个节点异常,会将链路快速切换到其他节点。
  • 数据源地址动态适配:对于数据订阅及同步链路,容灾系统还会监测数据源的连接地址切换等变更操作,一旦发现数据源发生连接地址变更,它会动态适配数据源新的连接方式,在数据源变更的情况下,保证链路的稳定性。
    更多内容,请查看阿里官方文档:https://help.aliyun.com/product/26590.html

3.3 Databus

Databus 是一个低延迟、可靠的、支持事务的、保持一致性的数据变更抓取系统。由 LinkedIn 于 2013 年开源。
Databus 通过挖掘数据库日志的方式,将数据库变更实时、可靠的从数据库拉取出来,业务可以通过定制化 client 实时获取变更并进行其他业务逻辑。
特点:

  • 多数据源:Databus 支持多种数据来源的变更抓取,包括 Oracle 和 MySQL。
  • 可扩展、高度可用:Databus 能扩展到支持数千消费者和事务数据来源,同时保持高度可用性。
  • 事务按序提交:Databus 能保持来源数据库中的事务完整性,并按照事务分组和来源的提交顺寻交付变更事件。
  • 低延迟、支持多种订阅机制:数据源变更完成后,Databus 能在毫秒级内将事务提交给消费者。同时,消费者使用D atabus 中的服务器端过滤功能,可以只获取自己需要的特定数据。
  • 无限回溯:对消费者支持无限回溯能力,例如当消费者需要产生数据的完整拷贝时,它不会对数据库产生任何额外负担。当消费者的数据大大落后于来源数据库时,也可以使用该功能。
    再看看 Databus 的系统架构。
    Databus 由 Relays、bootstrap 服务和 Client lib 等组成,Bootstrap 服务中包括 Bootstrap Producer 和 Bootstrap Server。
    在这里插入图片描述
  • 快速变化的消费者直接从 Relay 中取事件;
  • 如果一个消费者的数据更新大幅落后,它要的数据就不在 Relay 的日志中,而是需要请求 Bootstrap 服务,返回的将会是自消费者上次处理变更之后的所有数据变更快照。
    开源地址:https://github.com/linkedin/databus

3.4 Databus和Canal对比

在这里插入图片描述

3.4 其它

Flink
● 有界数据流和无界数据流上进行有状态计算分布式处理引擎和框架。
● 官网地址:https://flink.apache.org

CloudCanal
● 数据同步迁移系统,商业产品。
● 官网地址:https://www.clougence.com/?utm_source=wwek

Maxwell
● 使用简单,直接将数据变更输出为json字符串,不需要再编写客户端。
● 官网地址:http://maxwells-daemon.io

DRD
● 阿里巴巴集团自主研发的分布式数据库中间件产品,专注于解决单机关系型数据库扩展性问题,具备轻量(无状态)、灵活、稳定、高效等特性。
● 官方地址:https://www.aliyun.com/product/drds

yugong
● 帮助用户完成从 Oracle 数据迁移到 MySQL。
● 访问地址:https://github.com/alibaba/yugong

4. 后记

通过这篇文章,让你知道 MySQL 和其它多维数据的同步方案,以及常用的数据迁移工具,帮助你更好选型。
写文章不是目的,最重要的是如何应用到项目中。

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

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

相关文章

独立游戏《Project:Survival》UE5C++开发日志0——游戏介绍

该游戏是《星尘异变》团队的下一款作品,太空科幻题材的生存游戏,我将负责使用C、蓝图实现游戏的基础框架和核心功能,其中还包含使用人工智能算法助力游戏开发或帮助玩家运营 目前已有功能: 1.3D库存系统:所有库存中的物…

【运维监控】influxdb 2.0 + grafana 11 监控jmeter 5.6.3 性能指标(完整版)

运维监控系列文章入口:【运维监控】系列文章汇总索引 文章目录 一、部署influxdb2.0二、部署grafana三、jmeter配置1、下载jmeter插件2、部署jmeter插件3、添加Backend Listener 四、grafana集成influxdb监控jmeter1、建立grafana数据源2、导入grafana模板3、验证1&…

秒表【JavaScript】

这个代码实现了一个基本的功能性秒表。 实现功能&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sc…

文档矫正算法:DocTr++

文档弯曲矫正&#xff08;Document Image Rectification&#xff09;的主要作用是在图像处理领域中&#xff0c;对由于拍摄、扫描或打印过程中产生的弯曲、扭曲文档进行校正&#xff0c;使其恢复为平整、易读的形态。 一. 论文和代码 论文地址&#xff1a;https://arxiv.org/…

Android NestedScrollView+TabLayout+ViewPager+ 其它布局,ViewPager 不显示以及超出屏幕不显示问题

前言 此场景为 NestedScrollView 嵌套多个布局 &#xff0c;大致结构为 NestedScrollViewTabLayoutViewPagerfragment 其它View,如下图 &#xff0c; 一、ViewPager 设置高度才会显示内容问题 原因&#xff1a;NestedScrollView 计算高度先于 ViewPager 渲染前&#xff0c;所…

动手学深度学习8.7. 通过时间反向传播-笔记练习(PyTorch)

本节课程地址&#xff1a;本节无视频 本节教材地址&#xff1a;8.7. 通过时间反向传播 — 动手学深度学习 2.0.0 documentation (d2l.ai) 本节开源代码&#xff1a;...>d2l-zh>pytorch>chapter_multilayer-perceptrons>bptt.ipynb 通过时间反向传播 到目前为止&…

输出Hate-C语言

1.问题&#xff1a; C语言实现先后输出Hate四个字符。 2.解答&#xff1a; 定义4个字符变量&#xff0c;分别赋以初值H、a、t、e&#xff0c;然后用putchar函数输出4个字符变量的值。 3.代码&#xff1a; #include<stdio.h>int main(){char character1,character2,ch…

ArcGIS Desktop使用入门(三)图层右键工具——拓扑(下篇:地理数据库拓扑)

系列文章目录 ArcGIS Desktop使用入门&#xff08;一&#xff09;软件初认识 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——标准工具 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——编辑器 ArcGIS Desktop使用入门&#xff08;二&#x…

CSS中的多种关系选择器

后代选择器 选择所有被E元素包含的F元素&#xff0c;中间用空格隔开。 例&#xff1b; <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title…

使用Docker一键部署Blossom笔记软件

Blossom 是一个需要私有部署的笔记软件,虽然本身定位是一个云端软件,但你仍然可以在本地部署,数据和图片都将保存在你的设备,不依赖任何的图床或者对象存储。 客户端:支持 Windows 端和 ARM 架构的 Mac 端,以及作为网页端部署。移动端:响应式网页移动端,主要为移动端设…

基于单片机的智能窗帘控制系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采用DHT11温湿度传感器检测温湿度&#xff0c;滑动变阻器连接ADC0832数模转换器转换模拟,光敏传感器&#xff0c;采用GP2D12红外传感器&#xff0c;通过LCD1602显示屏显示…

3DMAX乐高建筑生成器插件LegoBuilding使用方法详解

3DMAX乐高建筑生成器插件LegoBuilding使用教程 3DMAX乐高建筑生成器插件LegoBuilding&#xff0c;一键批量生成随机的乐高积木样式建筑群&#xff0c;可作为配景楼建模使用。可根据闭合样条线画定范围或地形&#xff08;网格&#xff09;对象表面范围和起伏批量生成随机形状的乐…

浮游生物检测系统源码分享

浮游生物检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

使用【Sa-Token】实现Http Basic 认证

使用Sa-Token开源架构快速实现Http Basic 认证&#xff0c;如上图 1、springboot环境下直接添加starter即可 <!-- Sa-Token 权限认证&#xff0c;在线文档&#xff1a;https://sa-token.cc --> <dependency><groupId>cn.dev33</groupId><artifactI…

04-Docker常用命令

04-Docker常用命令 启动类命令 启动docker systemctl start docker停止docker systemctl stop docker重启docker systemctl restart docker查看docker状态 systemctl status docker开机启动docker systemctl enable docker帮助类命令 查看docker版本 docker version查…

ubuntu中如何查看类型(函数)定义的头文件

问题&#xff1a; 1.该如何查找函数&#xff0c;或者数据类型的头文件&#xff1f; 方法&#xff1a; 1.使用vim搭配ctags 2.使用vscode 使用vscode查看头文件位置的步骤&#xff1a; 1.例如下图&#xff0c;我想添加包含file_operations的头文件 2.双击选中数据类型&#xf…

git笔记之在多个分支中复用某个分支提交的更改

git笔记之在多个分支中复用某个分支提交的更改 code review! 文章目录 git笔记之在多个分支中复用某个分支提交的更改1.实现该功能的 Bash 脚本示例2.这个脚本是否可以处理新添加的文件&#xff1f;3.该脚本使用前&#xff0c;应先使用下述脚本重置本地仓库所有分支与远程保持一…

GPU硬件如何实现光栅化?

版权声明 本文为“优梦创客”原创文章&#xff0c;您可以自由转载&#xff0c;但必须加入完整的版权声明文章内容不得删减、修改、演绎本文视频版本&#xff1a;见文末 引言 大家好&#xff0c;我是老雷&#xff0c;今天我想从GPU硬件原理出发&#xff0c;给大家分享在图形渲…

54 循环神经网络RNN_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录循环神经网络使用循环神经网络的语言模型困惑度&#xff08;perplexity&#xff09;梯度剪裁 循环神经网络 使用循环神经网络的语言模型 输入“你”&#xff0c;更新隐变量&#xff0c;输出“好”。 困惑度&#xff08;perplexity&#xff…

基于真实山地场景下的超多目标优化算法求解无人机三维路径规划,MATLAB代码

超多目标优化算法是一类专门用于解决存在三个以上目标函数的最优化问题的算法。这类问题在现实世界中非常常见&#xff0c;例如在工程设计、资源管理、机器学习等领域。由于目标之间的冲突性&#xff0c;很难找到一个单一的解来同时优化所有目标&#xff0c;因此超多目标优化算…