Elasticsearch集群部署重要配置(基于6.3版本)

Elasticsearch集群部署重要配置

Elasticsearch的默认配置已经最优,在使用时仅需要调整极少部分配置就可以了。大多数配置在集群运行期间可以通过接口Cluster Update Settings API进行动态调整。

配置文件必须包含一些节点标识信息(node.name,paths)和节点加入集群的信息(cluster.name,network.host)。

配置文件位置

Elasticsearch有三个配置文件

  • elasticsearch.yml 用于配置Elasticsearch
  • jvm.options 用于配置Elasticsearch JVM
  • log4j2.properties 用于配置Elasticsearch 日志

注:上述配置文件的位置与Elasticsearch的安装方式有关。

  • 归档文件分发方式安装(tar.gz/zip)

配置文件目录默认是 $ES_HOME/config。当然,可以通过配置环境变量 ES_PATH_CONF来指定配置文件存放目录:

ES_PATH_CONF=/path/to/my/config ./bin/elasticsearch

除了使用环境变量的方式,也可以使用命令行或者shell profile 来export ES_PATH_CONF,同样也可以改变配置文件目录。

  • 包分发(Debian/RPM包)

默认情况下配置文件位置是 /etc/elasticsearch,也可以通过配置环境变量ES_PATH_CONF来改变,需要注意的是仅仅配置此项还不够;此变量值同样也会从/etc/default/elasticsearch(Debian 包)和 /etc/sysconfig/elasticsearch(RPM 包)获取。如果需要改变变量值,你可能需要编辑这两个文件中的ES_PATH_CONF=/etc/elasticsearch键值对来改变配置文件的位置。

配置文件格式

配置文件格式是YAML.

环境变量替换

可以在配置文件中使用${…}来引用系统环境变量。

node.name:    ${HOSTNAME}
network.host: ${ES_NETWORK_HOST}

JVM配置

谨慎改动JVM配置。如果要改动,最多也就改动一下堆内存大小。在改动虚拟机配置时,我们应该优先使用改动jvm.options配置文件的方式。该文件默认位置是config/jvm.options(以tar或者zip包安装)和/etc/elasticsearch/jvm.options(以Debian和RPM包的方式安装)。

jvm.options配置解析

  • 空格组成的行无效
  • 以 # 开头的行无效
  • 以 - 开头的配置项可应用于各个版本的JVM
  • 以 数字:- 开头的配置项仅用于版本号与数字相同的JVM
  • 以 数字-:- 开头的配置项仅用于版本号大于等于数字的JVM
  • 以 数字-数字:- 开头的配置项用于版本号在两数字范围内的JVM
  • 其他形式的项均非法

另一种设置JVM配置的方式是通过ES_JAVA_OPTS环境变量,在使用RPM和Debian包安装时,ES_JAVA_OPTS可通过system configuration file

export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir"

Secure 配置

Logging 配置

Elasticsearch使用Log4j 2 作为日志系统。Log4j 2可以通过log4j2.properties配置。Elasticsearch提供了三个属性: s y s : e s . l o g s . b a s e p a t h , {sys:es.logs.base_path}, sys:es.logs.basepath,{sys:es.logs.cluster_name},${sys:es.logs.node_name},这三个属性可以在配置文件中引用来指定日志文件的位置。

eg:如果日志目录(path.logs)是/var/log/elasticsearch,集群名称是production。在日志文件中{sys:es.logs.base_path} 将会被解析为 /var/log/elasticsearch, s y s : e s . l o g s . b a s e p a t h {sys:es.logs.base_path} sys:es.logs.basepath{sys:file.separator}${sys:es.logs.cluster_name}.log 将会被解析为 /var/log/elasticsearch/production.log。

具体配置可以参考 log4j文档

日志级别配置

有以下四种方式:

  • 通过命令行 在临时调试某个问题(比如某个启动时发生的问题或者在开发期间发生的问题)时可以使用此方式
-E logger.org.elasticsearch.transport=trace
  • 通过elasticsearch.yml配置文件 如果你在调试问题,但是你是通过服务启动Elasticsearch而不是通过命令行的方式,或者说你想要日志级别修改永久生效。
logger.org.elasticsearch.transport: trace
  • 通过集群配置动态修改 适用于对正在运行中的集群动态修改日志级别
curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'
{
  "transient": {
    "logger.org.elasticsearch.transport": "trace"
  }
}
'
  • 通过修改log4j2.properties 这种方式适用于你需要对日志级别有精细的控制
logger.transport.name = org.elasticsearch.transport
logger.transport.level = trace

Deprecation logging

重要的Elasticsearch配置

path.data 和 path.logs

如果使用.zip和.tar.gz归档文件安装,则data和logs文件夹默认是$ES_HOME的子文件夹,这样会在做Elasticsearch升级时使数据面临被覆盖的风险。

path:
  logs: /var/log/elasticsearch
  data: /var/data/elasticsearch

path.data 可以指定多个目录:

path:
  data:
    - /mnt/elasticsearch_1
    - /mnt/elasticsearch_2
    - /mnt/elasticsearch_3

cluster.name

Elasticsearch默认集群名称为elasticsearch.只有各节点集群名称一致时,才会组成一个集群。

cluster.name: logging-prod

确保不同环境不要使用重复的集群名称,否则有可能使得节点加入错误的集群。

node.name

Elasticsearch默认使用随机生成的一个UUID的前7位字符作为node id. node name 和 node id 是永久的,在重启之后才会生效。

node.name: prod-data-2
node.name: ${HOSTNAME}

nodework.host

默认情况下Elasticsearch绑定在回环地址上——127.0.0.1 和 [::1].这种配置对单机单节点模式非常高效。但是如果需要使用多节点集群模型运行,则需要修改此配置项为非回环地址(当然还有其他的网络配置:network settings)。

network.host: 192.168.1.10

此配置项也支持 一些特殊值:local,site,_global_和其他修饰符::ipv4 和 :ipv6.更多细节参见Special values for network.host

恢复配置

Elasticsearch 使用“Zen Discovery”实现集群恢复。有以下两个重要的集群恢复配置:

  • discovery.zen.ping.unicast.hosts

默认情况下,Elasticsearch会扫描9300-9500端口去连接本机的其他节点组建集群。如果需要与其他机器上的节点组建集群,就需要配置其他节点的地址列表:

discovery.zen.ping.unicast.hosts:
   - 192.168.1.10:9300
   - 192.168.1.11 
   - seeds.mydomain.com 

如果不指定端口,则会使用 transport.profiles.default.port 或者 transport.tcp.port

  • discovery.zen.minimum_master_nodes

为了避免数据丢失,需要配置此配置项以限制组建集群的最小节点数。如果不配置此项,某个网络异常的节点会单独构成集群,而其他的节点会组成一个集群,这也称为脑裂,这会导致数据丢失。

为了避免脑裂导致数据丢失,我们需要配置 discovery.zen.minimum_master_nodes(master_eligible_nodes / 2) + 1

设置堆大小

Elasticsearch JVM默认堆大小是1GB.可以在jvm.options中设置Xms与Xmx来设置堆大小。关于堆内存大小设置的经验法则:

  • 设置Xms和Xmx大小一致
  • 堆内存越大,Elasticsearch可用内存越大,但同时GC时间也越长
  • 最大对内存大小不要超过可用物理内存50%,保证有足够的内存给内核文件系统缓存使用
  • 最大堆内存大小不要超过32GB.设置为31GB最好。

设置JVM 堆dump路径

默认情况,堆内存溢出后dump路径:/var/lib/elasticsearch(RPM和Debian安装包),data文件夹下(tar/zip包安装)。可以通过在jvm.options文件中提供 -XX:HeapDumpPath=… 来设置此路径。

GC日志

默认情况下,Elasticsearch开启GC日志。可在jvm.options中配置。

JVM严重异常日志

默认情况下,JVM严重异常日志会写入:/var/lib/elasticsearch(RPM和Debian安装包),logs文件夹下(tar/zip包安装)。可在jvm.options表中加入配置项: -XX:ErrorFile=… 来修改此路径。

重要的系统设置

操作系统配置

系统配置的方式因安装方式不同而不同。以.zip或者.tar.gz包安装,系统配置可以使用如下方式配置:

  • 临时修改可用 uliimit
  • 永久修改可以改动 /etc/security/limits.conf

以RPM或者Debian安装包方式安装,大多数系统配置在system configuration file中。

ulimit

在linux系统中,ulimit 可以用来临时性地改变资源限制。比如,使用如下方式可以将打开的文件句柄数设置为65536:

sudo su  
ulimit -n 65536 
su elasticsearch 
/etc/security/limits.conf

在linux系统中,通过改变/etc/security/limits.conf 文件内容,可以永久性地改变资源限制。比如:

# 修改用于elasticsearch的最大打开句柄数为 65536
elasticsearch  -  nofile  65536
Sysconfig file
安装方式配置文件路径
RPM/etc/sysconfig/elasticsearch
Debian/etc/default/elasticsearch

使用systemd的系统,系统限制都可以通过使用systemd来指定。

Systemd 配置

当在使用systemd的系统上以RPM或者Debian安装包的方式安装Elasticsearch后,系统限制都必须使用systemd指定。

默认情况下,systemd会使用 /usr/lib/systemd/system/elasticsearch.service 作为系统限制文件。可以添加一个文件 /etc/systemd/system/elasticsearch.service.d/override.conf 来覆盖默认文件。或者执行如下命令:

sudo systemctl edit elasticsearch

改变此文件内容:

[Service]
LimitMEMLOCK=infinity

在修改结束后,需要重新加载才会生效:

sudo systemctl daemon-reload

关闭换出

换出操作性能很差,为使节点稳定,需要避免换出。有三种方式可以关闭换出。建议完全关闭换出。如果不能完全关闭换出,最小化换出还是内存锁定需要依据具体情况作出选择。

  • 完全关闭换出
    使用如下执行临时性关闭换出:
sudo swapoff -a

如果要永久性关闭换出,就需要编辑 /etc/fstab文件,注释所有包含 swap的行。
在windows操作系统上:System Properties → Advanced → Performance → Advanced → Virtual memory

  • 配置最小化换出

使用sysctl 配置 vm.swappiness=1 可以保证系统在紧急情况下可以换出,正常情况下不会换出。

  • 打开 bootstrap.memory_lock

另一种方式就是使用linux/unix 系统中的mlockall,或者windows系统中的VirtualLock,将进程地址空间锁定在RAM中,这样就可以避免Elasticsearch内存被换出。可以在config/elasticsearch.yml中加入如下配置实现:

bootstrap.memory_lock: true

如果设置此项,在无法分配内存时,JVM或者Shell将会退出。

在Elasticsearch启动后,可以使用如下请求验证mlockall是否设置生效:

curl -X GET "localhost:9200/_nodes?filter_path=**.mlockall"

设置失败的原因及解决方法省略。遇到问题时参考官方文档。

文件描述符

此项仅对linux/maxos有效。Elasticsearch使用大量文件描述符和文件句柄,如果在运行期间文件描述符达到上限则可能会导致数据丢失。所以需要确保系统文件描述符数量设置为65536或者更大。可以使用如下方式验证设置是否生效:

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

虚拟内存

Elasticsearch默认使用mmapfs文件夹来存储索引。操作系统默认的mmmp 数量限制太低,可能会导致内存溢出。linux系统可以使用如下方式修改:

sysctl -w vm.max_map_count=262144

可以通过修改/etc/sysctl.conf 中的 vm.max_map_count 配置项值永久修改。可以执行如下命令查看修改是否生效:

sysctl vm.max_map_count

线程数

Elasticsearch使用了大量的线程池来执行各种操作,所以在Elasticsearch需要创建线程时它可以随时创建对集群性能至关重要。确保Elasticsearch最少能够创建的线程数为4096。

DNS 缓存

JVM会无限期缓存DNS.如果集群依赖于DNS且各节点的DNS会随时变动,就需要改动默认的JVM行为(缓存DNS的行为)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值