深入理解Elasticsearch分片

news2024/11/24 14:40:08

了解分片的基本原理,对Elasticsearch性能调优有帮助。

关系梳理

ES底层使用的是Lucene库,ES的分片(shard )是Lucene的索引,ES的索引是分片的集合,Lucene的索引是由多个段(segment)组成。

在这里插入图片描述

段(segment)

Per-segment search,也即按段搜索,是Lucene中的概念。每个段本身就是一个倒排索引,Lucene中的索引除了表示段的集合外,还增加了提交点的概念,一个提交点就是一个列出了所有已知段的文件。

在这里插入图片描述

Per-segment search的工作流程如下:

  1. 新的文档首先被写入内存区的索引缓存(buffer)。
  2. 不时,这些buffer被提交。
  3. 新段被打开,它包含的文档可以被检索。
  4. 内存的缓存被清除,等待接收新的文档。

在这里插入图片描述

在这里插入图片描述

提交

一次完整的提交会将段刷到磁盘,并写入一个包含所有段列表的提交点。ES在启动或重新打开一个索引的过程中使用这个提交点来判断哪些段隶属于当前分片。

不可变性

写入磁盘的倒排索引是不可变的,也即段是不可改变的,所以既不能把文档从旧的段中移除,也不能修改旧的段来更新文档。取而代之的是,每个提交点会包含一个 .del 文件,它记录了段中被删除的文档。

当一个文档被 “删除” 时,它实际上只是在 .del 文件中被标记为删除。一个被标记为删除的文档仍然可以被查询匹配到,但它会在最终结果被返回前从结果集中移除。

文档更新也是类似的操作方式:当一个文档被更新时,旧版本文档被标记为删除,文档的新版本被索引到一个新的段中。 可能两个版本的文档都会被一个查询匹配到,但被删除的那个旧版本文档在结果集返回前会被移除。

近实时搜索

提交一个新的段到磁盘需要调操作系统的fsync方法,确保段被物理地写入磁盘,即使断电也不会丢失数据。但是fsync是昂贵的,它不能在每个文档被索引时就触发。所以需要一种更轻量级的方式使新的文档可以被搜索。

位于ES和磁盘间的是文件系统缓存。在内存索引缓存中的文档被写入新的段,新的段首先写入文件系统缓存,这代价很低,之后会被同步到磁盘,这代价很大。一旦一个文件被缓存,它也可以被打开和读取,就像其他文件一样。

在这里插入图片描述

在这里插入图片描述

Refresh

在ES中,refresh是指这样一个过程:将In-memory buffer中的文档写入到文件系统缓存中新的段,新的段被打开(可被搜索)。默认情况下每个分片会每秒自动刷新一次。文档在In-memory buffer中是不能被搜索的,写入到段里面才能被搜索。这就是为什么我们说Elasticsearch是近实时搜索: 文档的变化并不是立即对搜索可见,但会在一秒之内变为可见。

Flush

在ES中,进行一次提交并删除事务日志的操作叫做flush。一些老资料说ES每30分钟flush一次,或者事务日志过大也会flush。官网最新的说法是ES根据需要自动触发刷新,主要取决于事务日志的大小和权衡执行flush的成本。也可以调用flush API主动flush。

Translog

Translog全称transaction log(事务日志)。事务日志主要是为了防止在两次提交之间的数据丢失。事务日志也被用来提供实时 CRUD ,当你通过文档ID查询、更新、删除一个文档,在从相应的段检索之前, ES会首先检查事务日志最新的改动,这意味着ES总是能够通过文档ID实时地获取到文档的最新版本。

事务日志并不是实时落盘的,而是定期刷到磁盘。所以事务日志其实也是存在丢失的可能性的。那么这里就有一个问题,既然调用fsync的提交是一种昂贵的操作,为了防止数据丢失引入了事务日志,但是事务日志也需要刷到磁盘才能保证数据不丢,那事务日志的意义何在?答案是事务日志的刷盘更轻量级,因为它调用的是fdatasync这个系统函数,而不是fsync。感兴趣的可以了解下fsync和fdatasync的差别。

完整流程

我们将上述知识点串起来得到完整流程。

  1. 当一个文档被索引,它被加入到内存缓存,同时写入事务日志。

在这里插入图片描述

  1. 分片每秒都进行refresh。refresh后,内存缓冲区的文档被写入到文件系统缓存;段被打开,使得新的文档可以被搜索;缓存被清除。

在这里插入图片描述

  1. 更多的文档加入到缓冲区,写入事务日志,这个过程会持续。

在这里插入图片描述

  1. 不时的,比如事务日志很大了,会进行一次全提交。内存缓冲区的所有文档会写入到新的段中;缓冲区被清空;一个提交点写入磁盘;文件系统缓存通过fsync操作flush到磁盘;事务日志被清除。

在这里插入图片描述

合并段

通过每秒自动刷新创建新的段,用不了多久段的数量就爆炸了。每个段都会消费文件句柄、内存、CPU资源。更重要的是,每次搜索请求都需要依次检查每个段。段越多,查询越慢。

ES通过后台合并段解决这个问题。小段被合并成大段,再合并成更大的段。合并段时会真正删除被标记为已删除的文档。旧的段不会再复制到更大的新段中。这个过程你不必做什么,当你在索引和搜索时ES会自动处理。这个过程不会中断索引和搜索。

两个提交的段和一个未提交的段合并为了一个更大的段。

在这里插入图片描述

这期间发生一系列操作:新的段flush到了硬盘;新的提交点写入新的段,排除旧的段;新的段打开供搜索;旧的段被删除。

在这里插入图片描述

合并大的段会消耗很多IO和CPU,如果不合并又会影响到搜索性能。默认情况下,ES会限制合并过程,这样搜索就可以有足够的资源进行。optimize API可以强制合并段。

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

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

相关文章

青岛OJ如何导入题库详细图示

打开你的后台管理 找到问题位置 增加题目是可以编辑题目,导入数据。 导入导出是用题目和数据直接导入的。 这个ID的话就是题目ID不能设置一样的 然后题目输入输出就都不说了 按照格式就可以了,这里说一下Tag是标签,每次都要设置&#xff…

shell-条件测试

1、编写一个 Shell脚本,程序执行时从键盘读入一个目录名,如果用户输入的目录不存在,则提示file does not exist;如果用户输入的不是目录则提示用户必须输入目录名;如果用户输入的是目录则显示这个目录下所有文件的信息…

小程序版 Three.js 框架下载及目录配置

1.库文件说明 由于微信官方提供的threejs适配库已经很久没有更新,而且开发者普遍反映使用起来很难用。 我这里分享的是独立的库文件,不需要npm安装,下载后将库文件放到项目中即可使用。 2.下载后的压缩包文件 3.解压后的文件夹结构 4.文件…

Vue2和Vue3的双向数据绑定原理

目录前言:vue2.x 是如何实现响应式系统的:defineProperty 的痛点:Object.defineProperty 代码的使用Proxy 方法的理解Proxy 代码的使用:总结:前言: 今天小编给大家讲解一下,Vue2和Vue3的双向数据…

CAPL学习之路-测试功能集函数(诊断测试)

TestCollectDiagEcuInformation 向诊断目标的诊断类下的所有诊断服务发送诊断请求,并将诊断响应写入测试报告中 testcase TCExample() {int status;status = TestCollectDiagEcuInformation( "Door", "Sessions");if( status == 0)TestStepPass( "EC…

javaweb项目接入CAS单点认证(含自身系统的三员过滤)

一、搭建cas server 1.下载war包 2.打开cmd窗口执行以下命令,命令如下(指定ip): keytool -genkey -v -alias casbm -keyalg RSA -keystore D:\cas\keystore\casbm.keystore -ext SANIP:192.168.2.166 3.我们生成秘钥库后需要从秘钥库中导出证书&#x…

D. Distinct Characters Queries(set维护)

Problem - 1234D - Codeforces 给你一个由小写拉丁字母组成的字符串s和对这个字符串的q个查询。 回顾一下,字符串s的子串s[l;r]就是字符串slsl1...sr。例如,"codeforces "的子串是 "code"、"force"、"f"、&quo…

spring6(概念;ioc详解,各种数据的注入方式)

第一章 启示录 一个普通的三层架构,不借助spring的情况下。需要程序员自己去new对象。 如果使用这种方式,那么代码上就把功能写死了,这时候需要更改一个数据库连接。这是时候数据交互层的代码就需要修改。这违背了OCP开闭原则。 1.1 OCP开闭…

Bert 得到中文词向量

通过bert中文预训练模型得到中文词向量和句向量,步骤如下: 下载 bert-base-chiese模型 只需下载以下三个文件,然后放到bert-base-chinese命名的文件夹中 得到中文词向量的代码如下 import torch from transformers import BertTokenizer,…

can8.0-基础知识

1、canopen协议概述 1.1对象字典 CANopen 协议采用了带有 16 位索引和 8 位子索引的对象字典,对象字典的结构如表 1.2 常用的通信对象 1) 网络管理对象 (NMT) 2) 服务数据对象 (SDO) 3) 过程数据对象 (PDO) 4) 同步对象 (SYNC) 5) 紧急报文 (EMCY) 1.3 通信对象…

PISR 数据库,区块链和大数据的下一个最佳结合

据集合。如今,在大数据时代,数据管理越来越受到重视,已经成为一项非常重要的资产。因此,数据安全也变得越来越重要,应该引起重视。尽管现有数据库可以满足单个公司的存储依赖性,但它们很难确保公司之间协作…

React学习03-基于脚手架的React应用

初始化脚手架 使用 npx 创建 npx create-react-app 项目名使用 npm install 创建 全局安装create-react-app包: npm install -g create-react-app创建脚手架: create-react-app 项目名npm 镜像 执行 create-react-app时,还会自动安装一…

C++程序员学习资料汇总

小白入门 计算机网络微课堂(有字幕无背景音乐版) 非常适合小白学习,没有废话,非常生动 《计算机是怎样跑起来的》 《程序是怎样跑起来的》 《网络是怎样连接的》 基础 资料名备注状态阅读时间《深入理解计算机系统》很多大厂面…

实验室预约系统|基于Springboot+Vue实现学校实验室预约管理系统

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

JAVA中那些令人眼花缭乱的锁

一、开局一张图带你了解java相关的锁 二、乐观锁和悲观锁 1、悲观锁 悲观锁对应于生活中悲观的人,悲观的人总是想着事情往坏的方向发展。 举个生活中的例子,假设厕所只有一个坑位了,悲观锁上厕所会第一时间把门反锁上,这样其他…

python pyqtgraph绘图库

pyqtgraph官网 PyQtGraph被大量应用于Qt GUI平台(通过PyQt或PySide),因为它的高性能图形和numpy可用于大量数据处理。 特别注意的是,pyqtgraph使用了Qt的GraphicsView框架,它本身是一个功能强大的图形系统; 我们将最优…

知识付费海哥:这样做课,不赚钱都难

现在不少人开始了开发网课,卖网课赚钱, 但是在网课开发时,很多人开始的时候,关注的点就错了! 自己喜欢钓鱼,就开发钓鱼的课, 自己喜欢演讲,就开发演讲的课, 自己喜欢…

Dubbo入门(二)——IDEA下Dubbo+Zookeeper搭建

目录一、Zookeeper1.1 下载1.2 安装1.3 修改配置文件1.4 启动二、Dubbo插件搭建三、手动创建3.1 创建项目3.1.1 pom依赖3.2 api模块3.2.1 pom依赖3.2.2 实体类3.2.3 service接口3.3 provider3.3.1 pom依赖3.3.2 配置文件3.3.3 mapper3.3.4 service实现类3.3.5 启动类3.4 consum…

冶金工艺流程(钢铁全流程)

工艺图 工艺讲解 生产流程从矿石原料采集开始,对于低品位的矿石,必须在冶炼前经选矿工序先选出铁精矿,然后进一步制成烧结矿或球团矿。 ————————————————————————————— 高炉冶炼是一个连续的、大规模的高温生产过程。铁矿石…

为什么Aruba始终走在网络世界的前列?

编辑 | 阿冒 设计 | 沐由关于网络的价值,梅特卡夫定律(Metcalfes law)曾经在多年前就明白无误地告诉我们:VKN。其中,V代表一个网络的价值,N代表这个网络的节点数,K代表价值系数。如果梅特卡夫…