白话Elasticsearch68-ES生产集群部署重要的操作系统设置

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 白话Elasticsearch68-ES生产集群部署重要的操作系统设置

20190806092132811.jpg

概述

继续跟中华石杉老师学习ES,第68篇

课程地址https://www.roncoo.com/view/55


系统的重要配置


理想情况下,es应该单独在一个服务器上运行,能够使用服务器上的所有资源。为了达到上述目标,我们需要配置操作系统,来允许用户运行es并且获取比默认情况下更多的资源。


在生产环境中下面的一些设置必须配置一下:


(1)禁止swapping

(2)确保拥有足够的虚拟内存

(3)确保拥有足够的线程数量


20200118183017173.png


开发模式 vs 生产模式 (Bootstrap Checks)


https://www.elastic.co/guide/en/elasticsearch/reference/current/system-config.html#dev-vs-prod


20200118225147488.png

默认情况下,es会假设你是在开发模式下运行的。如果上面的任何配置没有正确的设置,那么会输出一些warning到日志文件中,但是我们还是可以启动es进程的。


从5.0开始,ES加入了Bootstrap Checks ,Elasticsearch 会在启动时进行 Bootstrap Checks。Bootstrap Checks 会检查很多 Elasticsearch 和系统的配置。在开发模式下,所有没通过的检查都会报 warnings 并写进日志文件,即使检查没通过,依然可以启动节点运行 Elasticsearch;而在生产模式下,任何没通过的 Bootstrap Checks 都会报异常并阻止 Elasticsearch 启动 。


比如我们配置了网络设置,比如network.host,es会认为我们是运行在生产环境中的,然后就会将上述warning升级为exception。这些exception会阻止我们的es节点启动。


这是一个重要的安全保障措施来确保我们不会因为错误的配置了es server,而导致数据丢失。


比如你可能碰到

ERROR: [1] bootstrap checks failed
[1]: initial heap size [1073741824] not equal to maximum heap size [2147483648]; this can cause resize pauses and prevents mlockall from locking the entire heap


配置系统设置


setting-system-settingshttps://www.elastic.co/guide/en/elasticsearch/reference/current/setting-system-settings.html


20200118212309674.png

files descriptors


在/etc/security/limits.conf中,可以配置系统设置 ,也可以用ulimit临时配置系统设置


临时设置


在linux操作系统中,ulimit可以用来临时的改变资源限制。通常需要用root权限来设置ulimit。

举例,如果要设置file descriptor为65536,可以用如下的命令来设置:

ulimit -n 65536


20200118212333204.png


永久设置


20200118212401426.png

20200118212518254.png


但是在linux操作系统中,实际上永久性的资源限制可以通过编辑**/etc/security/limits.conf**文件来设置。比如要设置file descriptor,可以再limits.conf中加入下面的行:

elasticsearch - nofile 65536


在下一次elasticsearch用户开启一个新的会话时就会生效

https://www.elastic.co/guide/en/elasticsearch/reference/current/file-descriptors.html

20200118214457791.png


设置jvm option


一般建议通过jvm.options配置文件来设置es的jvm option。默认的地址是config/jvm.options

每行是一个jvm argument

此外,如也可以通过ES_JAVA_OPTS环境变量来设置jvm option,比如下面的命令:

export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir"


禁止swapping


官网指导: https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration-memory.html

大多数操作系统都会使用尽量多的内存来进行file system cache,并且尽量将不经常使用的java应用的内存swap到磁盘中去。这会导致jvm heap的部分内存,甚至是用来执行代码的内存页被swap到磁盘中去。下次读取 ,内存中不存在又需要从磁盘重新读取,必然影响性能。


swapping对于性能来说是非常差劲的,为了es节点的稳定性考虑,应该尽量避免这种swapping。因为swapping会导致gc过程从毫秒级变成分钟级,在gc的时候需要将内存从磁盘中swapping到内存里,特别耗时,这会导致es节点响应请求变得很慢,甚至导致es node跟cluster失联。


在一个弹性的分布式系统中,让操作系统kill掉某一个节点,是很高效的。


有三种方法可以disable swapping。推荐的option是彻底禁用swap,如果做不到的化,也得尽量最小化swappiness的影响,比如通过lock memory的方法。


(1)禁用所有的swapping file


通常来说,es进程会在一个节点上单独运行,那么es进程的内存使用是由jvm option控制的。

可以使用下面的命令临时性禁止swap:swapoff -a

要永久性的禁止swap,需要修改/etc/fstab文件,然后将所有包含swap的行都注释掉


(2)配置swappiness


另外一个方法就是通过sysctl,将vm.swappiness设置为1,这可以尽量减少linux内核swap的倾向,在正常情况下,就不会进行swap,但是在紧急情况下,还是会进行swap操作。sysctl -w vm.swappiness=1


(3)启用bootstrap.memory_lock


最后一个选项,就是用mlockall,将es jvm进程的address space锁定在内存中,阻止es内存被swap out到磁盘上去。

在config/elasticsearch.yml中,可以配置:

bootstrap.memory_lock: true


GET _nodes?filter_path=**.mlockall,通过这行命令可以检查mlockall是否开启了

如果发现mlockall是false,那么意味着mlockall请求失败了。会看到一行日志,unable to lock jvm memory。


最大可能的原因,就是在linux系统中,启动es进程的用户没有权限去lock memory,需要通过以下方式进行授权:

ulimit -l unlimited


/etc/security/limits.conf,memlock设置为unlimited

另外一个原因可能是临时目录使用noexec option来mount了。可以通过指定一个新的临时目录来解决

export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir"



当然也可以通过在jvm.options文件中来设置java.io.tmpdir


虚拟内存

官方文档: https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html


20200118213756208.png


es使用mmapfs 目录来存储index数据,操作系统的默认mmap count限制是很低的,可能会导致内存耗尽的异常。


需要提升mmap count的限制:sysctl -w vm.max_map_count=262144


如果要永久性设置这个值,要修改**/etc/sysctl.conf**,将vm.max_map_count的值修改一下,重启过后,用sysctl vm.max_map_count来验证一下数值是否修改成功


设置线程的数量


官方指导: https://www.elastic.co/guide/en/elasticsearch/reference/current/max-number-of-threads.html

20200118214110497.png


es用了很多线程池来应对不同类型的操作,在需要的时候创建新的线程是很重要的。要确保es用户能创建的最大线程数量至少在4096以上。

可以通过ulimit -u 4096来临时设置,也可以在/etc/security/limits.conf中设置nproc为4096来永久性设置。


DNS cache settings

https://www.elastic.co/guide/en/elasticsearch/reference/current/networkaddress-cache-ttl.html


20200118215109926.png


Elasticsearch在适当的位置运行安全管理器。


有了安全管理器,JVM默认将无限期地缓存正主机名解析,并且默认将十秒内缓存负主机名解析。


Elasticsearch使用默认值覆盖此行为,以将正向查找缓存六十秒,并将负向查找缓存十秒。这些值应适用于大多数环境,包括DNS分辨率随时间变化的环境。


如果没有,您可以 在JVM选项中编辑值es.networkaddress.cache.ttl和es.networkaddress.cache.negative.ttl。需要注意的是价值 和 在 Java安全策略由Elasticsearch忽略,除非你删除的设置 和。

es.networkaddress.cache.negative.ttlnetworkaddress.cache.ttl=<timeout>
networkaddress.cache.negative.ttl=<timeout>
es.networkaddress.cache.ttles.networkaddress.cache.negative.ttl

JNA temporary directory not mounted with noexec


2020011821524118.png

这仅与Linux有关。


Elasticsearch使用Java本机访问(JNA)库来执行一些平台相关的本机代码。


在Linux上,在运行时从JNA存档中提取支持该库的本机代码。默认情况下,此代码被提取到Elasticsearch临时目录,该目录默认为的子目录 /tmp。或者,可以使用JVM标志来控制此位置 -Djna.tmpdir=<path>。


由于本机库以可执行文件的形式映射到JVM虚拟地址空间中,因此必须不将提取此代码的位置的基础挂载点挂载,noexec因为这会阻止JVM进程将此代码映射为可执行文件。


在某些加固的Linux安装中,这是默认的安装选项/tmp。表示已安装基础挂载的一种迹象noexec是,在启动时,JNA将无法加载,并且java.lang.UnsatisfiedLinkerError带有一条类似的消息failed to map segment from shared object。


请注意,在JVM版本之间,异常消息可能有所不同。此外,依赖于通过JNA执行本机代码的Elasticsearch组件将失败,并显示指示其为的消息because JNA is not available。如果看到这样的错误消息,则必须重新挂载JNA所用的临时目录,以使其无法挂载noexec。

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
28天前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
229 1
|
1月前
|
监控 安全 网络安全
Elasticsearch集群的网络设置
Elasticsearch集群的网络设置
32 3
|
4月前
|
自然语言处理 负载均衡 安全
保姆级Elasticsearch集群部署指导
保姆级Elasticsearch集群部署指导
129 0
|
4月前
|
网络协议 应用服务中间件 nginx
性能提升-如何设置Windows操作系统TIME_WAIT状态的TCP连接快速回收时间?
性能提升-如何设置Windows操作系统TIME_WAIT状态的TCP连接快速回收时间?
138 0
|
5月前
|
存储 缓存 数据处理
ELK中 Elasticsearch和Logstash内存大小设置的考虑
ELK中 Elasticsearch和Logstash内存大小设置的考虑
304 0
|
Java Linux 数据安全/隐私保护
百度搜索:蓝易云【centos7系统安装elasticsearch8.7.0,并设置密码访问教程。】
现在,您已经成功安装并设置密码访问Elasticsearch 8.7.0。您可以使用设置的密码来访问和管理Elasticsearch实例。
216 1
|
6月前
|
Java 数据安全/隐私保护 Windows
ElasticSearch设置密码Windows
ElasticSearch设置密码Windows
274 0
|
7月前
|
开发工具
elasticsearch kibana设置 添加开机启动
elasticsearch kibana设置 添加开机启动
54 0
|
7月前
|
安全 Java 大数据
elasticsearch|大数据|elasticsearch低版本集群的部署安装和安全增强---密码设置问题
elasticsearch|大数据|elasticsearch低版本集群的部署安装和安全增强---密码设置问题
82 0
|
自然语言处理 搜索推荐 Java
服务搭建篇(七) Elasticsearch单节点部署以及多节点集群部署
Elasticsearch(简称ES) 是一个分布式 , RESTful风格的搜索和数据分析引擎 , 使用java开发并且是当前最流行的开源的企业级搜索引擎,能够达到近实时搜索,稳定,可靠,快速,安装使用方便。
1337 0