Elasticsearch 参考指南(重要的系统配置)
重要的系统配置
理想情况下,Elasticsearch应该在服务器上单独运行,并使用所有可用的资源,为了做到这一点,你需要配置你的操作系统,以允许运行Elasticsearch的用户访问默认允许的更多资源。
在进行生产之前,必须考虑以下设置。
开发模式vs生产模式
在默认情况下,Elasticsearch假定你在开发模式下工作,如果上面的任何设置没有正确配置,警告将会写入到日志文件,但是你可以启动和运行你的Elasticsearch节点。
只要你配置一个网络设置,比如network.host
,Elasticsearch假定你正在转向生产,并将上述警告升级为异常,这些异常将阻止你的Elasticsearch节点启动,这是一个重要的安全措施,以确保你不会因为配置错误的服务器而丢失数据。
配置系统设置
在哪里配置系统设置取决于你使用哪一个包来安装Elasticsearch,以及你正在使用的操作系统。
当使用.zip
或.tar.gz
包时,系统设置可配置为:
- 使用
ulimit
临时更改配置 - 在
/etc/security/limits.conf
中持久性更改配置
当使用RPM或Debian包时,大多数系统设置都是在系统配置文件中设置的,但是,使用systemd
的系统需要在systemd
配置文件中指定系统限制。
ulimit
在Linux系统上,ulimit
可以用于临时更改资源限制,在切换到要运行Elasticsearch的用户之前,限制通常需要root身份设置。例如,要将打开文件句柄的数量(
ulimit -n`)设置为65,536,你可以执行以下操作:
sudo su
ulimit -n 65536
su elasticsearch
- 切换到
root
身份 - 更改打开文件的最大数量
- 切换到
elasticsearch
用户启动Elasticsearch
新限制仅在当前会话期间适用,你可以用ulimit -a
查询所有当前应用的限制。
/etc/security/limits.conf
在Linux系统上,可以通过编辑/etc/security/limits.conf
文件来为特定用户设置持久性限制配置,要将用户打开的文件的最大数量设置为65,536,请在limits.conf
文件中添加以下一行:
elasticsearch - nofile 65536
这个更改只会在下次elasticsearch
用户打开一个新会话时生效。
Ubuntu 和 limits.conf
Ubuntu忽略了使用init.d
启动的进程的limits.conf
文件,为了启用limits.conf
文件,编辑/etc/pam.d/su
并且取消下面行的注释:
# session required pam_limits.so
Sysconfig 文件
当使用RPM或Debian包时,系统设置和环境变量可以在系统配置文件中指定,它们位于:
- RPM:
/etc/sysconfig/elasticsearch
- Debian:
/etc/default/elasticsearch
然而,对于使用systemd
的系统,系统限制需要通过systemd
来指定。
Systemd 配置
当在使用systemd
的系统上使用RPM或Debian包时,必须通过systemd
指定系统限制。
systemd服务文件(/usr/lib/systemd/system/elasticsearch.service
)包含默认的应用限制。
要覆盖它们,添加一个名为etc/systemd/system/elasticsearch.service.d/override.conf
的文件(或者,你可以运行sudo systemctl edit elasticsearch
,它在默认编辑器中自动打开文件),在此文件中设置任何更改,例如:
[Service]
LimitMEMLOCK=infinity
完成后,运行以下命令重新加载单元:
sudo systemctl daemon-reload
禁用swapping
大多数操作系统尝试使用尽可能多的内存用于文件系统缓存,并急切地交换未使用的应用程序内存,这可能导致JVM堆的某些部分甚至可执行页面被交换到磁盘。
交换对性能、节点稳定性都非常不利,应该不惜一切代价避免交换,它可以导致垃圾收集持续几分钟而不是几毫秒,还可以导致节点响应缓慢,甚至断开与集群的连接,在弹性分布式系统中,它更有效的让操作系统杀死节点。
禁用交换有三种方法,首选的选项是完全禁用交换,如果这不是一个选项,是否选择最小化的swappiness还是内存锁定取决于你的环境。
禁用所有交换文件
通常,Elasticsearch是一个容器上的唯一服务,并且它的内存使用由JVM选项控制,应该不需要启用交换。
在Linux系统上,可以运行以下命令暂时禁用交换:
sudo swapoff -a
要永久禁用它,你需要编辑/etc/fstab
文件,并注释掉任何包含单词swap
的行。
在Windows上,可以通过完全禁用分页文件来实现等效功能,通过System Properties → Advanced → Performance → Advanced → Virtual memory
。
配置 swappiness
Linux系统上的另一个可用选项是确保sysctl值vm.swappiness
设置为1
,这减少了内核交换的趋势,在正常情况下不应该引起交换,同时仍然允许整个系统在紧急情况下交换。
启用 bootstrap.memory_lock
另一种选择是在Linux/Unix系统上使用mlockall,或者在Windows上使用VirtualLock,尝试将进程地址空间锁定到RAM中,以防止任何Elasticsearch内存被交换出去,这可以通过向config/elasticsearch.yml
文件中添加这一行来实现:
bootstrap.memory_lock: true
mlockall
可能会导致JVM或shell会话退出,如果它试图分配超过可用内存的内存!
在启动Elasticsearch之后,通过检查该请求的输出中的mlockall
的值,你可以看到是否成功应用了此设置:
GET _nodes?filter_path=**.mlockall
如果你看到mlockall
为false
,那么这意味着mlockall
请求失败了,你还将看到日志中包含更多信息Unable to lock JVM Memory
词语的行。
在Linux/Unix系统上,最可能的原因是运行Elasticsearch的用户没有锁内存的权限,这可以被授予如下:
.zip
和.tar.gz
- 在启动Elasticsearch之前作为
root
身份设置ulimit -l unlimited
,或在/etc/security/limit.conf
中将memlock
设置为unlimited
。
RPM和Debian
- 在系统配置文件中将
MAX_LOCKED_MEMORY
设置为unlimited
(或参阅下面使用systemd
的系统)。
使用systemd
的系统
- 在
systemd
配置中将LimitMEMLOCK
设置为infinity
。
mlockall
失败的另一个可能原因是临时目录(通常是/tmp
)与noexec
选项一起挂载,这可以通过使用ES_JAVA_OPTS
环境变量指定一个新的临时目录来解决:
export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir"
./bin/elasticsearch
或者在jvm.options
配置文件中设置这个JVM标志。
文件描述符
这只适用于Linux和macOS,如果在Windows上运行Elasticsearch,则可以被安全地忽略,在Windows上,JVM使用的API仅限于可用资源。
Elasticsearch使用大量的文件描述符或文件句柄,耗尽文件描述符可能是灾难性的,并且很可能导致数据丢失,确保将运行Elasticsearch的用户打开的文件描述符的数量限制增加到65,536或更高。
对于.zip
和.tar.gz
包,在启动Elasticsearch之前作为root
身份设置ulimit -n 65536
,或在/etc/security/limits.conf中设置nofile
为65536
。
在macOS上,你还必须将JVM选项-XX:-MaxFDLimit
传递给Elasticsearch,以便使用更高的文件描述符限制。
RPM和Debian软件包默认文件描述符的最大数量为65536,不需要进一步配置。
你可以使用节点Stats API检查为每个节点配置的max_file_descriptors
,使用:
GET _nodes/stats/process?filter_path=**.max_file_descriptors
虚拟内存
Elasticsearch默认使用mmapfs
目录存储索引,mmap计数的默认操作系统限制可能太低,这可能导致内存不足异常。
在Linux上,可以通过以root
身份运行以下命令来增加限制:
sysctl -w vm.max_map_count=262144
要永久设置此值,请更新在/etc/sysctl.conf
中的vm.max_map_count
设置,要验证重新引导后的效果,请运行sysctl vm.max_map_count
。
RPM和Debian包将自动配置此设置,不需要进一步的配置。
线程数
Elasticsearch为不同类型的操作使用许多线程池,重要的是,它能够在需要时创建新的线程,确保Elasticsearch用户能够创建的线程数至少是4096
个。
这可以通过在启动Elasticsearch之前作为root身份设置ulimit -u 4096
,或者在/etc/security/limit.conf
中将nproc
设置为4096
来实现。
当作为服务在systemd
下运行时,包发行版将为Elasticsearch进程自动配置线程数,不需要额外的配置。
DNS缓存设置
Elasticsearch运行时有一个安全管理器,有了安全管理器,JVM默认无限期地缓存积极的主机名解析。如果你的Elasticsearch节点在DNS解析随时间变化的环境中依赖于DNS(例如,节点到节点的发现),那么你可能需要修改默认的JVM行为,这可以通过添加networkaddress.cache.ttl=<timeout>到你的Java安全策略来修改。任何未能解析的主机将被记录,还要注意,在Java安全管理器就绪后,JVM默认缓存负主机名解析时间为10秒,这可以通过添加networkaddress.cache.ttl=<timeout>到你的Java安全策略来修改。
上一篇:重要的Elasticsearch配置
下一篇:引导检查
Elasticsearch 参考指南(重要的系统配置)相关推荐
- Elasticsearch 参考指南(脚本)
脚本 脚本模块使你可以使用脚本来评估自定义表达式,例如,你可以使用脚本将"脚本字段"作为搜索请求的一部分返回,或者为查询评估自定义分数. 默认脚本语言是Painless,附加的la ...
- Elasticsearch 参考指南(引导检查)
引导检查 总的来说,我们有很多用户因为没有配置重要的设置而遇到意外问题的经验,在以前版本的Elasticsearch中,这些设置的错误配置被记录为警告,可以理解的是,用户有时会错过这些日志消息,为了确 ...
- Elasticsearch 参考指南(介绍)
介绍 Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎,它允许你快速,近实时地存储,搜索和分析大量数据,它通常用作底层引擎/技术,为具有复杂搜索功能和要求的应用程序提供支持. 以下是 ...
- Elasticsearch 参考指南(多索引)
多索引 大多数引用index参数的API都支持跨多索引执行,使用简单的test1,test2,test3符号(或_all表示所有索引). 它还支持通配符,例如:test*.*test.te*t.*te ...
- Elasticsearch 参考指南(索引名中的日期公式支持)
索引名中的日期公式支持 日期公式索引名解析使你能够搜索一系列时间序列索引,而不是搜索所有时间序列索引并过滤结果或维护别名,限制搜索索引的数量可以减少集群上的负载并提高执行性能.例如,如果在每天的日志中 ...
- Oracle 11G 11.2.0.4 RAC部署参考指南
Oracle 11G 11.2.0.4 RAC部署参考指南 一.Oracle 11g RAC部署 二.集群规划 三.主机网络规划 四.操作系统配置部分 五.Grid集群软件安装部分 六.Oracle ...
- metricbeat mysql_Metricbeat 参考指南(目录)
Metricbeat 参考指南 版本:v6.4 更新日期:2018-10-15 概述 Metricbeat是一个轻量级的托运工,你可以在服务器上安装它,定期从操作系统和服务器上运行的服务收集指标,Me ...
- Spring Boot参考指南
Spring Boot参考指南 作者 菲利普·韦伯,戴夫 Syer,约什 长,斯特凡 尼科尔,罗布 绞车,安迪·威尔金森,马塞尔 Overdijk,基督教 杜普伊斯,塞巴斯蒂安·德勒兹,迈克尔·西蒙斯 ...
- Spring Boot 中文参考指南
Spring Boot 版本 2.7.8 原文:https://docs.spring.io/spring-boot/docs/2.7.8/reference/htmlsingle/ - 笔者注: S ...
最新文章
- 架构之路--实战项目记录(二) 忘记数据库 开始抽象
- (原創) array可以使用reference方式傳進function嗎? (C/C++)
- 查看文件的MD5/SHA1效验值
- GridView中TextBox 有内容,选中当前行CheckBox
- redis 获取服务器信息,StringRedisTemplate获取redis信息
- 取生产订单状态的逻辑
- Tomcat与Jre绿色环境配置(生产环境)
- Spark GraphX
- 计算机硬件:关于CPU的12个硬核干货!
- 漫谈数据挖掘从入门到进阶
- 广东高校计算机专业,广东高校计算机专业就业率最低 专业设置忌盲目
- Android图片加载之初步认识bitmap
- OpenShift 4 - 获取能访问API服务的用户认证Token
- 4K 海思 联咏 芯片_强悍芯片,重装来袭-海美迪H7 Plus旗舰4K电视盒子体验
- Android的JNI【实战教程】5⃣️---Android Studio 2.2 以上 NDK开发
- ES5 对象的扩展(Object.preventExtensions)、密封(Object.seal)和冻结(Object.freeze)
- MediaSession框架全解析
- Python中的range函数和arange函数的区别与联系
- 二进制运算的运用:异或(XOR)
- 财务分析 财务报表pdf里的表格转excel 的程序
热门文章
- 一个简单粗暴的爬虫 - 必应今日美图
- Remoting 与 Webservice 的区别
- Server Application Unavailable
- 【配置文件】log4j是什么log4j
- NoSQL架构实践(二)——以NoSQL为主
- 通过DataTable导出Excel
- Sql Server编程
- 原生app跳html页面传值,HTML页面跳转及参数传递问题
- Building Fire Stations 39届亚洲赛牡丹江站B题
- 【C 语言】文件操作 ( 使用 fread 和 fwrite 实现二进制文件的拷贝 | stat 统计文件大小 | feof 判定文件结尾 )