解决elasticsearch“Too many open files in system”问题
时间:2022-07-22
本文章向大家介绍解决elasticsearch“Too many open files in system”问题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在前两次集群扩容的过程中,总是会出现Too many open files in system问题。对于这个问题,困扰了一段时间。由于elasticsearch在非root用户下运行,开始以为只需要调整limit.conf中的句柄数配置就好。但是在我的句柄数已经调到655350之后,还出现这个问题。我通过检查 lsof 命令发现单个节点的句柄数并不在一个数量级。
如上图所示。 现在证明造成打开文件过多的问题的思路并非局限在limit配置。还需要考虑elasticsearch何时会创建大批量的文件? 仔细查看了elasticsearch文档,发现如下描述:
由于自动刷新流程每秒会创建一个新的段,这样会导致短时间内的段数量暴增。而段数目太多会带来较大的麻烦。 每一个段都会消耗文件句柄、内存和cpu运行周期。更重要的是,每个搜索请求都必须轮流检查每个段;所以段越多,搜索也就越慢。
Elasticsearch通过在后台进行段合并来解决这个问题。小的段被合并到大的段,然后这些大的段再被合并到更大的段。
段合并的时候会将那些旧的已删除文档从文件系统中清除。被删除的文档(或被更新文档的旧版本)不会被拷贝到新的大段中。
过程如下图:
琐碎的段会自动合并为一个大段,在新的大段被创建完成并flash之后,旧的段会被删除。
因此,这就解释了“Too many open files in system”问题出现的原因: 在系统扩容的过程中,会有大量的数据被平衡到新的节点,这样会消耗大量的IO,同时,elk集群中的新数据,由于没有对数据节点做冷热区分,会源源不断的写入到新节点,这就造成了新节点中的段会非常多,旧的段无法合并,新的数据又在源源不断的写入,这就造成了文件数会越来越多,因此出现了上述问题。
要想彻底解决上述问题,只有一个办法,那就是定期对段进行合并。elk官方建议段的数量是一个分片只有一个。 可以通过如下api进行设置:
POST /{indexname}/_forcemerge?max_num_segments=1
还支持通配符:
POST /applog-prod-2016.12.*/_forcemerge?max_num_segments=1
可以通过如下API查看索引的段信息:
GET applog-prod-2016.11.30*/_segments
如下是段合并的效果:
总结: 1.需要对elasticsearch制定冷/热策略,将节点分为存放历史数据的冷节点,和存放实时数据的热节点。 2.需要定时对冷数据进行段合并。
- Python 元类(MetaClass)
- linux学习第三十六篇:MariaDB安装,Apache安装
- Python 5种连接字符串的方法
- Python 装饰器(Decorator)
- linux学习第三十七篇:安装PHP5,安装PHP7
- linux学习第三十八篇: Apache和PHP结合,Apache默认虚拟主机
- Python lambda表达式
- Python的闭包(Closure)与惰性计算(Lazy Evaluation)
- linux学习第三十九篇:Apache用户认证,域名跳转,Apache访问日志
- Python sorted()函数
- Python filter()函数
- Python reduce()函数
- Python map()函数
- Python iterator迭代器
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Thinkphp5框架简单实现钩子(Hook)行为的方法示例
- Android PhoneWindowManager监听屏幕右侧向左滑动实现返回功能
- Laravel框架创建路由的方法详解
- Android 进度条 ProgressBar的实现代码(隐藏、出现、加载进度)
- 解决Laravel blade模板转义html标签的问题
- laravel 配置路由 api和web定义的路由的区别详解
- Flutter 实现网易云音乐字幕的代码
- Yii框架通过请求组件处理get,post请求的方法分析
- PHP实现单文件、多个单文件、多文件上传函数的封装示例
- Android自定义控件单位尺寸实现代码
- Android中socket通信的简单实现
- Thinkphp5框架使用validate实现验证功能的方法
- Android通过Java sdk的方式接入OpenCv的方法
- php+js实现的无刷新下载文件功能示例
- Android如何获取视频首帧图片