MySQL + Elasticsearch:为什么要使用ES,使用场景与架构设计详解

MySQL + Elasticsearch:为什么要使用ES,使用场景与架构设计详解

  • 前言
  • 一、MySQL + Elasticsearch的背景与需求
    • 1.1 为什么要使用Elasticsearch(ES)?
    • 1.2 为什么MySQL在某些场景下不足以满足需求?
    • 1.3 MySQL + Elasticsearch结合的必要性
  • 二、MySQL + Elasticsearch的典型使用场景
    • 2.1 全文搜索与复杂查询
    • 2.2 实时数据分析
    • 2.3 大数据处理与高并发查询
  • 三、MySQL + Elasticsearch的优势与架构设计
    • 3.1 为什么不单独使用 MySQL 或 Elasticsearch?
      • 3.1.1 单独使用 MySQL 的不足
      • 3.1.2 单独使用 Elasticsearch 的不足
    • 3.2 MySQL + Elasticsearch的优势
      • 3.2.1 性能与灵活性兼顾
      • 3.2.2 可扩展性强
      • 3.2.3 架构解耦与数据同步
      • 3.2.4 实时分析与快速迭代
  • 四、存储方案全景对比
  • 五、高可用、高可靠与安全设计
    • 5.1 MySQL 高可用
    • 5.2 Elasticsearch 高可用
    • 5.3 安全可靠
  • 六、结合使用MySQL与Elasticsearch的存储与查询示例
    • 6.1 Elasticsearch用于模糊搜索
    • 6.2 MySQL用于精确分类条件查询
    • 6.3 结合MySQL与Elasticsearch进行查询流程


前言

在现代企业级应用中,数据存储和检索是核心环节,尤其是涉及到大量数据存储和查询时,如何选择合适的存储系统成为了开发者和架构师的重要课题。MySQLElasticsearch(ES)是两种广泛使用的数据库系统,它们各自有其独特的优势,但在某些场景下,单独使用MySQL或ES可能无法满足业务需求。结合MySQL与Elasticsearch,不仅能够充分发挥两者的优势,还能更好地满足高并发、高可用、高可靠的业务需求。
在这里插入图片描述


一、MySQL + Elasticsearch的背景与需求

1.1 为什么要使用Elasticsearch(ES)?

Elasticsearch 是基于Lucene的开源搜索引擎,它被广泛应用于需要高效全文搜索、复杂查询和快速检索的场景中。与传统的关系型数据库相比,Elasticsearch提供了更高效的搜索引擎和更灵活的数据分析能力,具有以下几个显著特点:

  • 快速搜索和查询:Elasticsearch采用倒排索引(Inverted Index)技术,极大地提高了大数据量下的搜索速度,尤其适用于需要全文搜索和复杂查询的场景。

  • 横向扩展性:Elasticsearch是分布式系统,具有天然的横向扩展能力,支持数据的分片和多副本机制,能够在大规模数据处理时提供高效的服务。

  • 实时搜索:ES具有近实时(1s延迟)的搜索能力,索引更新后几乎能够立刻被查询到,适用于需要实时查询的场景。

  • 多样化的数据分析和聚合功能:ES提供了丰富的数据聚合功能,可以高效处理大规模数据的统计分析。

1.2 为什么MySQL在某些场景下不足以满足需求?

尽管MySQL是关系型数据库的典型代表,广泛应用于OLTP(在线事务处理)场景,但在处理大规模全文搜索、复杂查询、实时数据分析等任务时,MySQL存在一些限制:

  • 性能瓶颈:传统的关系型数据库MySQL通常基于B树索引(B-Tree Index),在大规模数据检索、复杂查询和全文搜索时性能不如ES。

  • 扩展性差:MySQL虽然可以通过主从复制和分库分表来进行扩展,但其水平扩展能力有限,特别是在面对大规模数据和高并发请求时,MySQL的性能可能会受到限制。

  • 不支持高级搜索:MySQL并不适合做复杂的模糊查询、全文搜索等任务,这类任务在Elasticsearch中能通过倒排索引高效地实现。

1.3 MySQL + Elasticsearch结合的必要性

将MySQL和Elasticsearch结合使用,可以充分发挥两者的优势,补充彼此的不足。

  • MySQL负责存储结构化数据:MySQL作为关系型数据库,适合存储高结构化的数据,能够保证数据的一致性、事务性和完整性。

  • Elasticsearch负责全文搜索与高效查询:Elasticsearch则可以在高并发查询、复杂检索和实时搜索方面发挥优势,处理数据分析和查询负载。

二、MySQL + Elasticsearch的典型使用场景

2.1 全文搜索与复杂查询

在传统关系型数据库中,处理复杂的查询和全文搜索会面临性能瓶颈。Elasticsearch的倒排索引和分布式架构可以处理海量数据的快速检索,因此非常适合需要支持全文搜索、模糊查询等功能的场景。

  • 电商平台:商品名称、描述、标签等字段经常需要进行全文检索,ES能够实现高效的搜索功能。

  • 日志分析系统:日志数据量大且结构不固定,使用Elasticsearch进行日志数据的快速查询、聚合和分析是非常理想的。

2.2 实时数据分析

Elasticsearch的实时索引更新和近实时搜索能力使得它在处理需要实时更新的分析任务时表现优秀。

  • 社交网络分析:实时跟踪用户活动并进行分析,如推文、评论的情感分析、热点话题的挖掘等。

  • 用户行为分析:电商、广告等行业需要实时追踪用户行为,并提供精准的分析报告。

2.3 大数据处理与高并发查询

当系统需要处理大量并发查询时,单独使用MySQL可能无法满足要求,因为MySQL难以应对大量复杂查询的并发请求。Elasticsearch的分布式设计和并行处理能力则能轻松应对这些需求。

  • 搜索引擎:例如新闻网站的搜索引擎,用户查询时需要快速返回与关键字相关的内容。ES能够通过并行处理、分布式索引来提供快速的响应。

三、MySQL + Elasticsearch的优势与架构设计

  • 单独 MySQL:事务与关系强,但全文检索和水平扩展受限;

  • 单独 Elasticsearch:检索性能优,但缺乏 ACID、关系约束且存储开销高;

  • 二者结合:MySQL 负责 OLTP,保证数据一致性;Elasticsearch 负责 OLAP/搜索,提供毫秒级检索与实时聚合;通过异步/同步管道解耦写入与查询,既保证业务一致性,也满足高并发检索需求。

3.1 为什么不单独使用 MySQL 或 Elasticsearch?

3.1.1 单独使用 MySQL 的不足

  • 性能瓶颈:MySQL 的全文检索基于 B-Tree 或 InnoDB/ MyISAM 全文索引,在大数据量和复杂查询时,响应速度远不如专为搜索设计的 Elasticsearch。

  • 扩展性受限:虽然可通过主从复制或分库分表扩展读写,但水平扩展能力有限,面对 PB 级数据和高并发时,维护成本和一致性挑战显著增大。

  • 高级搜索不友好:MySQL 缺乏模糊查询、同义词扩展、自动补全等高级功能;复杂分词或多字段相关度计算需大量自定义和优化。

3.1.2 单独使用 Elasticsearch 的不足

  • 缺乏 ACID 事务:ES 天生弱一致性,不支持跨文档事务,难以满足金融、库存等对强一致性要求严格的业务场景。

  • 数据完整性约束不足:不支持外键、唯一约束等关系型功能,必须在应用层手动维护数据一致性与完整性。

  • 存储成本较高:倒排索引、分片与副本机制显著增加磁盘与 I/O 开销,不适合作为所有结构化数据的主存储库。

3.2 MySQL + Elasticsearch的优势

3.2.1 性能与灵活性兼顾

  • 事务与一致性由 MySQL 承担:ACID 事务、复杂关联查询与约束由关系型数据库保障,读写操作安全可靠。

  • 全文检索与分析由 Elasticsearch 支撑:基于倒排索引和分布式查询,能毫秒级处理模糊、分页、多字段相关度等复杂搜索。

3.2.2 可扩展性强

  • MySQL 横向扩展与高可用:利用 InnoDB Group Replication 或 Galera Cluster,实现多主/主从复制、读写分离与自动故障切换。

  • Elasticsearch 动态分片与副本:索引可自动拆分成主分片和副本,节点增删无需停机,线性扩展到 PB 级数据规模。

3.2.3 架构解耦与数据同步

  • 灵活的同步管道:可选 Logstash JDBC 定时拉取、Debezium+Kafka 实时订阅 binlog,或应用层双写,将 MySQL 写入与 ES 索引的依赖解耦。

  • 削峰与容灾机制:通过消息队列缓冲高峰期变更,批量写入 ES,并对失败记录重试或持久化至“死信队列”,确保“最终一致性”。

3.2.4 实时分析与快速迭代

  • 近实时索引:ES 默认每秒刷新一次,新数据秒级可见,满足日志监控、推荐系统等实时需求。

  • 内置聚合功能:无需离线 ETL,即时在 Kibana 或 API 上完成多维度分析、分组与时间序列统计。

四、存储方案全景对比

特性MySQLElasticsearch
数据结构关系型表,支持外键、事务文档(JSON),无事务,多分片与副本
查询语言SQL,支持 JOIN、事务查询Query DSL(JSON),擅长全文检索与聚合
扩展方式分库分表、主从复制、Group Replication、Galera分片(Shard)与副本(Replica),自动负载均衡
实时性非实时,适合 OLTP近实时(~1s),适合实时搜索与分析
一致性强一致性(ACID)最终一致性,弱实时事务
检索性能对结构化数据查询优异,全文检索性能一般大规模全文搜索和聚合高效
运维复杂度需手动管理分片、分库与主从自动管理分片与路由,运维相对简化

五、高可用、高可靠与安全设计

5.1 MySQL 高可用

  • InnoDB Cluster / Group Replication

    每个 MySQL 节点运行 Group Replication,实现多主或单主模式下的数据同步与自动故障切换,无需人工干预即可恢复写入服务,消除单点故障 。
    通过 AdminAPI 管理集群节点,支持弹性伸缩及在线升级,保证业务平滑无感知升级 。

  • Galera Cluster

    MariaDB 企业版的 Galera Cluster 提供真正的多主并行复制,所有节点均可读写,自动管理节点加入、成员故障移除与流控,确保事务不丢失且网络延迟低 。

  • 异地灾备

    通过在不同地域部署异地从库或使用 MySQL 原生复制,将主库的 binlog 实时传输到远程,从而在主区域发生故障时快速切换,保障区域级别的高可用与数据持久性 。

5.2 Elasticsearch 高可用

  • 分片与副本机制

    每个索引可分为若干主分片(primary)与副本分片(replica),当节点失效时,副本自动升级为主分片,确保查询和写入不中断;至少两节点即可保持“green”状态 。

  • 跨集群复制(CCR)

    采用主动—被动模式,将主集群的索引实时复制到一个或多个从集群中,不仅能就近服务用户,还能作为异地容灾备份;配置简单,基于 Elastic 官方 CCR 功能即可快速上线 。

  • 监控与告警

    • Elastic Stack Monitoring:内置采集集群、索引和节点级指标,配合 Kibana 仪表盘实时可视化。

    • Prometheus + Grafana:使用 Elastic 官方 Prometheus 导出器,将指标推送至 Prometheus,再由 Grafana 展示自定义监控大盘,可灵活设置告警规则。

    • 日志与事件:结合 Watcher 或外部告警系统,对集群健康、节点重启、分片状态变化等关键事件进行及时告警。

5.3 安全可靠

  • MySQL 安全

    • TLS 加密传输:强制客户端与服务端使用 SSL/TLS,防止中间人攻击与窃听。

    • 基于角色的访问控制(RBAC):MySQL Enterprise Edition 提供细粒度用户/角色管理,限制各用户仅访问必要的数据库或表。

    • 审计日志插件:开启 Audit Log 插件,记录所有登录、DDL/DML 操作与权限变更,支持日志加密,满足合规审计需求。

  • Elasticsearch 安全

    • X-Pack Security:内置 TLS 加密、用户认证、角色映射及密码策略;支持文档级与字段级安全控制,保证多租户及敏感数据隔离。

    • 审计日志:记录所有认证、授权、索引及查询事件,可定向输出到安全团队或 SIEM 系统进行深度分析。

    • 最小安全配置:快速启动时可使用 Elastic Docs 的 Minimal Setup,仅启用基本认证与加密,后续再逐步强化。

  • 运维自动化

    • Terraform + Ansible:推荐用 Terraform 管理云端基础设施(网络、虚拟机、存储等),再用 Ansible 做系统配置、软件安装与服务编排,清晰分离“基础设施”与“配置”职责,增强可审计性与可回滚性。

    • 版本控制 & CI/CD:将 Terraform 脚本与 Ansible Playbook 存入 Git,结合 CI/CD 管道实现自动化测试、审查与部署,确保配置一致性与快速恢复。

六、结合使用MySQL与Elasticsearch的存储与查询示例

为了更清楚地了解如何将MySQL和Elasticsearch结合使用,将通过以下几个具体示例(题库)来说明两者的实际应用场景和查询逻辑。

6.1 Elasticsearch用于模糊搜索

Elasticsearch擅长全文检索、模糊查询和快速检索。当我们需要根据题干内容、标签、关键词等进行模糊搜索时,Elasticsearch非常高效,尤其是在面对大量题目数据时,能够快速返回相关结果。

示例:模糊搜索“二战”相关的题目

假设我们需要根据关键词“二战”和“历史”来查找题目。通过Elasticsearch,我们可以进行如下的查询:

GET /questions/_search
{"query": {"bool": {"must": [{ "match": { "content": "二战" } },{ "match": { "tags": "历史" } }]}}
}

解析

  • content:题目的文本内容,Elasticsearch将基于内容中的关键字进行搜索。
  • tags:题目所属的标签,Elasticsearch将搜索与标签“历史”相关的题目。

此查询会返回所有题目内容中包含“二战”且标签为“历史”的题目,利用了Elasticsearch的强大文本处理和快速查询能力。

6.2 MySQL用于精确分类条件查询

当我们需要按照特定的分类、学科或其他结构化数据进行筛选时,使用MySQL会更为合适,因为它能够处理复杂的表关系和结构化查询。此时,我们首先通过MySQL查询出符合特定条件的题目ID,再利用这些ID在Elasticsearch中查询题目详情。

示例:查询“数学”学科下的题目ID

假设我们要查找属于“数学”学科的所有题目,可以先通过MySQL查询出所有符合条件的题目ID:

SELECT question_id
FROM questions
WHERE category_id = (SELECT category_id FROM categories WHERE name = '数学');

解析:

  • category_id:我们首先通过查询“数学”学科对应的category_id,然后用这个category_id去筛选所有属于“数学”学科的题目ID。

示例:根据ID在Elasticsearch中查询题目详情

一旦我们得到了所有“数学”学科下的题目ID(假设是 [1, 2, 3, 4, 5]),就可以通过这些ID在Elasticsearch中查询题目的详细内容,如下所示:

GET /questions/_mget
{"ids": [1, 2, 3, 4, 5]
}

解析

  • _mget:这是Elasticsearch的多文档获取接口,用于根据提供的一组ID查询多个文档。返回结果将包括这些题目的详细信息,如题目内容、选项等。

6.3 结合MySQL与Elasticsearch进行查询流程

通过结合MySQL和Elasticsearch的优势,您可以实现更高效、更灵活的查询功能。例如,用户可能希望查询“数学”学科下的题目,并且这些题目内容中包含“代数”相关的内容。具体流程如下:

步骤 1:通过MySQL查询学科下的题目ID

首先,我们使用MySQL查询出属于“数学”学科的所有题目ID:

SELECT question_id
FROM questions
WHERE category_id = (SELECT category_id FROM categories WHERE name = '数学');

步骤 2:通过Elasticsearch查询详细内容

然后,我们将这些题目ID传递给Elasticsearch,查询出题目的详细内容,包括题干、选项等:

GET /questions/_mget
{"ids": [1, 2, 3, 4, 5]
}

步骤 3:根据关键词进行模糊搜索

接下来,我们可以进一步在Elasticsearch中对题目内容进行模糊搜索。假设用户查询的是“代数”相关的内容,可以通过以下查询来查找符合条件的题目:

GET /questions/_search
{"query": {"match": {"content": "代数"}}
}

总结

  • MySQL 用于处理结构化数据、精准查询以及关系型操作,适用于根据学科、难度、类别等条件筛选题目ID。

  • Elasticsearch 用于高效的全文搜索、模糊匹配和快速检索,适合处理题干内容、选项等字段的模糊查询,尤其在面对大量数据时更具优势。

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

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

相关文章

PPL困惑度的计算

1. 公式 PPL(Perplexity)困惑度 是自然语言处理(NLP)中常用的评估语言模型(Language Model)性能的指标。PPL 用于衡量语言模型对语言序列的预测能力,数值越小,说明模型的预测能力越…

MegaCLI Raid管理工具

整理在CentOS 7.9和Ubuntu 24.04上,MegaCLI 工具的安装与常用命令。 1. 参考 下载和安装MegaCLI工具 MegaCli RAID管理工具 Megacli 批量磁盘巡检 ubuntu24.04 No such file libncursesw.so.5 dell服务器硬盘的状态变成外来(foreign)命…

HTML9:页面结构分析

页面结构分析 元素名描述header标题头部区域的内容(用于页面或页面中的一块区域)footer标记脚部区域的内容(用于整个页面或页面的一块区域)sectionWeb页面的一块独立区域article独立的文章内容aside相关的内容或应用(…

分布式处理架构

分布式处理架构是一种将计算任务分散到多台计算机或服务器上协同完成的系统设计方法。这种架构通过将工作负载分配到多个节点(可以是物理机、虚拟机或容器)来提高性能、可靠性和可扩展性。下面我将从多个角度详细解释这一概念: 分布式架构的…

算法每日一题 | 入门-分支结构-Apples Prologue/苹果和虫子

Apples Prologue/苹果和虫子 题目描述 小 B 喜欢吃苹果。她现在有 m m m(1 ≤ m ≤100)个苹果,吃完一个苹果需要花费 t t t(0 ≤ t≤ 100)分钟,吃完一个后立刻开始吃下一个。 现在时间过去了 s s s&a…

RT Thread Studio创建软件和硬件RTC工程

MCU型号:STM32F103RET6 一.配置软件模拟RTC 1.生成一个带串口输出的工程文件,新建RT-Thread项目工程文件。 2.查看电路图中的串口输出管脚,根据STMCubeMx软件可知此串口为USART1,选择芯片型号为STM32F103RET6,控制台…

STC32G12K128-旋转编码器-软件去抖

STC32G12K128-旋转编码器-软件去抖 简介代码 简介 EC11旋转编码器是一种可以连续旋转的器件A,B,C为旋转编码引脚,带按键的有D,E引脚。引脚功能: A:编码器A相;B:编码器B相;C:公共端-一般接到GN…

配置Jupyter Notebook环境及Token认证(Linux服务器)

配置Jupyter Notebook环境及Token认证(Linux服务器) 背景 在Ubuntu 18.04.6 LTS服务器(IP: 39.105.167.2)上,基于虚拟环境pytorch_env,通过Mac终端(SSH)配置Jupyter Notebook环境&…

从零开始学Flink:开启实时计算的魔法之旅

在凌晨三点的数据监控大屏前,某电商平台的技术负责人突然发现一个异常波动:支付成功率骤降15%。传统的数据仓库此时还在沉睡,而基于Flink搭建的实时风控系统早已捕捉到这个信号,自动触发预警机制。当运维团队赶到时,系…

基于k8s的Jenkins CI/CD平台部署实践(三):集成ArgoCD实现持续部署

基于k8s的Jenkins CI/CD平台部署实践(三):集成ArgoCD实现持续部署 文章目录 基于k8s的Jenkins CI/CD平台部署实践(三):集成ArgoCD实现持续部署一、Argocd简介二、安装Helm三、Helm安装ArgoCD实战1. 添加Arg…

[C++类和对象]类和对象的引入

面向过程和面向对象 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用来逐步解决问题 C是基于面向对象的,关注的是对象,将一件事情分成不同的对象,靠对象之间完成交互 类的引入 C语言结构体中只能定义变量,在C中,结构体不仅仅可以定义变量,而且可以定义函…

AWS之存储服务

目录 一、传统存储术语 二、传统存储与云存储的关系 三、云存储之AWS 使用场景 文件存储 数据块存储 对象存储 EBS、EFS、S3对比 EBS块存储 S3对象存储 S3 使用案例 S3 存储类 EFS文件存储 一、传统存储术语 分类 接口/技术类型 应用场景特点 关系及区别 机械硬…

WPDRRC 模型:构建动态闭环的信息安全防御体系

WPDRRC 模型是一种信息安全整体架构设计模型,由预警(Warning)、保护(Protection)、检测(Detection)、反应(Reaction)、恢复(Recovery)和反击&…

Redis 数据类型详解(二):Hash 类型全解析

文章目录 一、什么是 Redis 的 Hash 类型?二、Hash为什么在有些时候比String好用三、常见命令1.HSET key field value2.HGET key field3.HMSET4.HMGET5.HGETALL6.HKEYS7.HVALS8.HINCRBY9.HSETNX 四、应用场景五、性能优势六、注意事项总结 提示:以下是本…

Go Modules 的基本使用

在 Go Modules 项目中,首次运行时下载依赖包的正确流程需要根据项目情况区分处理。以下是详细步骤和最佳实践: 一、首次初始化项目的标准流程 1.1 创建项目目录并初始化模块 mkdir myproject && cd myproject go mod init github…

RISC-V AIA SPEC学习(五)

第六章 Interrupts for Virtual Machines(VS Level) 核心内容 1.VS级别外部中断支持:​​ ​​客户中断文件(Guest Interrupt File)​​:虚拟机的每个vCPU拥有独立的IMSIC中断文件,允许直接接收设备MSI。​​vstopi CSR​​:类似stopei,用于虚拟机内部处理最高优先级中…

【Python-Day 11】列表入门:Python 中最灵活的数据容器 (创建、索引、切片)

Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…

【AXI总线专题】-AXI-LITE总线解读

【AXI总线专题】-AXI-LITE总线解读 1.axi-lite概述2.信号定义Write address channelWrite data channelWrite response channelRead address channelRead data channel 3.测试4.仿真波形5.工程文件 参考手册 《3-2-03米联客2022版AXI4总线专题-20211123.pdf》 《IHI0022E_amba_…

在企业级项目中高效使用 Maven-mvnd

1、引言 1.1 什么是 Maven-mvnd? Maven-mvnd 是 Apache Maven 的一个实验性扩展工具(也称为 mvnd),基于守护进程(daemon)模型构建,目标是显著提升 Maven 构建的速度和效率。它由 Red Hat 推出,通过复用 JVM 进程来减少每次构建时的启动开销。 1.2 为什么企业在构建过…

网络字节序 - 大端

回顾主机字节序 - 大小端 发送主机将发送缓冲区中的数据按内存地址从低到高的顺序发出接收主机把从网络上接收到的数据按内存地址从底到高的顺序依次保存到接收缓冲区TCP/IP 规定,网络数据流应采用大端字节序,即低地址高字节,也就是说&#…