文章目录

  • 概述
  • 系统的重要配置
  • 开发模式 vs 生产模式 (Bootstrap Checks)
  • 配置系统设置
    • files descriptors
      • 临时设置
      • 永久设置
    • 设置jvm option
    • 禁止swapping
      • (1)禁用所有的swapping file
      • (2)配置swappiness
      • (3)启用bootstrap.memory_lock
    • 虚拟内存
    • 设置线程的数量
    • DNS cache settings
    • JNA temporary directory not mounted with noexec


概述

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

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


系统的重要配置

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

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

(1)禁止swapping
(2)确保拥有足够的虚拟内存
(3)确保拥有足够的线程数量


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

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

默认情况下,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-settings: https://www.elastic.co/guide/en/elasticsearch/reference/current/setting-system-settings.html

files descriptors

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

临时设置

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

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

ulimit -n 65536


永久设置

但是在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


设置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

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

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

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

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

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

如果没有,您可以 在JVM选项中编辑值es.networkaddress.cache.ttles.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

这仅与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。

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

  1. ES生产集群部署之必须根据自己的集群设置的一些重要参数

    1.es的默认参数 es的默认参数是非常好的,适合绝大多数的情况,尤其是一些性能相关的配置.因此刚开始部署一个生产环境下的es集群时,几乎所有的配置参数都可以用默认的设置.有很多的生产环境场景下,都是 ...

  2. ElasticSearch面试 - es 生产集群的部署架构是什么?

    ElasticSearch面试 - es 生产集群的部署架构是什么? 面试题 es 生产集群的部署架构是什么?每个索引的数据量大概有多少?每个索引大概有多少个分片? 面试官心理分析 这个问题,包括后面 ...

  3. clickhouse 生产集群部署之坑坑洼洼

    之前看过ck中文社区,看到了很多莫名其妙的Exception 但并没有解答.自己测试集群小量数据抽取也没有遇到这些问题. 果不其然,生产集群部署都跳了一遍 新增相关配置:网上找的,与我原本的配置的一些 ...

  4. 白话Elasticsearch69-ES生产集群部署重要的 Elasticsearch参数设置

    文章目录 ES的重要参数设置 官方文档 Path settings Cluster name Node name Network host Discovery settings Heap size H ...

  5. 白话Elasticsearch72_利用HDFS备份与恢复ES生产集群的数据

    文章目录 概述 官方指导 hadoop hdfs分布式文件存储系统介绍 hdfs环境搭建 基于snapshot+hdfs进行数据备份 0.es集群数据备份的必要性 1.ES数据备份储存如何选择? 2. ...

  6. 白话Elasticsearch70-ES生产集群部署之production mode下启动时的bootstrap check

    文章目录 概述 官方文档 什么是bootstrap check(启动时检查)? development mode vs. production mode heap size check file de ...

  7. 进阶-第92_es生产集群部署之必须根据自己的集群设置的一些重要参数

    1.es的默认参数 es的默认参数是非常好的,适合绝大多数的情况,尤其是一些性能相关的配置.因此刚开始部署一个生产环境下的es集群时,几乎所有的配置参数都可以用默认的设置.有很多的生产环境场景下,都是 ...

  8. clickhouse 生产集群部署之坑坑洼洼(二)

    clickhouse时间时区问题, 配置文件:clickhouse.config.xml 配置标签:<timezone>Asia/Shanghai</timezone> 机器系 ...

  9. 白话Elasticsearch71-ES生产集群部署之各个节点以daemon模式运行以及优雅关闭

    文章目录 概述 官方指导 启动 ES 优雅的关闭 ES 概述 继续跟中华石杉老师学习ES,第71篇 课程地址: https://www.roncoo.com/view/55 官方指导 启动ES htt ...

最新文章

  1. 分析与设计(AD)简介(3)
  2. TSC打印机编程C#
  3. Linux创建jupyter notebook和jupyter lab, windows可远程访问
  4. 关于jupyter几个不得不知道的tips
  5. Juqery让世界更美好--超级简单实用的(上、下)自动翻的最佳效果,有图为证!...
  6. Module build failed (from ./node_modules/babel-loader/lib/index.js): Error: [BABEL] D:\moblie\web_co
  7. iOS内存泄漏的常见情况
  8. saltstack系列~第四篇
  9. edi python_在不从edi运行的情况下调用python函数
  10. 大学生创新创业训练计划讲解(大创)
  11. 实现qq空间自动化点赞
  12. Java实现字符串逆序输出
  13. html设置div大小位置不变,div大小 div固定大小设置
  14. 【Xcode使用技巧】Xcode环境变量(environment variables)
  15. 英语单词记忆(词缀 / 前缀)
  16. lan pci 联想开机_联想bios设置硬盘启动
  17. IDEA下载源码报错 Cannot reconnect.
  18. Java内部类及内部接口
  19. Markdown | 最具有效率的写作工具一次性掌握
  20. 2017总结与2018规划

热门文章

  1. conda install pytorch torchvision cudatoolkit=10.2 -c pytorch 报错
  2. CCF 2019年题目题解 - Python
  3. R语言应用实战-OLS模型算法原理及应用示例
  4. tableau可视化数据分析60讲(十一)-排序和过滤器
  5. Tableau实战系列浏览 Tableau 环境(一) -初识tableau操作界面
  6. R语言实战应用精讲50篇(七)-因子
  7. 机器学习第6天:数据可视化神器--Matplotlib
  8. QT关于资源文件的添加使用
  9. 消灭 Java 代码的“坏味道”【转】
  10. SpringBoot2.0新特性 - Quartz自动化配置集成