【Elasticsearch7.0】之重要的系统配置

  |   0 评论   |   100 浏览

最理想的情况下,es要运行在单独的服务器上,这样可以独立使用服务器的资源。你可以设置一些操作系统的参数来使es获取更多的资源,可以更好的运行。

开发模式 vs 生产模式

默认情况下,es认为你是开发模式,如果你没有设置这些系统参数,es会输出一些警告日志到日志文件中,但是服务还是可以正常启动的。
如果设置了network.host,es会认为你现在是生产环境了,启动的时候会检查这些配置,如果没配置这些参数,启动会报错,会输出异常日志。

配置系统设置

操作系统和安装方式的不同,系统设置有所不同。压缩包可以配置ulimit或/etc/security/limits.conf两个地方,RPM或者Debian安装包安装的可以配置运行级别。

ulimit

可以通过以下命令来设置文件句柄数:

sudo su 
ulimit -n 65535 
su elasticsearch

可以使用ulimit -a查询所有当前应用的限制。

limits.conf

ulimit命令是设置临时的文件句柄数,如果需要永久的设置文件句柄数,那么可以在/etc/security/limits.conf文件下设置文件句柄数。在linux下的配置:

elasticsearch - nofile 65535

Ubuntu会忽略limits.conf文件,如果需要开启,那么需要修改以下的配置:

vi /etc/pam.d/su
# session    required   pam_limits.so

系统文件

当使用RPM或Debian包时,系统设置和环境变量可以在系统配置文件中指定,该文件位于:
RPM在/etc/sysconfig/elasticsearch 下面

Debian 在/etc/default/elasticsearchDisable swapping 下面
但是,对于使用systemd的系统,需要通过systemd指定系统限制。

systemd配置

在使用systemd的系统上使用RPM或Debian包时,必须通过systemd指定系统限制。systemd服务文件(/usr/lib/systemd/system/elasticsearch.service)包含默认应用的限制。要覆盖它们,可以添加一个名为/etc/systemd/system/elasticsearch.service.d/overrid .conf的文件(或者,可以运行sudo systemctl edit elasticsearch,它会在默认编辑器中自动打开文件)。设置此文件中的任何更改,例如:

[Service]
LimitMEMLOCK=infinity

完成后,运行以下命令重新加载单元:

sudo systemctl daemon-reload

禁用swap

很多操作系统都会有交换内存空间的操作,如果你的应用程序配置的内存没有使用到,那么会把你多余的内存空间交出去,这可能导致JVM堆的一部分,甚至其可执行页面被交换到磁盘。交换对性能和节点稳定性非常不利,我们应该要避免交换,他可能导致垃圾收集持续几分钟而不是几毫米,还可能导致节点响应缓慢,甚至断开与集群的连接。
最佳的做法是完全禁用掉swap交换,如果不行,那么你可以根据环境判断是使用最小化swappiness还是内存锁。
1、完全禁止swap
linux的命令

sudo swapoff -a

修改该配置不需要重启es服务。
在window下

Properties → Advanced → Performance → Advanced → Virtual memory

配置swappiness

把sysctl里面的vm.swappiness设置为1。该设置会减少内存交换,在正常情况下不会进行内存的交互,但是在紧急情况下还是会进行内存交换的。

配置内存锁

使用内存锁,把应用程序的内存锁住,不让他进行交换,可以在elasticsearch.yml文件里面配置:

bootstrap.memory_lock: true

使用了mlockall之后,如果应用分配的内存大于设定的内存大小,那么应用可能会被杀掉。
可以通过api来查看是否开启了mlockall,

GET _nodes?filter_path=**.mlockall

返回值

{
    "nodes": {
        "IaXySC4ZQZSU0QAkovpF9A": {
            "process": {
                "mlockall": false
            }
        }
    }
}

返回false,表示没有开启,可以在日志文件中找到下面的内容

Unable to lock JVM Memory

File Descriptors

注意:在window上不需要配置下面的参数。
es使用很多文件描述符或者句柄,如果文件描述符耗尽是很危险的,有可能导致数据丢失。所有需要修改文件描述符为65,536或者更高。
可以使用 ulimit -n 65535或者/etc/security/limits.conf里面进行配置。
在macOS上面,需要在jvm中配置-XX:-MaxFDLimit
在RPM和Debian安装包下,已经设置为65535了。
可以通过以下接口查看文件描述符:

GET _nodes/stats/process?filter_path=**.max_file_descriptors

返回

{
    "nodes": {
        "8OYOznPARiuOTvs9CKoq8w": {
            "process": {
                "max_file_descriptors": 65535
            }
        }
    }
}

Virtual memory

Elasticsearch默认使用mmapfs目录存储索引。默认操作系统对mmap计数的限制可能太低,这可能导致内存异常。
在linux下,可以使用下面命令来增加限制:

sysctl -w vm.max_map_count=262144

如果想永久的设置限制,可以在/etc/sysctl.conf文件里面,找到vm.max_map_count,进行设置。可以通过sysctl vm.max_map_count来验证设置的值。
如果使用RPM或者Debian安装包,这个设置会自动完成,不需要手动配置。

Number of threads

Elasticsearch为不同类型的操作使用许多线程池。需要确保可以创建新的线程来处理,至少要把该值配置为4096。
可以使用ulimit -u 4096来设置,也可以在/etc/security/limits.conf文件中配置nproc为4096。
如果是安装包运行的,那么会自定设置该值。

DNS cache settings

Elasticsearch在安全管理器到位的情况下运行。有了安全管理器,JVM默认无限期缓存正主机名解析,默认缓存负主机名解析10秒。Elasticsearch使用默认值覆盖此行为,将正查找缓存60秒,将负查找缓存10秒。这些值应该适用于大多数环境,包括DNS分辨率随时间变化的环境。如果没有那么可以在jvm.options里面配置es.networkaddress.cache.ttles.networkaddress.cache.negative.ttl这两个参数,如果在es中配置了这两个值,那么java中的配置将失效。

JNA temporary directory not mounted with noexec

注意:该配置只有在linux中有用。
Elasticsearch使用Java本机访问(JNA)库执行一些依赖于平台的本机代码。在Linux上,支持这个库的本地代码在运行时从JNA存档中提取。默认情况下,此代码被提取到Elasticsearch临时目录中,该目录默认为/tmp的子目录。或者,可以使用JVM标志-Djna.tmpdir=控制此位置。由于本机库被映射到作为可执行文件的JVM虚拟地址空间中,因此此代码提取到的位置的底层挂载点不能像这样用noexec挂载。

也可以关注我的公众号:程序之声
图片
关注公众号,领取更多资源

本文为博主原创文章,未经博主允许不得转载。

评论

发表评论