您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

Elasticsearch与文件描述符的恩恩怨怨

时间:2023-12-13 15:10:18  来源:今日头条  作者:不焦躁的程序员

提到Elasticsearch,让笔者最恶心的倒不是它的反人类的DSL设计,而是每次安装都需要修改进程的最大文件描述符。那ES与文件描述符有啥恩怨呢,下面就来唠叨唠叨。首先说说文件描述符、在说说ES为什么要这么多文件描述符。

一、文件描述符

1、什么是文件描述符

文件描述符(File descriptor)是操作系统为了高效管理文件所创建的一种索引,用于指向被打开的文件,所有I/O操作都是通过文件描述符来实现。有的地方也会说成是文件句柄,他俩有些区别,这里为了方便理解,暂且认为一样。

如果以文件句柄(File Handle)来理解的话,也很形象。Handle是门把手的意思,我们用门把手操作门,类似的,进程用文件句柄操作底层操作系统的资源。

linux中,遵循一切皆是文件的原则,磁盘文件、目录、设备、网络套接字、硬件等都是文件。当进程读写文件,在打开时,文件和进程就建立了连接,文件描述符就是这个连接。

文件描述符实际上就是对内核层的一个硬件资源实例的指针的引用。当然啦,它和指针也是有区别的,指针是栈上的变量,用来操作堆内存里的对象。

文件描述符在系统里的位置见下图:

Elasticsearch与文件描述符的恩恩怨怨

 

2、为什么需要文件描述符

这里还用门把手举例。一扇门如果有多个把手,被不同的人操作,那门往哪儿走就不确定了,很容易出现争论。为了避免这种情况,门只有一个把手。

为了解决系统资源浪费和资源冲突的问题,操作系统不会让每个用户层的进程都在内核层创建一个硬件资源实例。在操作同一个系统硬件资源时,用户层可能有多个进程,但是都对应到内核层的一个进程。

3、文件描述符数量限制

操作系统会为进程设置一个默认的可以操作的文件描述符数量,进程打开的文件数量或者需要的文件数量超过这个数字时就会抛出异常。

通过ulimit -a命令可以查看可操作的文件描述符数量。通过vim /etc/security/limits.con可以修改进程可操作性的文件描述符数量。

二、ES为什么要这么多文件描述符

在说ES为什么要这么多文件描述符之前,先简单说说ES写入数据的过程。

1、ES写入数据的过程

1.1、写入的主要流程

假设有3个节点:node1、node2、node3,其中node2是主节点,写入数据的主要流程如下:

  1. 客户端的请求携带数据,到达node1,node1找到主分片所在的node2。
  2. node1将数据转发到主分片所在node2,node2将数据写入主分片。
  3. 主分片写入成功后,node2将数据转发到node1和node3,node1和node3将数据写入副本分片。
  4. 所有副本分片都写入成功后,node2向 客户端所请求的节点node1 返回写入成功的消息。
  5. 客户端所请求的节点node1向客户端返回成功。

1.2、写入的细节流程

ES写入数据的细节流程分为4步:Refresh操作、写Transaction Log、Flush操作***、Merge***操作

  • Refresh操作:在文档写入ES时首先会写到Index Buffer里,然后每隔一秒执行一次Refresh操作,把Index Buffer里的数据写入磁盘缓存里,但不会调用fsync刷到硬盘。因为数据被Refresh 后才能被检索出来,所以ES是近实时的搜索引擎
  • 写Transaction Log:文档写入到Index Buffer后,数据是没有刷到硬盘的,存在数据丢失的风险。为了保证数据不丢失,在写完 Index Buffer 后,系统还要写Transaction Log,写Transaction Log默认是调用 fsync 进行刷盘的。ES重启时会从Transaction Log中恢复数据,防止数据丢失。
  • Flush操作:Flush操作会将磁盘缓存持久化到磁盘中,默认30分钟 或 在Transaction Log写满时触发。Flush将磁盘缓存 持久化到磁盘后,会清空Transaction Log。
  • Merge操作:在每次Refresh 后都会创建一个新的Segment文件,随着时间推移和索引越来越多,Segment文件会暴增,这时会带来许多问题,比如消耗过多的文件描述符、内存、CPU时间周期等,而且每次搜索都要检查每个Segment然后再合并结果,所以Segment越多、搜索也就越慢,因此需要合并Segment。ES会自动执行Merge操作,然后物理删除过多的Segment文件。
Elasticsearch与文件描述符的恩恩怨怨

 

2、为什么要这么多文件描述符

通过以上ES写数据的流程可以知道,ES在每次Refresh时都会创建新的Segment,创建索引的过程中会创建大量的Segment。Segment内部一般包含着:词项、词频、文档之间的关系。每个Segment都是一个文件,ES使用了大量的文件。每一个Segment都会消耗文件描述符、内存和CPU运行周期。同时,ES 在节点之间进行通信和数据拷贝、ES在和客户端之间进行通信等,也使用了大量的网络资源。

基于以上原因,ES需要大量的文件描述符。Linux 系统为进程准备了一个默认的文件描述符数量,但是这对ES节点来说有点低了,所以要调大文件描述符数量。

3、Linux命令lsof

lsof命令是Linux系统管理工具,人如其名,“列出打开文件(lists openfiles)”。

lsof -p pid命令:显示系统中某个进程当前已打开的所有文件列表。

执行lsof -p 29624时,可以看到大量的文件,索引越多,写入的数据越多,文件描述符数量越多。

执行lsof -p 29624|wc -l,可以查看进程打开文件的总数。

Elasticsearch与文件描述符的恩恩怨怨

 

4、其余的文件描述符不够用的情况

1、大量新的数据源源不断的快速写入到ES,造成临时的Segment文件越来越多,ES无法快速合并成一个大的Segment。在查询时,如果查询的数据对应到多个Segment,那么打开的文件描述符就很多了。

2、机器内存过小,资源紧张时内存不够,会触发OOM-Killer将ES进程杀死,其实是一种假死的,因为进程被Kill掉之后,保活进程又会将ES重启,而每次重启后都会产生新的translog文件,并且没有把之前旧的日志文件删除,最终把系统的文件描述符耗尽。

3、如果还有其余场景的话,欢迎朋友们在留言区补充。

三、总结

本文主要说了 文件描述符 和 ES为什么要这么多文件描述符,希望对你有帮助,核心概念如下:

  • 文件描述符:用户层的进程 对 内核层一个 硬件资源实例 的指针 的引用。
  • ES写入流程:Refresh操作、写Transaction Log、Flush操作、Merge操作。
  • 为什么要这么多:ES在每次Refresh时都会创建新的Segment,随着时间的推移和索引的增多,会导致短时间内的Segment数量暴增。ES 在节点之间进行通信和数据拷贝、ES在和客户端之间进行通信等原因,所以需要大量的文件描述符。

本篇完结!感谢你的阅读,欢迎点赞 关注 收藏 私信!!!



Tags:Elasticsearch   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Elasticsearch 性能优化详解
硬件配置优化升级硬件设备配置一直都是提高服务能力最快速有效的手段,在系统层面能够影响应用性能的一般包括三个因素:CPU、内存和 IO,可以从这三方面进行 ES 的性能优化工作。...【详细内容】
2024-03-07  Search: Elasticsearch  点击:(25)  评论:(0)  加入收藏
ElasticSearch 的概念解析与使用方式
ElasticSearch(后续简称 ES)在企业中的使用可以说是非常广泛了,那么 ES 到底是什么呢?我们学习 ES 能做到哪些事情呢?接下来我将用几篇文章详细聊一聊 ES。ES 是一款高性能的分布...【详细内容】
2023-12-29  Search: Elasticsearch  点击:(112)  评论:(0)  加入收藏
一口气看完43个关于 ElasticSearch 的实操建议
一、前言本文分享了在工作中关于 ElasticSearch 的一些使用建议。和其他更偏向手册化更注重结论的文章不同,本文将一定程度上阐述部分建议背后的原理及使用姿势参考,避免流于...【详细内容】
2023-12-28  Search: Elasticsearch  点击:(94)  评论:(0)  加入收藏
一口气看完 43 个关于 ElasticSearch 的使用建议
一、前言本文分享了在工作中关于 ElasticSearch 的一些使用建议。和其他更偏向手册化更注重结论的文章不同,本文将一定程度上阐述部分建议背后的原理及使用姿势参考,避免流于...【详细内容】
2023-12-19  Search: Elasticsearch  点击:(174)  评论:(0)  加入收藏
Elasticsearch与文件描述符的恩恩怨怨
提到Elasticsearch,让笔者最恶心的倒不是它的反人类的DSL设计,而是每次安装都需要修改进程的最大文件描述符。那ES与文件描述符有啥恩怨呢,下面就来唠叨唠叨。首先说说文件描述...【详细内容】
2023-12-13  Search: Elasticsearch  点击:(121)  评论:(0)  加入收藏
Mongodb和Elasticsearch计算经纬度哪个性能更好
MongoDB和Elasticsearch都支持计算经纬度距离,但它们的性能表现可能因使用场景和数据规模而异。性能对比1、数据索引和存储 MongoDB使用地理空间索引(2dsphere)来支持经纬度数...【详细内容】
2023-12-11  Search: Elasticsearch  点击:(205)  评论:(0)  加入收藏
SpringBoot整合ElasticSearch详解及相关使用方法
环境:springboot2.4.12 + ElasticSearch7.8.0简介Elasticsearch是一个分布式搜索引擎,底层基于Lucene实现。它屏蔽了Lucene的底层细节,提供了分布式特性,同时对外提供了Restful...【详细内容】
2023-11-10  Search: Elasticsearch  点击:(201)  评论:(0)  加入收藏
Elasticsearch的实际应用与扩展案例
当谈到搜索和分析大量数据时,Elasticsearch 是一个强大且广泛使用的工具。它是一个开源的分布式搜索和分析引擎,被设计用于处理海量数据,并提供实时的搜索、分析和可视化功能。...【详细内容】
2023-10-16  Search: Elasticsearch  点击:(269)  评论:(0)  加入收藏
十分钟掌握Doris,超越Hive、Elasticsearch和PostgreSQL
以前,数据仓库通常由Apache Hive、MySQL、Elasticsearch和PostgreSQL组成。它们支持数据仓库的数据计算和数据存储层: 数据计算:Apache Hive作为计算引擎。 数据存储:MySQL为Dat...【详细内容】
2023-09-27  Search: Elasticsearch  点击:(223)  评论:(0)  加入收藏
何时使用Elasticsearch,而不是MySQL?
MySQL 和 Elasticsearch 是两种不同的数据管理系统,它们各有优劣,适用于不同的场景。本文将从以下几个方面对它们进行比较和分析: 数据模型 查询语言 索引和搜索 分布式和高可...【详细内容】
2023-08-22  Search: Elasticsearch  点击:(195)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(5)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(12)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(8)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(10)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(8)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(5)  评论:(0)  加入收藏
站内最新
站内热门
站内头条