Elasticsearch节点配置

Date:2022/06/10       Cat:服务和运维       Word:共6202字       Tags:      

文章目录 「隐藏」
  1. 节点配置
    1. 配置Java
    2. Java堆内存配置
    3. 数据、日志、临时文件存放配置
    4. 禁用交换区
    5. 文件描述符
    6. 最大文件大小
    7. 虚拟内存区域映射数量
    8. 最大虚拟内存
    9. 线程数量
  2. 集群配置
    1. 设置集群名称和节点名称
    2. 网络设置
    3. 发现和集群形成设置
  3. 引用

节点配置

配置Java

因为Elasticsearch是Java编写的,所以在使用Elasticsearch之前,需要构建好Java的环境。而Elasticsearch会在每个发行版中包含一个推荐JVM版本。同时官方也推荐使用捆绑的JVM版本。

所以有两种方式来配置JVM:

  1. 使用捆绑JVM
  2. 手动安装适配当前Elasticsearch的JVM版本

如果是通过下载解压包,则解压后会在第一层目录中看见一个名为jdk的目录,这个就是自带的推荐JVM,默认情况下,如果环境中没有设置ES_JAVA_HOME在启动的时候,则会直接使用自带的JVM。

如果安装了JVM,但需要使用自带JVM或者使用指定的JVM,则可以找到esdir/bin/Elasticsearch-env文件,然后找到下面的内容:

# now set the path to java
ES_JAVA_HOME="/home/elastic/Elasticsearch-8.2.0/jdk"  # 添加这段内容,路径需要自行修改
if [ ! -z "$ES_JAVA_HOME" ]; then
  JAVA="$ES_JAVA_HOME/bin/java"
  JAVA_TYPE="ES_JAVA_HOME"

Java堆内存配置

Elasticsearch使用Java编写的,所以Java的堆内存越大,Elasticsearch可用的堆内存越多,缓存的数据也就越多。但是过于太大的堆内存,可能是垃圾回收暂停。

除此之外,官方还建议堆内存的大小设置不要超过对象指针(oops)的阈值。不同的系统阈值有所不同,而在大多数系统上26GB是安全,而有些可能可用高达30G。

查看是否超过了oops阈值,可用两种方法。第一种为API:

_nodes/_all/jvm
{
    ...
    "using_compressed_ordinary_object_pointers": "true",
    ...
}

第二种为检查日志:

[2022-06-09T06:17:15,837][INFO ][o.e.e.NodeEnvironment    ] [xxx-p1] heap size [28gb], compressed ordinary object
 pointers [true]

设置堆内存大小通过设置Elasticsearch配置文件中的jvm.options文件,但在生产环境中尽量不要使用该文件直接修改,而是在java.options.d目录中新添加一个后缀为.options的文件。

配置文件中通过-Xms-Xmx来设置最小和最大的堆内存:

esdir/config/jvm.options.d/heap.options

-Xms16g
-Xmx16g

官方建议将该值设置为一致的,并且该值应该小于物理内存的50%。因为除了堆内存,JVM本身也需要一定的内存,除此之外,Elasticsearch底层使用的Lucence,Lucence段存放在单独的文件中,而OS会将部分常用段进行缓存(热段),便于加快应用的访问性能,所以没有足够的内存给OS进行缓存,那么同样会降低Elasticsearch的性能。

下面是因为堆内存设置过大,导致JVM内存不够的报错:

Exception in thread "main" java.lang.RuntimeException: starting java failed with [1]
output:
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 33285996544 bytes for committing reserved memory.
# An error report file with more information is saved as:
# logs/hs_err_pid13775.log
error:
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000001001000000, 33285996544, 0) failed; error='Not enough space' (errno=12)
        at org.Elasticsearch.tools.launchers.JvmOption.flagsFinal(JvmOption.java:114)
        at org.Elasticsearch.tools.launchers.JvmOption.findFinalOptions(JvmOption.java:79)
        at org.Elasticsearch.tools.launchers.MachineDependentHeap.determineHeapSettings(MachineDependentHeap.java:61)
        at org.Elasticsearch.tools.launchers.JvmOptionsParser.jvmOptions(JvmOptionsParser.java:135)
        at org.Elasticsearch.tools.launchers.JvmOptionsParser.main(JvmOptionsParser.java:87)

数据、日志、临时文件存放配置

Elasticsearch默认将索引的数据写入Elasticsearch主目录下的data目录,而集群和操作相关的日志则写入Elasticsearch主目录下的logs目录。而这些目录在Elasticsearch升级的过程中可能会造成丢失或者删除。

所以在配置文件中config/Elasticsearch.yml设置path.datapath.logs来设置指定存放路径尤为重要。

比如下面的目录则设置了将数据存放在/var/es-data/var/es-logs

...
path.data: /var/es-data
path.logs: /var/es-logs
...

同时Elasticsearch在启动的时候会在系统的临时目录下创建私有的临时目录,而某些Linux的发行中的系统程序会删除掉临时目录/tmp中最近未访问的文件和目录,如果Elasticsearch长时间不使用私有的临时目录,那么将被系统可能删除掉,进而引发Elasticsearch的错误。

而指定这个临时的私有目录的路径方法可用通过在运行前提供环境变量$ES_TMPDIR。也可用通过修改Elasticsearch主目录bin/Elasticsearch-env文件,在ES_HOME上一行添加:

...
ES_TMPDIR: /var/es-tmp  # 添加
ES_HOME=`dirname "SCRIPT"`
...

禁用交换区

操作系统会尽可能的将内存用于文件系统缓存,因此应用程序的数据可能会被交换到swap区,这可能导致JVM堆数据也被交换到磁盘去,对于Elasticsearch来说,这可能会导致性能和稳定性,这在真正的生产环境中一定要避免的。

而如果运行Elasticsearch的机器仅是用于Elasticsearch服务,那么可用通过在/etc/sysctl.conf中设置vm.swappiness=1,这个值是告诉系统交换内存的权重,值越高,代表希望越积极的使用交换分区,值越低则反之,设置为1的意义在于来告诉系统除仅仅在系统紧急情况下才进行交换。

文件描述符

在Linux/Unix系统中,一切都是文件。所有文件可以是物理文件、虚拟文件、网络套接字文件,而Elasticsearch需要大量的文件描述符(文件句柄),如每个分片由多个段、与其他节点连接等。所以需要确保Elasticsearch能够有足够多的文件描述符,如果文件描述符不够,可能对于Elasticsearch是灾难性的,而且很有可能造成数据丢失。

在Linux中,可以通过ulimit -a来查看当前用户的限制:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 128616
max locked memory       (kbytes, -l) 65536
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 128616
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

其中open files (-n) 1024则是Linux系统限制的当前用户一个进程最大文件描述符有多少,对于Elasticsearch官方介绍,其值应该为65,535或者更高,设置这个值有两种方式。

  • 第一种:为临时设置,在启动Elasticsearch之前,切换至Root用户,使用ulimit -n 65535,然后切回ES用户启动。

  • 第二种:为永久设置,在启动Elasticsearch之前,切换至Root用户,修改/etc/security/limits.conf添加内容elastic - nofile 65535,该行内容具体的含义可以看该文件的注释,注释有比较清楚的解释。

最大文件大小

在Elasticsearch中的段文件和一些log文件会变得越来越大, 如果Elasticsearch受到操作系统的最大文件限制的情况下进行写入操作,则可能导致写入失败。而在Linux环境下,Elasticsearch启动的时候,将检查是否有限制。

查看最大文件大小的限制通过ulimit -a中的file size查看。

如果有相关限制,通过修改修改/etc/security/limits.conf文件,并添加内容elastic - fsize unlimited

虚拟内存区域映射数量

Elasticsearch会默认根据操作系统选择最优的虚拟内存映射实现,作用将索引的一部分文件映射Elasticsearch内存当中,以便提供高性能,而每个操作系统对于进程所能映射的虚拟内存区域是有个数限制。默认的操作系统限制太低,可能导致内存不足。而在Linux环境下,Elasticsearch启动的时候,将检查是否具备最低262,144个内存映射区域。

设置这个值可以通过Root用户修改/etc/sysctl.conf,并添加vm.max_map_count=262144。修改完成后再启动前执行sysctl -p命令使其生效。

最大虚拟内存

Elasticsearch和Lucence通过mmap机制将索引的一部分数据映射到Elasticsearch进程的内存空间来提高性能,而在Linux下启动Elasticsearch的时候,会进行检查Elasticsearch进程是否具备无限地址空间的能力。

查看最大文件大小的限制通过ulimit -a中的virtual memory查看。

如果有相关限制,通过修改修改/etc/security/limits.conf文件,并添加内容elastic - as unlimited

线程数量

Elasticsearch使用不同的线程池来执行不同类型的操作,所以要保证Elasticsearch在需要的时候,能够创建新的线程,这个至应该至少为4096,如果低于这个值将启动失败。检查这个至可以通过ulimit -a来查看。

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 128616
max locked memory       (kbytes, -l) 65536
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 128616  # 用户最大线程限制
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

如果低于这个4096,可以通过修改/etc/security/limits.conf设置指定用户的最大线程数量。如elastic - nproc 4096,或者设置为无限制elastic - nproc unlimited

集群配置

设置集群名称和节点名称

启动一个Elasticsearch实例,就相当于启动了一个节点。Elasticsearch集群则是多个具有相同cluster.name值的节点组成的,当节点加入或者离开的时候,Elasticsearch集群会自动重新组织。

而节点名称在单节点集群中显得不太重要,而在多节点集群中,有助于标识和快速识别节点,节点名称通过elasticsearch.yml文件的node.name设置。

网络设置

在未设置网络的情况下,Elasticsearch会默认把elasticsearch.yml中的network.host绑定到环回地址上,即127.0.0.1,这主要的作用是用于在单机上进行测试和开发。

而一旦设置了network.host的值后,Elasticsearch就会假定当前由开发模式转为了生产模式,并且将启动检查过程中的警告转变为了异常。

发现和集群形成设置

发现和集群形成设置主要指通过elasticsearch.yml文件中配置discovery.seed_hostscluster.initial_master_nodes两个参数。其中discovery.seed_hosts需要设置复位主节点条件的候选主节点,用于选举和投票新主节点。而cluster.initial_master_nodes参数则是用于在第一次启动集群的时候,将符合主节点的节点找到,然后引导集群启动。

引用

  1. JVM优化之压缩普通对象指针(CompressedOops)
  2. Important Elasticsearch configuration
  3. Elasticsearch 生产环境集群部署最佳实践
  4. File Descriptors
  5. ES报错too-many-open-files解决
  6. ES6.x默认store为mmapfs(Linux 64位),mmap性能相关分析
  7. File system storage type
  8. User Address Space Limits
  9. Elasticsearch 8.X 节点角色划分深入详解

《Elasticsearch节点配置》留言数:0

发表留言