1.6 Elasticsearch节点的重要配置

在Elasticsearch的config文件夹下,一共有3个重要的配置文件,其中elasticsearch.yml 用于配置节点的参数,jvm.options用来配置Elasticsearch运行时占用的堆内存大小,log4j2.properties用来配置Elasticsearch运行时的日志参数。那些可以通过调用REST接口,在节点运行时动态修改的配置叫作动态配置;配置在elasticsearch.yml文件中,只能在集群重启后才能生效的配置叫作静态配置。

1.6.1 集群节点的配置方法和优先级

当你需要修改集群节点的配置信息时,通常有以下3种方法。

(1)调用集群节点配置的REST接口并设置配置项临时生效,该配置项在集群重启后失效。

(2)调用集群节点配置的REST接口并设置配置项持久生效,该配置项在集群重启后依然有效。

(3)直接把集群节点配置项写在elasticsearch.yml文件中。

如果一个配置项没有采用以上3种方法进行配置,则会采用集群节点默认的配置。如果同一个配置项在多个地方都配置过,而且配置得不一样,则第一种临时配置的优先级最高,第二种持久生效的配置次之,写在elasticsearch.yml文件中的配置优先级最低。通常比较好的做法是,对于整个集群范围内生效的动态配置直接使用REST接口进行控制,对于每个节点各自不同的配置(例如IP地址)直接在节点的elasticsearch.yml中配置,这样做可以避免遗漏某个节点的配置而引起错误。

你可以调用下面的REST接口修改动态配置并让它持久生效。

PUT /_cluster/settings
{
  "persistent" : {
    "search.max_buckets" : "50000"
  }
}

配置参数search.max_buckets用于指明在做聚集统计时,单个请求能够返回的桶的最大数目,这里已经把它持久地设置成50000。接下来把这个配置参数的值改为30000并设置为临时生效。

PUT /_cluster/settings
{
  "transient" : {
    "search.max_buckets" : "30000"
  }
}

再使用GET端点查看刚才的配置结果。

GET /_cluster/settings

Kibana会返回刚才的两 种配置的信息。

{
  "persistent" : {
    "search" : {
      "max_buckets" : "50000"
    }
  },
  "transient" : {
    "search" : {
      "max_buckets" : "30000"
    }
  }
}

这时如果你重启Elasticsearch,再查询一次配置结果,就会发现刚才的临时配置不见了,只剩下持久配置,这表明持久配置在节点重启后依然有效。

另外,如果你想清空某一配置的信息,只要把它配置为null就行。

PUT /_cluster/settings
{
  "persistent": {
    "search.max_buckets": null
  }
}

1.6.2 elasticsearch.yml的重要配置

本小节介绍elasticsearch.yml的重要配置,通常你可以把集群节点的静态配置写在这个文件里,只有重启Elasticsearch后这些配置的修改才能生效。

打开elasticsearch.yml,你可以看到里面已经有一些关键的配置,最上面的是集群名称和节点名称的配置,它们在1.4节介绍安装Elasticsearch的时候已经配置过了。注意,在同一个集群中,多个节点的集群名称要配置成一样的,节点名称要配置成不一样的,以区分同一个集群中的不同节点。

1. path.data和path.logs

这两个配置项用于配置数据目录和日志目录,在生产环境中,由于文件较大,应尽量配置存储容量大的目录,可以配置多个目录。例如,在Windows系统中可以进行如下配置。

path:
  data: "C:\\esdata1 "
  logs:
    - "C:\\logs1"
- "D:\\logs2"

如果是Linux系统,则路径不需要加引号,代码如下。

path:
  data:
    - /esdata1
    - /esdata2
  logs:
    - /var/log/eslog1
- /var/log/eslog2
2. bootstrap.memory_lock

这是用于操作系统内存锁的配置项,开启内存锁可以防止操作系统中的缓存数据被交换到外存而导致查询性能大幅下降,在生产环境中,这个配置项一定要设置为true。

bootstrap.memory_lock: true

为了验证内存锁是否正常开启,启动Elasticsearch后,调用以下接口。

GET _nodes?filter_path=**.mlockall

返回true值则表示内存锁开启成功。

{
  "nodes" : {
    "EIjMhNrDSoy-Bbmo3W8JGA" : {
      "process" : {
        "mlockall" : true
      }
    }
  }
}

注意:在CentOS中,直接设置bootstrap.memory_lock为true可能会因为缺少权限并不能立即开启内存锁,还需要一些额外的配置,具体内容在第9章进一步讨论。

3. network.host和http.port

这两个配置项用于把Elasticsearch的服务绑定到固定的IP地址和端口号,默认的IP地址是127.0.0.1,端口号是9200,可以按照实际需要进行修改。

network.host: 192.168.9.105
http.port: 9201
4.discovery.seed_hosts和cluster.initial_master_nodes

这两个配置项在单节点环境下保持默认设置即可,当需要搭建集群时,这两个配置项对于节点的发现和主节点的选举至关重要。discovery.seed_hosts用于配置一组IP地址或主机名,这组地址的列表是集群中的主候选节点的列表,当一个节点启动时会尝试与该列表中的各个主候选节点建立连接,如果连接成功并找到主节点就把该节点加入集群。例如:

discovery.seed_hosts:
    - 192.168.9.10
    - 192.168.9.11
- host3.com

cluster.initial_master_nodes用于明确地指定一组节点名称的列表,这个列表也是主候选节点的列表,Elasticsearch集群在第一次启动时会读取该列表初始化投票配置,该配置将用于主节点的选举。在这个列表中,配置的每个节点的名称要与该节点的node.name配置的名称保持一致。例如:

cluster.initial_master_nodes: ["node-1", "node-2"]

1.6.3 配置JVM的堆内存大小

在生产环境中,有必要根据服务器的硬件配置修改Elasticsearch运行时的JVM堆内存大小,以保证集群节点拥有足够的堆内存。如果设置得太小,可能查询时内存不够而导致服务宕机;如果设置得太大,又会超过JVM用于压缩对象指针的阈值而导致内存浪费。在配置堆内存大小的时候,需要满足以下两个条件。

(1)堆内存最大不得超过开启压缩对象指针的阈值,一般最大可以是31GB,不同的系统可能有区别,如果没超过这个阈值,你可以在Elasticsearch的启动日志中看到类似输出:

heap size [989.8mb], compressed ordinary object pointers [true]

(2)在堆内存不超过上述阈值的前提下,其大小可以设置为其所在节点内存的一半。

例如,你的服务器有16GB内存,就可以把堆内存大小设置为8GB,但是如果服务器内存为128GB,则通常堆内存最多只能设置为31GB。配置完以后,还需要在启动日志中确认堆内存大小没有超过开启压缩对象指针的阈值。如果超过了阈值,则需要调小堆内存大小。

默认的堆内存大小是1GB,如果你想把它设置为4GB,修改jvm.options文件为:

-Xms4g
-Xmx4g

其中Xms代表最小的堆内存大小,Xmx代表最大的堆内存大小,这两个值必须设置成一样的。