ElasticSearch 同步MySQL数据方案汇总

news2024/11/26 14:20:43

叙述

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

在这里插入图片描述

MySQL 和 ElasticSearch 各特点

1、为什么选用MySQL?

MySQL 在关系型数据库历史上并没有特别优势的位置,Oracle/DB2/PostgreSQL(Ingres) 三老比 MySQL 开发早了 20 来年, 但是乘着 2000 年的互联网东风, LAMP 架构得到迅速的使用,特别在中国,大部分新兴企业的 IT 系统主数据沉淀于 MySQL 中。
核心特点:开源免费、高并发、稳定、支持事务、支持SQL查询

  • 高并发能力:MySQL 内核特征特别适合高并发简单 SQL 操作,链接轻量化(线程模式),优化器、执行器、事务引擎相对简单粗暴,存储引擎做得比较细致
  • 稳定性好:主数据库最大的要求就是稳定、不丢数据,MySQL 内核特征反倒让其特点鲜明,从而达到很好的稳定性,主备系统也很早就 ready,应对崩溃情况下的快速切换,innodb 存储引擎也保障了 MySQL 下盘稳定
  • 操作便捷:良好、便捷的用户体验(相比 PostgreSQL),让应用开发者非常容易上手,学习成本较低
  • 开源生态:MySQL 是一款开源产品,让上下游厂商围绕其构建工具相对简单,HA proxy、分库分表中间件让其实用性大大加强,同时开源的特质让其有大量的用户

2、为什么选用 ES?

ES 几个显著的特点,能够有效补足 MySQL 在企业级数据操作场景的缺陷,而这也是我们将其选择作为下游数据源重要原因

核心特点:支持分词检索,多维筛选性能好,支持海量数据查询

  • 文本搜索能力:ES 是基于倒排索引实现的搜索系统,配合多样的分词器,在文本模糊匹配搜索上表现得比较好,业务场景广泛
  • 多维筛选性能好:亿级规模数据使用宽表预构建(消除 join),配合全字段索引,使 ES 在多维筛选能力上具备压倒性优势,而这个能力是诸如CRM, BOSS, MIS 等企业运营系统核心诉求,加上文本搜索能力,独此一家
  • 开源和商业并行:ES 开源生态非常活跃,具备大量的用户群体,同时其背后也有独立的商业公司支撑,而这让用户根据自身特点有了更加多样、渐进的选择

数据同步方案

1、同步双写

这是一种最为简单的方式,在将数据写到mysql时,同时将数据写到ES。

在这里插入图片描述
实例代码

/**
 * 新增商品
 */
@Transactional(rollbackFor = Exception.class)
public void addGoods(GoodsDto goodsDto) {
	 //1、保存Mysql
	 Goods goods = new Goods();
	 BeanUtils.copyProperties(goodsDto,goods);
	 GoodsMapper.insert();
 
	 //2、保存ES
	 IndexRequest indexRequest = new IndexRequest("goods_index","_doc");
	 indexRequest.source(JSON.toJSONString(goods), XContentType.JSON);
	 indexRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
	 highLevelClient.index(indexRequest);
}

优点:

  1. 业务逻辑简单
  2. 实时性高

缺点:

  1. 硬编码,有需要写入mysql的地方都需要添加写入ES的代码
  2. 业务强耦合
  3. 存在双写失败丢数据风险
  4. 性能较差:本来mysql的性能不是很高,再加一个ES,系统的性能必然会下降。

附:
上面说的双写失败风险,包括以下几种:

  1. ES系统不可用;
  2. 程序和ES之间的网络故障;
  3. 程序重启,导致系统来不及写入ES等。

针对这种情况,有数据强一致性要求的,就必须双写放到事务中来处理,而一旦用上事物,则性能下降更加明显。

2、异步双写(MQ方式)

针对多数据源写入的场景,可以借助MQ实现异步的多源写入,这种情况下各个源的写入逻辑互不干扰,不会由于单个数据源写入异常或缓慢影响其他数据源的写入,虽然整体写入的吞吐量增大了,但是由于MQ消费是异步消费,所以不适合实时业务场景。

在这里插入图片描述
优点:

  1. 性能高
  2. 不易出现数据丢失问题,主要基于MQ消息的消费保障机制,比如ES宕机或者写入失败,还能重新消费MQ消息。
  3. 多源写入之间相互隔离,便于扩展更多的数据源写入

缺点:

  1. 硬编码问题,接入新的数据源需要实现新的消费者代码
  2. 系统复杂度增加:引入了消息中间件
  3. 可能出现延时问题:MQ是异步消费模型,用户写入的数据不一定可以马上看到,造成延时。

3、基于MySQL表定时扫描同步

上面两种方案中都存在硬编码问题,也就是有任何对mysq进行增删改查的地方要么植入ES代码,要么替换为MQ代码,代码的侵入性太强。
如果对实时性要求不高的情况下,可以考虑用定时器来处理,具体步骤如下:

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

如下图所示:

在这里插入图片描述
该方案的典型实现是借助logstash实现数据同步,其底层实现原理就是根据配置定期使用sql查询新增的数据写入ES中,实现数据的增量同步。

具体实现可以参考:通过Logstash实现mysql数据定时增量同步到ES

在这里插入图片描述
优点:

  1. 不改变原来代码,没有侵入性、没有硬编码;
  2. 没有业务强耦合,不改变原来程序的性能;
  3. Worker代码编写简单不需要考虑增删改查;

缺点:

  1. 时效性较差,由于是采用定时器根据固定频率查询表来同步数据,尽管将同步周期设置到秒级,也还是会存在一定时间的延迟。
  2. 对数据库有一定的轮询压力,一种改进方法是将轮询放到压力不大的从库上。

4、基于Binlog实时同步

上面三种方案要么有代码侵入,要么有硬编码,要么有延迟,那么有没有一种方案既能保证数据同步的实时性又没有代入侵入呢?
当然有,可以利用mysql的binlog来进行同步。其实现原理如下:

在这里插入图片描述

具体步骤如下:

  1. 读取mysql的binlog日志,获取指定表的日志信息;
  2. 将读取的信息转为MQ;
  3. 编写一个MQ消费程序;
  4. 不断消费MQ,每消费完一条消息,将消息写入到ES中。

优点:

  1. 没有代码侵入、没有硬编码;
  2. 原有系统不需要任何变化,没有感知;
  3. 性能高;
  4. 业务解耦,不需要关注原来系统的业务逻辑。

缺点:

  1. 构建Binlog系统复杂;
  2. 如果采用MQ消费解析的binlog信息,也会像方案二一样存在MQ延时的风险。

业界目前较为流行的方案:使用canal监听binlog同步数据到es

在这里插入图片描述
canal ,译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。
说白了就是,根据Mysql的binlog日志进行增量同步数据。要理解canal的原理,就要先了解mysql的主从复制原理:

  1. 所有的create update delete操作都会进入MySQLmaster节点
  2. master节点会生成binlog文件,每次操作mysql数据库就会记录到binlog文件中
  3. slave节点会订阅master节点的binlog文件,以增量备份的形式同步数据到slave数据

canal原理就是伪装成mysql的从节点,从而订阅master节点的binlog日志,主要流程为:

  1. canal服务端向mysql的master节点传输dump协议
  2. mysql的master节点接收到dump请求后推送binlog日志给canal服务端,解析binlog对象(原始为byte流)转成Json格式
  3. canal客户端通过TCP协议或MQ形式监听canal服务端,同步数据到ES

数据迁移同步工具选型

数据迁移同步工具的选择比较多样,下表仅从 MySQL 同步 ES 这个场景下,对一些笔者深度使用研究过的数据同步工具进行对比,用户可以根据自己的实际需要选取适合自己的产品。

特性\产品CanalDTSCloudCanal
是否支持自建ES
ES对端版本支持丰富度中 支持ES6和ES7高 支持ES5,ES6和ES7中 支持ES6和ES7
嵌套类型支持join/nested/objectobjectnested/object
join支持方式基于join父子文档&反查基于宽表预构建&反查
是否支持结构迁移
是否支持全量迁移
是否支持增量迁移
数据过滤能力中 -仅全量可添加where条件高 -全增量阶段where条件高 -全增量阶段where条件
是否支持时区转换
同步限流能力
任务编辑能力
数据源支持丰富度
架构模式订阅消费模式 需先写入消息队列直连模式直连模式
监控指标丰富度中 性能指标监控中 性能指标监控高 性能指标、资源指标监控
报警能力针对延迟、异常的电话报警针对延迟、异常的钉钉、短信、邮件报警
任务可视化创建&配置&管理能力
是否开源
是否免费否 是社区版、SAAS版免费
是否支持独立输出否依赖云平台整体输出
是否支持SAAS化使用

总结

本文主要对Mysql和ES进行数据同步的常见方案进行了汇总说明。

  1. 同步双写是最简单的同步方式,能最大程度保证数据同步写入的实时性,最大的问题是代码侵入性太强。
  2. 异步双写引入了消息中间件,由于MQ都是异步消费模型,所以可能出现数据同步延迟的问题。好处是在大规模消息同步时吞吐量更、高性能更好,便于接入更多的数据源,且各个数据源数据消费写入相互隔离互不影响。
  3. 基于Mysql表定时扫描同步,原理是通过定时器定时扫描表中的增量数据进行数据同步,不会产生代码侵入,但由于是定时扫描同步,所以也会存在数据同步延迟问题,典型实现是采用
    Logstash 实现增量同步。
  4. 基于Binlog实时同步,原理是通过监听Mysql的binlog日志进行增量同步数据。不会产生代码侵入,数据同步的实时也能得到保障,弊端是Binlog系统都较为复杂。典型实现是采用
    canal 实现数据同步。

文章参考:https://blog.csdn.net/w1014074794/article/details/127124574

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

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

相关文章

Matlab如何隐藏坐标轴框线,但保留刻度及刻度标签

假如我们用Matlab绘制了这样一幅堆叠图: 看起来,哪哪都好,但就是感觉两条黑色的坐标轴框线有些碍事。 于是想,该怎么去掉呢? 网上对于这一问题比较常见的解答是,将坐标轴颜色设置为背景颜色: …

2023,没有人不想做黄牛

【潮汐商业评论/原创】 “没办法啊,只能退票了。”作为奶茶十几年的老粉,好不容易从其他粉丝手里买到票的Sarah无奈道。 “刘若英,12小时内退票”、“梁静茹,24小时内退票”…… 近日“演唱会闹退票”登上了热搜。起因是5月7日&…

nuitka打包python的PyQt5成exe可执行文件

使用nuitka打包python的PyQt5 可以打包多文件,也可以打包单文件。 使用的python版本是3.8.10 1、下载gcc 方式1:可以到网站下载,点我跳转 方式2:可以直接去网盘下载,点我跳转 提取码:8888 网盘里面也有python3.8.10的安装包,下载后直接安装即可。 下载64位 win…

CoolShell 博客备份QA问答

芝兰生于深谷,不以无人而不芳; 君子修身养德,不以穷困而改志 这是左耳朵耗子-陈皓[1]的座右铭,他的中文技术博客酷壳 - CoolShell[2]可能是许多技术人员的圣地,至少对我来说是的。 coolshell_talk 他在极客时间的专栏,…

深度学习--主动学习

主动学习简介 主动学习是指对需要标记的数据进行优先排序的过程,这样可以确定哪些数据对训练监督模型产生最大的影响。主动学习是一种学习算法可以交互式查询用户(teacher 或 oracle),用真实标签标注新数据点的策略。主动学习的过程也被称为优化实验设计…

Oracle 存储过程语法

Oracle 存储过程语法 1. 创建表(测试数据准备) -- 创建用户表 create table TT_USER (USERID NUMBER(10),USERNAME VARCHAR2(255),PASSWORD VARCHAR2(255),SEX VARCHAR2(1) );INSERT INTO TT_USER VALUES (101, zhang, 111, 1); INSERT INTO TT…

Win11校园网不弹出登录页面怎么回事?

Win11校园网不弹出登录页面怎么回事?最近有用户在使用校园网的时候遇到了一些问题,访问登录网站的时候,一直无法显示登录的界面。那么遇到这个情况如何去进行解决呢?一起来看看以下的解决方法分享吧。 解决方法如下: 方…

【零基础学机器学习 2】 机器学习的实操步骤-以及在Python中实现机器学习模型

文章目录 1. 收集数据2. 准备数据3. 选择模型4. 训练模型5. 评估模型6. 参数调整7. 进行预测在Python中实现机器学习模型 机器学习是一种人工智能的分支,它使用算法和统计模型来让计算机系统自动地从数据中学习,并根据学习结果做出预测或决策。机器学习的…

智能双向嵌入式UART转CAN模块 串口 RS232 RS485 UART CAN转换器

CANUART-100TL系列智能双向UART转CAN模块具有一路TTL UART串口通道和一路CAN通道,实现CAN与串口 UART之间的双向数据智能转换。超小型灌封模块设计,方便用户集成到电路板上,快速通过MCU的UART口扩展CAN通道。 智能双向UART转CAN模块提供“…

Docker高级:Compose 容器编排

目录 一、Docker Compose 概述二、使用 Docker Compose三、常用命令四、编排微服务Ⅰ、搭建微服务Ⅱ、编写Dockerfile构建镜像Ⅲ、启动容器,测试服务Ⅳ、使用Compose编排容器 五、总结 一、Docker Compose 概述 Compose 是Docker公司推出的一个软件,可以…

跟着我学 AI丨AIGC,自媒体的核武器

自从 ChatGPT 火爆全网之后,AI 相关概念的热度就一直持续高涨不下,尤其是大众都在关注的 AI 的应用场景方向,更是疯狂。无论是 AI 圈内人还是以前对 AI 完全没有认知的人,都想借助 AI 挣上一笔。目前来说最受关注的 AI 应用场景&a…

阿里云数据库ClickHouse产品和技术解读

摘要:社区ClickHouse的单机引擎性能十分惊艳,但是部署运维ClickHouse集群,以及troubleshoot都不是很好上手。本次分享阿里云数据库ClickHouse产品能力和特性,包含同步MySQL库、ODPS库、本地盘及多盘性价比实例以及自建集群上云的迁…

kubernetes中Pod介绍

目录 kubernetes的作用 k8s核心资源pod Pod如何管理多个容器? Pod网络 k8s中容器的共享方式 Pod存储 已经学习了docker为什么还要学习Pod Pod与Docker之间的关系 Pod的优势 收集业务日志 pod工作方式 自主式(不推荐) yaml文件详解…

内存和闪存介绍

主要分为两类:内存和闪存,内存的数据掉电会丢失,闪存的数据掉电不会丢失。 内存:SRAM、RAM、SDRAM、DDR 闪存:ROM、FLASH、EMMC RAM:Random Access Memory 随机存储器,又分为:SRAM…

科士达为绿色世界 提供多维度低碳新动能

2023年5月11日,“数据中心绿色发展大会”围绕节能降碳绿色赋能主题,在成都如期召开。作为国内数据中心行业的翘楚,科士达应邀参加了大会,与会代表高级售前沈凤文带来了题为《为绿色世界 提供多维度低碳新动能》的精彩演讲。 在“双碳”目标引…

『手撕 Mybatis 源码』02 - 加载配置文件

加载配置文件 获取输入流 myBatis 的配置文档层次架构 首先从读入开始查看是怎么加载配置文件的,现在从这里打个断点 public class MybatisTest {Testpublic void test1() throws IOException {// 1. 通过类加载器对配置文件进行加载,加载成了字节输入…

MidJourney中国版开放内测;70款ChatGPT插件全评测;盘点181家海外AI创业公司;GPT+科研工作流 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 『左耳朵耗子 | 享受编程和技术带来的快乐』Coding Your Ambition CoolShell 是陈皓创建的技术共享平台,主题非常广泛&…

加密解密软件VMProtect教程(五):主窗口之主菜单

VMProtect 是保护应用程序代码免遭分析和破解的可靠工具,但只有在正确构建应用程序内保护机制并且没有可能破坏整个保护的典型错误的情况下才能最有效地使用。 接下来为大家介绍关于VMProtect中主菜单的功能介绍,包括文件、编辑、项目、工具和帮助。 &…

基于SSM+JSP的人体健康信息管理系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

PV270R1K1T1WMMC_PARKER轴向柱塞泵

PV270R1K1T1WMMC_PARKER轴向柱塞泵 柱塞泵分类 PARKER柱塞泵根据倾斜元件的不同,有斜盘式和斜轴式两种。斜盘式是斜盘相对回转的缸体有一倾斜角度,而引起柱塞在泵缸中往复运动。传动轴轴线和缸体轴线是一致的。这种结构较简单,转速较高&…