当前位置: 首页 > news >正文

深入理解Elasticsearch高效原理

在当今数据驱动的世界中,能够快速有效地存储、搜索和分析庞大数据集变得至关重要。Elasticsearch是一个强大的开源搜索和分析引擎,专为云计算中心而设计,能够提供快速的搜索功能,并且能够扩展到包含数百个服务器的集群,存储PB级别的数据。

Elasticsearch的特点

  • 分布式本质:Elasticsearch天生分布式,这意味着它可以轻松处理大量数据并分散在多个服务器上。
  • 实时搜索:提供近乎实时的搜索功能,这对于需要快速访问数据的应用至关重要。
  • 高可用性和扩展性:通过复制和分片机制确保数据的高可用性和容错能力,同时保持良好的扩展性。
  • 多种数据类型支持:支持结构化数据(如JSON)和非结构化数据,提供多种搜索能力,如全文搜索、结构化搜索和地理位置搜索。
  • 强大的API:提供丰富的API,包括RESTful API和各种编程语言的客户端库,简化开发人员的工作。

应用场景

Elasticsearch广泛应用于各个领域,包括但不限于:

  • 日志和事务数据分析:对系统产生的日志进行实时监控和分析。
  • 全文搜索:为各种文档和内容提供全文搜索功能,如电子商务网站、文档库等。
  • 安全情报:分析网络数据,以检测潜在的安全威胁和异常行为。
  • 大数据分析:处理和分析大规模数据集,以洞察趋势和模式。

核心概念

  • 节点和集群:节点是安装了Elasticsearch的单个服务器,而集群是由多个节点组成,共同工作以提供整体功能的实体。
  • 索引:索引是具有相似特性的文档集合,是数据存储的地方。
  • 文档:文档是可以被索引的基本信息单位,通常以JSON格式存在。
  • 分片和副本:分片是索引的子集,可分布在不同的节点上,以支持数据的水平扩展。副本是分片的复制品,用于提高数据的可用性和搜索性能。

数据写入过程

Elasticsearch的数据写入过程是一个精心设计的流程,确保了数据的快速索引与持久化,同时也保障了系统的性能和稳定性。这一过程可以细分为几个关键步骤,包括文档的索引、写入事务日志、缓冲区管理、刷新机制,以及最终的段存储。

1. 文档索引

  • 索引请求:数据写入开始于一个索引请求,客户端通过HTTP POST或PUT请求将一个文档发送到指定的索引。Elasticsearch接收到这个请求后,会解析文档内容,并准备将其存储到相应的索引分片中。
  • 路由文档:Elasticsearch首先确定这个文档应该存储在哪个分片上。这一过程称为路由,通常是基于文档的ID或某个字段值进行哈希计算来完成的。

2. 写事务日志(Translog)

  • 事务日志的写入:为了保证在发生故障时能够恢复数据,每个文档更新操作在被索引之前都会先写入到事务日志(Translog)中。这个日志是一个持久化的日志,记录了所有对Elasticsearch索引所做的操作。

3. 文档缓冲和索引

  • 内存缓冲区:文档被写入到内存缓冲区中,这是一个倒排索引结构,它暂时保存了文档数据和索引信息。这个阶段的数据还没有被持久化到磁盘上。
  • 刷新(Flush):为了将内存缓冲区的数据持久化,Elasticsearch会定期执行刷新操作。刷新操作会将内存缓冲区的数据写入到新的段(Segment)文件中,并更新段信息到磁盘上的索引文件中,此时数据才真正被持久化。

4. 刷新机制

  • 触发刷新:刷新可以由几种情况触发:一是达到了自动刷新间隔(默认是1秒);二是内存缓冲区达到了一定大小;三是手动触发刷新操作。
  • 刷新过程:在刷新过程中,当前的内存缓冲区被转换成一个新的不可变的段,这个新段被写入到磁盘上。同时,事务日志也会被清空,因为所有的操作都已经持久化到了段中。

5. 段(Segments)的创建与管理

  • 不可变的段文件:每次刷新操作都会生成一个新的段文件。段是Elasticsearch数据持久化的基础单位,它是一个包含了倒排索引的Lucene索引文件。
  • 段合并:随着写入和删除操作的进行,会产生许多小的段文件,这些文件会占用额外的磁盘空间并且影响查询性能。Elasticsearch会定期后台执行段合并操作,将多个小段合并成较大的段,以优化磁盘空间使用和提升查询效率。

6. 数据持久化与恢复

  • 数据持久化:一旦文档被写入段中,并且这个段被写入磁盘,文档就被认为是持久化了。在Elasticsearch重启或者发生故障时,可以通过这些段来恢复数据。

  • 恢复机制:在Elasticsearch启动或者分片需要从故障中恢复时,它会读取

  • 磁盘上的段文件以及最后一次刷新操作之后记录在事务日志(Translog)中的所有操作,以重建索引的最新状态。

  • Translog恢复:当节点重启或分片迁移后,Elasticsearch首先会加载磁盘上的段文件到内存中,然后应用事务日志中记录的操作。这些操作包括了自上次刷新以来发生的所有写入、更新和删除操作,确保了即使发生崩溃,这段时间内的更改也不会丢失。

索引的最终一致性

  • 保证数据一致性:通过上述机制,Elasticsearch确保了即使在发生节点故障或网络分区等情况下,一旦文档被成功索引(客户端收到成功响应),该文档的数据就不会丢失。刷新操作和事务日志保证了数据的持久化,而段合并则优化了存储结构,提高了查询效率。
  • 最终一致性模型:Elasticsearch采用最终一致性模型,这意味着在极端情况下,可能会短暂地观察到数据不一致的情况(例如,在集群重新平衡或恢复期间)。然而,一旦系统稳定,所有的副本最终会达到一致的状态。

写入性能与可靠性的平衡

  • 性能考虑:虽然频繁的刷新操作可以减小数据丢失的风险,但它也会增加I/O负载,影响写入性能。Elasticsearch默认的刷新间隔是一种在性能和数据持久化之间的权衡。
  • 调整刷新策略:根据应用需求,可以调整刷新策略。例如,在批量导入数据时,可以增加刷新间隔以提高导入速度;在对数据实时性要求较高的场景中,可以减小刷新间隔或手动触发刷新,以减少数据丢失的风险。

数据读取过程

读取数据过程包括:

  1. 发起查询:客户端通过API发送查询请求到Elasticsearch。
  2. 查询执行:Elasticsearch解析查询,然后在相关的分片上执行搜索操作。
  3. 结果汇总:搜索结果从各个分片返回并汇总。

返回结果:汇总后的结果返回给客户端,通常包括匹配的文档及其相关性得分。

高可用性原理

Elasticsearch的高可用性基于以下几个核心机制:

  • 数据副本:通过在不同节点上创建索引分片的副本,Elasticsearch确保了即使在节点故障的情况下也能保持数据的可用性和搜索操作的连续性。副本不仅提高了系统的容错能力,还能通过在副本之间负载均衡读取请求来提高查询性能。
  • 主分片和副本分片的选举:每个索引分为多个分片,每个分片有一个主分片和一个或多个副本分片。主分片负责处理写入操作,而所有分片(包括主分片和副本分片)都可以处理读取操作。当主分片因为某些原因不可用时,系统会从副本分片中选举出一个新的主分片。
  • 故障转移和恢复:Elasticsearch监控节点和分片的状态,一旦检测到节点失败,它会自动将失败节点上的主分片的职责转移到该分片在其他节点上的副本中。此外,它还会开始重新分配和复制丢失的分片副本以恢复集群的冗余。
  • 集群状态管理:Elasticsearch维护一个集群状态,其中包含所有索引的定义、分片位置等信息。集群状态在所有节点之间共享和同步,以确保即使在发生故障时,集群的整体状态也能够快速恢复。
  • 数据一致性:虽然Elasticsearch优化了性能和可扩展性,但同时也提供了数据一致性机制,如写入确认和副本同步,以确保数据的一致性和可靠性。

相关文章:

深入理解Elasticsearch高效原理

在当今数据驱动的世界中,能够快速有效地存储、搜索和分析庞大数据集变得至关重要。Elasticsearch是一个强大的开源搜索和分析引擎,专为云计算中心而设计,能够提供快速的搜索功能,并且能够扩展到包含数百个服务器的集群&#xff0c…...

http和socks5代理哪个隐蔽性更强?

HTTP代理和SOCKS5代理各有其优缺点,但就隐蔽性而言,SOCKS5代理通常比HTTP代理更隐蔽。以下是它们的比较: HTTP代理: 透明性较高:HTTP代理在HTTP头中会透露原始客户端的IP地址,这使得它相对不太隐蔽。…...

邮箱的正则表达式

一、 背景 项目中要给用户发送邮件,这时候需要校验用户输入的邮箱的有有效性,这肯定用正则呀。 虽然没有统一的邮箱账号格式,但是所有邮箱都符合“名称域名”的规律。对于名称和域名的字符限制,我们可以根据项目的情况定义一个&a…...

blender插件笔记

目录 文件拖拽导入 smpl导入导出 好像可以导入动画 smpl_blender_addon导入一帧 保存pose 导入导出完整代码 文件拖拽导入 https://github.com/mika-f/blender-drag-and-drop 支持格式: *.abc*.bvh*.dae*.fbx*.glb*.gltf*.obj*.ply*.stl*.svg*.usd*.usda*.…...

解释关系型数据库和非关系型数据库的区别

一、解释关系型数据库和非关系型数据库的区别 关系型数据库和非关系型数据库在多个方面存在显著的区别。 首先,从数据存储方式来看,关系型数据库采用表格形式,数据存储在数据表的行和列中,且数据表之间可以关联存储,…...

YAML-02-yml 配置文件 java 整合使用 yamlbeans + snakeyaml + jackson-dataformat-yaml

java 中处理 yml 的开源组件是什么? 在Java中处理YAML(YAML Aint Markup Language)格式的开源组件有很多,其中一些比较常用的包括: SnakeYAML: SnakeYAML 是一个Java库,用于解析和生成YAML格式…...

【综述+LLMs】国内团队大语言模型综述:A Survey of Large Language Models (截止2023.11.24)

Github主页: https://github.com/RUCAIBox/LLMSurvey 中文版v10:https://github.com/RUCAIBox/LLMSurvey/blob/main/assets/LLM_Survey_Chinese.pdf 英文版v13: https://arxiv.org/abs/2303.18223 解析:大语言模型LLM入门看完你就懂了(一&…...

开始喜欢上了runnergo,JMeter out了?

RunnerGo是一款基于Go语言、国产自研的测试平台。它支持高并发、分布式性能测试。和JMeter不一样的是,它采用了B/S架构,更灵活、更方便。而且,除了API测试和性能测试,RunnerGo还加上了UI测试和项目管理等实用功能,让测…...

LLM - 大语言模型的分布式训练 概述

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/136924304 大语言模型的分布式训练是一个复杂的过程,涉及到将大规模的计算任务分散到多个计算节点上。这样做的目的是为了处…...

Spring Cloud Alibaba 整合Seata分布式事务

目录 前言步骤引入相关maven依赖添加相关配置Client端配置注册中心Server端配置注册中心Seata-Server相关配置启动seata-server 使用方法Seata AT 模式整体机制 步骤初始化表结构标记注解GlobalTransactional 总结 前言 在数字化转型的浪潮下,企业业务系统的复杂度…...

unity 多屏幕操作

想了解基础操作请移步:(重点是大佬写的好,这里就不再赘述) Unity 基础 之 使用 Display 简单的实现 多屏幕显示的效果_unity display-CSDN博客 在panel上也可以通过获取 Canvas,来达到切换多屏幕的操作, …...

4、Jenkins持续集成-用户权限和凭证管理

文章目录 一、用户权限管理1、安装用户权限管理插件2、开启权限全局安全配置3、创建角色4、创建用户5、给用户分配角色6、创建项目测试权限二、凭证管理1、安装凭证管理插件2、安装Git插件和工具2.1 用户密码类型2.2 SSH密钥类型一、用户权限管理 利用Role-based Authorizatio…...

K8s-网络原理-中篇

引言 本文是《深入剖析 K8s》的学习笔记,相关图片和案例可从https://github.com/WeiXiao-Hyy/k8s_example中获取,欢迎 ⭐️! 上篇主要介绍了 Flannel 插件为例,讲解了 K8s 里容器网络和 CNI 插件的主要工作原理。还有一种“纯三层”的网络方…...

vue基础——java程序员版(vue路由)

1、引入路由 在控制台执行vue ui,在插件市场里可以找到vue-router并导入。 ​ 一般情况下,vue会自动在main,js中引入vue-router,如下: import Vue from vue import App from ./App.vue import ./plugins/element.js import rou…...

【vue3学习之路(一)】

文章目录 前言一、vue3项目创建1.1环境准备1.1.1 基于 vue-cli 创建(脚手架创建)1.1.2 基于 vite 创建(推荐) 二、熟悉流程总结 前言 参考视频:https://www.bilibili.com/video/BV1Za4y1r7KE?p10&spm_id_frompag…...

基于Spring Boot网络相册设计与实现

摘 要 网络相册设计与实现的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品,体验高科技时代带给人们的方便,同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓,iOS相比较起来&am…...

6 Spring-AOP

文章目录 1,AOP简介1.1 什么是AOP?1.2 AOP作用1.3 AOP核心概念 2,AOP入门案例2.1 需求分析2.2 思路分析2.3 环境准备2.4 AOP实现步骤步骤1:添加依赖步骤2:定义接口与实现类步骤3:定义通知类和通知步骤4:定义切入点步骤5:制作切面步骤6:将通知类配给容器…...

这回轮到鸿蒙禁用安卓了!!!

1月18日,鸿蒙生态千帆仪式上,华为正式宣布了HarmonyOS NEXT(下简称鸿蒙星河版或纯血鸿蒙)开发者预览已向开发者开放申请,纯血鸿蒙开始走向普及阶段。伴随着不再兼容安卓的纯血鸿蒙铺开,鸿蒙走进了运营属于自…...

Java问题详解

在Java中,问题可能涵盖多个领域,如基础知识、高级特性、设计模式、性能优化、并发编程等。下面,我将提供两个问题以及对它们的详细回答。请注意,2000字的要求可能过于庞大,我将尽量确保回答详细而不过于冗长。 问题1&…...

Go——指针和内存逃逸

区别于C/C中的指针,Go语言中的指针不能进行偏移和运算,是安全指针。 要搞明白Go语言中的指针概念需要先知道3个概念:指针地址,指针类型和指针取值。 一. Go语言的指针 Go语言中的函数传参都是值拷贝,当我们想修改某个…...

接口测试中缓存处理策略

在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

Monorepo架构: Nx Cloud 扩展能力与缓存加速

借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...