重要的系统配置

理想情况下,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

如果你看到mlockallfalse,那么这意味着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中设置nofile65536

在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 参考指南(重要的系统配置)相关推荐

  1. Elasticsearch 参考指南(脚本)

    脚本 脚本模块使你可以使用脚本来评估自定义表达式,例如,你可以使用脚本将"脚本字段"作为搜索请求的一部分返回,或者为查询评估自定义分数. 默认脚本语言是Painless,附加的la ...

  2. Elasticsearch 参考指南(引导检查)

    引导检查 总的来说,我们有很多用户因为没有配置重要的设置而遇到意外问题的经验,在以前版本的Elasticsearch中,这些设置的错误配置被记录为警告,可以理解的是,用户有时会错过这些日志消息,为了确 ...

  3. Elasticsearch 参考指南(介绍)

    介绍 Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎,它允许你快速,近实时地存储,搜索和分析大量数据,它通常用作底层引擎/技术,为具有复杂搜索功能和要求的应用程序提供支持. 以下是 ...

  4. Elasticsearch 参考指南(多索引)

    多索引 大多数引用index参数的API都支持跨多索引执行,使用简单的test1,test2,test3符号(或_all表示所有索引). 它还支持通配符,例如:test*.*test.te*t.*te ...

  5. Elasticsearch 参考指南(索引名中的日期公式支持)

    索引名中的日期公式支持 日期公式索引名解析使你能够搜索一系列时间序列索引,而不是搜索所有时间序列索引并过滤结果或维护别名,限制搜索索引的数量可以减少集群上的负载并提高执行性能.例如,如果在每天的日志中 ...

  6. Oracle 11G 11.2.0.4 RAC部署参考指南

    Oracle 11G 11.2.0.4 RAC部署参考指南 一.Oracle 11g RAC部署 二.集群规划 三.主机网络规划 四.操作系统配置部分 五.Grid集群软件安装部分 六.Oracle ...

  7. metricbeat mysql_Metricbeat 参考指南(目录)

    Metricbeat 参考指南 版本:v6.4 更新日期:2018-10-15 概述 Metricbeat是一个轻量级的托运工,你可以在服务器上安装它,定期从操作系统和服务器上运行的服务收集指标,Me ...

  8. Spring Boot参考指南

    Spring Boot参考指南 作者 菲利普·韦伯,戴夫 Syer,约什 长,斯特凡 尼科尔,罗布 绞车,安迪·威尔金森,马塞尔 Overdijk,基督教 杜普伊斯,塞巴斯蒂安·德勒兹,迈克尔·西蒙斯 ...

  9. Spring Boot 中文参考指南

    Spring Boot 版本 2.7.8 原文:https://docs.spring.io/spring-boot/docs/2.7.8/reference/htmlsingle/ - 笔者注: S ...

最新文章

  1. 架构之路--实战项目记录(二) 忘记数据库 开始抽象
  2. (原創) array可以使用reference方式傳進function嗎? (C/C++)
  3. 查看文件的MD5/SHA1效验值
  4. GridView中TextBox 有内容,选中当前行CheckBox
  5. redis 获取服务器信息,StringRedisTemplate获取redis信息
  6. 取生产订单状态的逻辑
  7. Tomcat与Jre绿色环境配置(生产环境)
  8. Spark GraphX
  9. 计算机硬件:关于CPU的12个硬核干货!
  10. 漫谈数据挖掘从入门到进阶
  11. 广东高校计算机专业,广东高校计算机专业就业率最低 专业设置忌盲目
  12. Android图片加载之初步认识bitmap
  13. OpenShift 4 - 获取能访问API服务的用户认证Token
  14. 4K 海思 联咏 芯片_强悍芯片,重装来袭-海美迪H7 Plus旗舰4K电视盒子体验
  15. Android的JNI【实战教程】5⃣️---Android Studio 2.2 以上 NDK开发
  16. ES5 对象的扩展(Object.preventExtensions)、密封(Object.seal)和冻结(Object.freeze)
  17. MediaSession框架全解析
  18. Python中的range函数和arange函数的区别与联系
  19. 二进制运算的运用:异或(XOR)
  20. 财务分析 财务报表pdf里的表格转excel 的程序

热门文章

  1. 一个简单粗暴的爬虫 - 必应今日美图
  2. Remoting 与 Webservice 的区别
  3. Server Application Unavailable
  4. 【配置文件】log4j是什么log4j
  5. NoSQL架构实践(二)——以NoSQL为主
  6. 通过DataTable导出Excel
  7. Sql Server编程
  8. 原生app跳html页面传值,HTML页面跳转及参数传递问题
  9. Building Fire Stations 39届亚洲赛牡丹江站B题
  10. 【C 语言】文件操作 ( 使用 fread 和 fwrite 实现二进制文件的拷贝 | stat 统计文件大小 | feof 判定文件结尾 )