白话Elasticsearch68-ES生产集群部署重要的操作系统设置
文章目录
- 概述
- 系统的重要配置
- 开发模式 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.con
f中设置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.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
这仅与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生产集群部署重要的操作系统设置相关推荐
- ES生产集群部署之必须根据自己的集群设置的一些重要参数
1.es的默认参数 es的默认参数是非常好的,适合绝大多数的情况,尤其是一些性能相关的配置.因此刚开始部署一个生产环境下的es集群时,几乎所有的配置参数都可以用默认的设置.有很多的生产环境场景下,都是 ...
- ElasticSearch面试 - es 生产集群的部署架构是什么?
ElasticSearch面试 - es 生产集群的部署架构是什么? 面试题 es 生产集群的部署架构是什么?每个索引的数据量大概有多少?每个索引大概有多少个分片? 面试官心理分析 这个问题,包括后面 ...
- clickhouse 生产集群部署之坑坑洼洼
之前看过ck中文社区,看到了很多莫名其妙的Exception 但并没有解答.自己测试集群小量数据抽取也没有遇到这些问题. 果不其然,生产集群部署都跳了一遍 新增相关配置:网上找的,与我原本的配置的一些 ...
- 白话Elasticsearch69-ES生产集群部署重要的 Elasticsearch参数设置
文章目录 ES的重要参数设置 官方文档 Path settings Cluster name Node name Network host Discovery settings Heap size H ...
- 白话Elasticsearch72_利用HDFS备份与恢复ES生产集群的数据
文章目录 概述 官方指导 hadoop hdfs分布式文件存储系统介绍 hdfs环境搭建 基于snapshot+hdfs进行数据备份 0.es集群数据备份的必要性 1.ES数据备份储存如何选择? 2. ...
- 白话Elasticsearch70-ES生产集群部署之production mode下启动时的bootstrap check
文章目录 概述 官方文档 什么是bootstrap check(启动时检查)? development mode vs. production mode heap size check file de ...
- 进阶-第92_es生产集群部署之必须根据自己的集群设置的一些重要参数
1.es的默认参数 es的默认参数是非常好的,适合绝大多数的情况,尤其是一些性能相关的配置.因此刚开始部署一个生产环境下的es集群时,几乎所有的配置参数都可以用默认的设置.有很多的生产环境场景下,都是 ...
- clickhouse 生产集群部署之坑坑洼洼(二)
clickhouse时间时区问题, 配置文件:clickhouse.config.xml 配置标签:<timezone>Asia/Shanghai</timezone> 机器系 ...
- 白话Elasticsearch71-ES生产集群部署之各个节点以daemon模式运行以及优雅关闭
文章目录 概述 官方指导 启动 ES 优雅的关闭 ES 概述 继续跟中华石杉老师学习ES,第71篇 课程地址: https://www.roncoo.com/view/55 官方指导 启动ES htt ...
最新文章
- 分析与设计(AD)简介(3)
- TSC打印机编程C#
- Linux创建jupyter notebook和jupyter lab, windows可远程访问
- 关于jupyter几个不得不知道的tips
- Juqery让世界更美好--超级简单实用的(上、下)自动翻的最佳效果,有图为证!...
- Module build failed (from ./node_modules/babel-loader/lib/index.js): Error: [BABEL] D:\moblie\web_co
- iOS内存泄漏的常见情况
- saltstack系列~第四篇
- edi python_在不从edi运行的情况下调用python函数
- 大学生创新创业训练计划讲解(大创)
- 实现qq空间自动化点赞
- Java实现字符串逆序输出
- html设置div大小位置不变,div大小 div固定大小设置
- 【Xcode使用技巧】Xcode环境变量(environment variables)
- 英语单词记忆(词缀 / 前缀)
- lan pci 联想开机_联想bios设置硬盘启动
- IDEA下载源码报错 Cannot reconnect.
- Java内部类及内部接口
- Markdown | 最具有效率的写作工具一次性掌握
- 2017总结与2018规划
热门文章
- conda install pytorch torchvision cudatoolkit=10.2 -c pytorch 报错
- CCF 2019年题目题解 - Python
- R语言应用实战-OLS模型算法原理及应用示例
- tableau可视化数据分析60讲(十一)-排序和过滤器
- Tableau实战系列浏览 Tableau 环境(一) -初识tableau操作界面
- R语言实战应用精讲50篇(七)-因子
- 机器学习第6天:数据可视化神器--Matplotlib
- QT关于资源文件的添加使用
- 消灭 Java 代码的“坏味道”【转】
- SpringBoot2.0新特性 - Quartz自动化配置集成