配置 Elasticsearch
Elasticsearch 提供了良好的默认值,并且只需要很少的配置即可完成启动。
-
动态更新集群的配置
通过PUT /_cluster/settings
可以更改正在运行集群的大多数配置。PUT /_cluster/settings { "persistent" : { "indices.recovery.max_bytes_per_sec" : "50mb" } }
elasticsearch.yml 文件静态设置
通过在启动es前, 更改elasticsearch.yml
文件, 静态初始化es的配置状态。Elasticsearch 存在4种 configure 方法, 优先按顺序应用:
Transient 瞬态设置
,Persistent 持续设置
,elasticsearch.yml 设置
,Default value 默认设置值
。
不建议使用Transient setting 瞬态设置
来设置集群, 避免集群变得不稳定。 优先使用默认值
>elasticsearch.yml
>Persistent 持续设置
配置文件位置
Elasticsearch 有三个配置文件:
-
elasticsearch.yml
用于配置 Elasticsearch -
jvm.options
用于配置 Elasticsearch JVM 设置 -
log4j2.properties
用于配置 Elasticsearch 日志记录
配置文件中环境变量的替换方式
使用配置文件中的符号引用的环境变量 ${...}
将替换为环境变量的值。例如:
node.name: ${HOSTNAME}
network.host: ${ES_NETWORK_HOST}
重要的elasticsearch配置项
-
(静态)路径设置
path.data
: es索引的数据流写入的目录。
path.logs
: es索引的日志写入的目录。
默认情况下, 建议通过path: data: /var/data/elasticsearch logs: /var/log/elasticsearch
.tar.gz
,.zip
压缩包方式安装的Elasticsearch ,data
和logs
位于$ES_HOME
下。通过docker
安装的Elasticsearch,data
和logs
位于$ES_HOME
外(即挂载外部存储盘)。
-
(静态)集群名称设置
只有同一个集群名称, 才能加入同一个集群。cluster.name: logging-prod
-
(静态)节点名称设置
node.name
用作 Elasticsearch 特定实例的人类可读标识符。node.name: prod-data-2
-
(静态)网络主机设置
默认值为127.0.0.1
。 当该值修改后,Elasticsearch 假定您正在从开发模式转移到生产模式,并将许多系统启动检查从警告升级为异常。network.host: 192.168.1.10
-
集群发现相关设置
自动引导
ES节点在无任何配置修改的情况下启动, 会被识别为开发环境, Elasticsearch 会检测127.0.0.1
本机环境下的9300~9305
端口, 形成一个开发集群。种子发现
ES节点如果配置了以下任何设置discovery.seed_providers(静态)
,discovery.seed_hosts(静态)
,cluster.initial_master_nodes(静态)
,则不会发生自动引导。discovery.seed_providers(静态)
使用场景:设置ES使用哪种类型的种子地址发现机制。 默认为从discovery.seed_hosts(静态)
中获取种子节点地址。 除discovery.seed_hosts(静态)
外, 还有file-based seed hosts provider
,EC2 hosts provider
,Azure Classic hosts provider
等插件发现机制。-
discovery.seed_hosts(静态)
使用场景: 当一个新节点需要加入一个集群A, 需要在discovery.seed_hosts
配置一个或多个集群A内的节点,以便新节点可以连通集群。discovery.seed_hosts: - 192.168.1.10:9300 - 192.168.1.11 - seeds.mydomain.com - [0:0:0:0:0:ffff:c0a8:10c]:9301
-
discovery.seed_hosts(静态)
列表节点数量建议 >= 3。 - 需要指定host的port,默认
port=9300
-
-
cluster.initial_master_nodes(静态)
使用场景: 当集群初次启动时, 需要在cluster.initial_master_nodes
配置一个或多个集群A内的节点, 用于在es集群初始化时选举主节点master
。cluster.initial_master_nodes: - master-node-a - master-node-b - master-node-c
该配置仅
集群第一次启动
时才需要。 当集群启动后, 已经加入集群的节点会将此信息存储在$ES_HOME/data
文件夹中, 后续加入集群的节点会从主节点master
中获取到这部分信息。- 必须在设置
cluster.initial_master_nodes(静态)
的每个节点上设置相同的节点列表,以确保在引导期间仅形成一个集群,从而避免数据丢失的风险。 -
cluster.initial_master_nodes(静态)
列表节点数量建议 >= 3。 - 可以使用
IP:port
或node.name
方式指定节点, 强烈建议使用node.name
, 减少没必要的复杂度。
- 必须在设置
-
(静态)堆大小设置
默认情况下,Elasticsearch 会根据节点的角色和总内存自动设置JVM堆大小。 这里建议生产环境尽量不做改动。
手动配置在jvm.options
文件中:-Xms2g -Xmx2g
-
(静态)JVM堆转储存路径位置
默认情况下,Elasticsearch 将 JVM 配置为将内存不足异常的堆转储到默认数据目录。在 Linux 和 MacOS以及Windows发行版上,该data
目录位于 Elasticsearch 安装的根目录下。
手动配置在jvm.options
文件中:-XX:HeapDumpPath=...
断路器设置
Elasticsearch 断路器,用于防止操作导致 OutOfMemoryError。每个断路器都指定了它可以使用多少内存的限制。
-
Parent circuit breaker 父级断路器
用于统一控制es内存使用量, 超过阈值会触发熔断。通过indices.breaker.total.use_real_memory (静态)
和indices.breaker.total.limit(动态)
进行设置。indices.breaker.total.use_real_memory(静态)
默认为 true,与indices.breaker.total.limit(动态)
共同作用。如果为 false, 则使用子熔断器的阈值。
indices.breaker.total.limit(动态)
整体父断路器的启动限制。与indices.breaker.total.use_real_memory(静态)
共同作用。 -
Field data-circuit breaker 字段数据断路器
字段数据断路器
估计将字段加载到字段数据缓存
中所需的堆内存。如果加载该字段会导致缓存超出预定义的内存限制,则断路器将停止操作并返回错误。indices.breaker.fielddata.limit(动态)
请求中断的限制,默认为 JVM 堆的 40%。
indices.breaker.fielddata.overhead(动态)
与所有现场数据估计相乘以确定最终估计的常数。默认为1.03. -
Request circuit breaker 请求断路器
请求熔断器 设置 单次请求造成的数据结构内存需求(例如,用于在请求期间计算聚合的内存)阈值, 超过阈值则终端请求。indices.breaker.request.limit(动态)
请求中断的限制,默认为 JVM 堆的 60%。
indices.breaker.request.overhead(动态)
与所有请求估计相乘以确定最终估计的常数。默认为 1. -
In flight requests circuit breaker 在飞行中请求断路器
飞行中的所有请求造成的数据结构内存需求阈值, 超过阈值则中断请求。network.breaker.inflight_requests.limit(动态)
飞行中请求中断的限制,默认为 JVM 堆的 100%。这意味着它受为父断路器配置的限制的约束。
network.breaker.inflight_requests.overhead(动态)
一个常数,所有在飞行中的请求估计乘以以确定最终估计。默认为 2。 -
Script compilation circuit breakr 脚本编译断路器
与之前的基于内存的熔断器略有不同的是,脚本编译熔断器限制了一段时间内内联脚本编译的次数。script.max_compilations_rate(动态)
一定时间间隔内允许编译的唯一动态脚本的数量限制。默认为150/5m,表示每 5 分钟 150 个。 -
Regex circuit breakr 正则表达式断路器
写得不好的正则表达式会降低集群的稳定性和性能。正则表达式断路器限制了 无痛脚本中正则表达式的使用和复杂性。script.painless.regex.enabled(静态)
在无痛脚本中启用正则表达式。limited(默认, 启用但有限制)
,true(启用且无限制)
,false(禁用)
script.painless.regex.limit-factor(静态)
限制无痛脚本中正则表达式可以考虑的字符数。Elasticsearch 通过将设置值乘以脚本输入的字符长度来计算此限制。Elasticsearch 仅在script.painless.regex.enabled = limited
时应用此限制。例如,输入foobarbaz的字符长度为9。If
script.painless.regex.limit-factor
is 6,正则表达式foobarbaz 最多可以考虑 54 (9 * 6) 个字符。如果表达式超过此限制,它会触发正则表达式断路器并返回错误。