Elasticsearch6测试和开发环境配置

开发模式和生产模式

es节点加入集群,必须绑定transport到non-loopback地址,es通过http.host,transport.host和single-node discovery的配置判断是否为生产模式。

引导启动检查

使用引导启动检查检查es和系统设置。在开发模式下,不安全的配置会以warnings记录日志。在生产模式下,会拒绝启动。

强制引导启动检查

单节点的生产模式可以绕过引导启动检查,通过设置es.enforce.bootstrap.checks(JVM options)为True,可以强制检查。

堆大小检查

JVM配置初始堆大小和最大堆值相同,否则会导致系统运行停顿。es默认使用1GB的堆。规则如下:

  • 堆越大,缓存越大,但是太大的话会导致长时间的垃圾回收而造成系统停顿。
  • 不要超过物理内存的50%
  • 26GB对大多数系统比较安全,对一些系统可达到30G

jvm.options配置文件

-Xms26g
-Xmx26g

文件描述符检查

es需要大量的文件描述符。必须保证文件描述符的数量限制大与等于65535。通过RPM和Debian包默认设置为65536。可以通过以下命令检查max_file_descriptors的大小。

curl -X GET "localhost:9200/_nodes/stats/process?filter_path=**.max_file_descriptors"

内存锁定检查

JVM进行垃圾回收时,如果有page被换出到硬盘,再换入内存回收,影响效率。有多种办法可以禁止交换。

  • 系统级别的禁止交换

    sudo swapoff -a

  • 配置swappiness

  • 阻止es内存换出,添加以下配置到config/elasticsearch.yml文件

    bootstrap.memory_lock: true

  • 检查mlockall的配置

    GET _nodes?filter_path=**.mlockall

  • 如果mlockall的值是false, 意味着mlockall请求失败,最有可能的原因是运行es的用户没有lock Memory的权限,授权方式

    添加一个文件
    /etc/systemd/system/elasticsearch.service.d/override.conf
    or
    sudo systemctl edit elasticsearch
    编辑
    [Service]
    LimitMEMLOCK=infinity
    加载
    sudo systemctl daemon-reload

  • 如果依然失败可能是临时路径/tmp使用noexec选项挂载,可以使用ES_JAVA_OPTS环境变量指定一个新的temp路径

    export ES_JAVA_OPTS=”$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir”
    ./bin/elasticsearch

最大线程数检查

es需要有创建至少4096个线程的能力并且只会在Linux系统上检查。通过设置/etc/security/limits.conf的nproc值(同时要增大root用户的限制)

最大虚拟内存检查

es需要有无限制的地址空间并且只会在Linux系统上检查。通过设置/etc/security/limits.conf的as值为unlimited(同时要改变root用户的限制)

最大文件大小检查

es需要有无限制大小的写文件能力。通过设置/etc/security/limits.conf的fsize值为unlimited(同时要改变root用户的限制)

最大地图数量检查

es需要至少262144内存映射空间并且只会在Linux系统上检查。通过设置vm.max_map_count(sysctl)

sysctl -w vm.max_map_count=262144
sysctl -a|grep vm.max_map_count

客户端JVM检查

确保es没有运行在客户端JVM而是服务端JVM,现代操作系统,服务端JVM是默认的。

serial collector检查

确保es运行时使用的垃圾收器不是serial collector,除非指定-XX:+UseSerialGC使用,JVM默认使用es的默认配置也就是CMS collector。

系统调用过滤器检查

修复所有可能阻止es安装系统调用过滤器(Linux上的seccomp)的配置(检查日志)

OnError和OnOutOfMemoryError检查

防止es启动时JVM的这两个选项被启用并且系统调用也被启用,它们相互之间不兼容。可以禁止OnError和OnOutOfMemoryError或则升级到Java 8u92并且使用JVM flag ExitOnOutOfMemoryError