配置
Elasticsearch 配置详解:从基础到高级优化
Elasticsearch 的配置直接影响集群的性能、稳定性和安全性。配置分为静态配置(仅通过配置文件设置,需重启生效)和动态配置(可通过 API 实时修改)。本文将系统解析核心配置项,包括网络、脚本、快照、线程池、索引等关键模块。
配置类型与优先级
- 静态配置
- 定义位置:
elasticsearch.yml(主配置文件)、jvm.options(JVM 参数)。 - 生效方式:修改后需重启节点。
- 涵盖范围:网络绑定、端口、JVM 堆大小、节点角色等基础参数。
- 定义位置:
- 动态配置
- 定义方式:通过
/_cluster/settingsAPI 设置。 - 生效方式:实时生效,无需重启。
- 涵盖范围:集群级参数(如副本数、刷新间隔)、线程池设置等。
- 定义方式:通过
- 优先级:显式配置(
elasticsearch.yml或 API)> 默认值;动态配置覆盖静态配置中可动态修改的参数。
网络配置:节点通信与连接
网络配置是集群部署的基础,确保节点间通信和客户端连接正常,主要包括 HTTP 层(客户端交互)和 Transport 层(节点间内部通信)。
核心网络参数(静态配置)
| 参数 | 作用 | 示例值 |
|---|---|---|
network.host |
节点绑定的 IP 或主机名(默认 localhost) |
0.0.0.0(允许所有网卡) |
network.bind_host |
绑定的网络接口(默认同 network.host) |
192.168.1.100 |
network.publish_host |
向集群其他节点宣告的 IP(默认同 network.host) |
192.168.1.100 |
HTTP 配置(客户端交互)
控制 HTTP 接口(默认 9200 端口)的行为,用于客户端(如 Kibana、API 调用)连接:
# elasticsearch.yml 中配置
http:
port: 9200-9300 # 端口范围,默认 9200
host: 0.0.0.0 # 绑定所有网卡
cors:
enabled: true # 允许跨域(如 Kibana 访问)
allow-origin: "*" # 允许所有来源(生产环境需限制)
max_content_length: 100mb # 最大请求体大小
Transport 配置(节点间通信)
控制节点间内部通信(默认 9300 端口),确保集群成员发现和数据同步:
# elasticsearch.yml 中配置
transport:
port: 9300-9400 # 端口范围
tcp:
no_delay: true # 禁用 TCP 延迟(提升实时性)
keep_alive: true # 保持长连接
集群发现配置
节点通过发现机制加入集群,默认使用 zen 发现(7.x 后逐步迁移至 discovery.seed_hosts):
# 单播发现(生产环境推荐,替代组播)
discovery:
zen:
ping:
unicast:
hosts: ["192.168.1.101:9300", "192.168.1.102:9300"] # 初始节点列表
minimum_master_nodes: 2 # 防止脑裂(推荐:(主节点数/2)+1)
注意:
minimum_master_nodes需根据主节点数量设置,确保集群有半数以上主节点才能选举新主节点。
脚本配置:控制脚本执行安全
Elasticsearch 支持通过脚本(如 Painless)实现复杂操作,脚本配置需平衡灵活性与安全性。
# elasticsearch.yml 中配置
script:
max_compilations_rate: 75/5m # 5分钟内最多编译75个脚本(防止DOS攻击)
painless:
regex:
enabled: false # 禁用正则表达式(减少安全风险)
cache:
max_size: 100 # 脚本缓存最大数量
expire: 0ms # 缓存永不过期(默认)
动态修改:通过 API 实时调整缓存大小:
PUT _cluster/settings { "transient": { # 临时生效,重启失效 "script.cache.max_size": 200 } }
快照与备份配置:数据安全保障
快照(Snapshot)用于备份集群数据,支持本地文件系统、S3、GCS 等存储介质。
注册快照仓库
# 创建本地文件系统仓库
PUT _snapshot/my_backup
{
"type": "fs",
"settings": {
"location": "/path/to/backup" # 备份目录(需所有节点可访问)
}
}
核心参数:
compress: 是否压缩快照(默认true)。max_snapshot_bytes_per_sec: 快照生成速度限制(默认40mb/s)。
创建与恢复快照
创建快照:
PUT _snapshot/my_backup/snapshot_1?wait_for_completion=true { "indices": "index1,index2" # 仅备份指定索引(默认备份所有) }恢复快照:
POST _snapshot/my_backup/snapshot_1/_restore { "indices": "index1", # 仅恢复index1 "rename_pattern": "index(.+)", # 重命名索引(如index1→restored_index1) "rename_replacement": "restored_index$1" }
线程池配置:控制任务执行资源
Elasticsearch 为不同操作(索引、搜索、批量等)分配独立线程池,避免资源竞争。线程池类型包括:
fixed:固定线程数 + 队列(如搜索、索引)。cached:动态线程(无队列,适合短任务)。scaling:线程数在 1~max 间动态调整(如刷新、快照)。
核心线程池参数
| 线程池名称 | 作用 | 类型 | 关键参数(示例) |
|---|---|---|---|
search |
搜索与聚合任务 | fixed |
size: 32(线程数)、queue_size: 1000(队列长度) |
index |
索引写入任务 | fixed |
size: 16、queue_size: 200 |
bulk |
批量写入任务 | fixed |
size: 16、queue_size: 500 |
refresh |
索引刷新任务 | scaling |
max: 10(最大线程数) |
动态调整线程池
PUT _cluster/settings
{
"transient": {
"thread_pool.search.size": 40, # 调整搜索线程池大小
"thread_pool.bulk.queue_size": 1000 # 调整批量队列长度
}
}
注意:线程数建议不超过 CPU 核心数的 2 倍,队列长度过大会导致内存占用过高。
索引配置:控制索引行为与资源
索引级配置影响单个索引的性能,可在模板中预定义或动态修改。
内存与缓存配置
索引缓冲区:用于缓存待索引的文档,满后写入磁盘。
indices.memory.index_buffer_size: 10% # 节点总索引缓冲区占堆内存比例字段数据缓存:
text字段聚合 / 排序时使用的内存缓存。indices.fielddata.cache.size: 20% # 限制占堆内存比例
断路器配置(防止内存溢出)
断路器限制各类操作的内存使用,避免 OOM:
indices.breaker:
total.limit: 70% # 所有断路器总内存上限(堆内存的70%)
fielddata.limit: 40% # 字段数据缓存上限
request.limit: 40% # 单个请求内存上限
索引恢复配置
控制分片恢复速度(如节点重启后数据同步):
indices.recovery.max_bytes_per_sec: 40mb # 恢复速度限制(默认40mb/s)
关键配置最佳实践
JVM 堆内存:设置为物理内存的 50%(最大不超过 31GB,避免 JVM 压缩指针失效)。
# jvm.options 中配置 -Xms16g -Xmx16g生产环境网络:禁用组播,使用单播发现;绑定私有 IP,限制 HTTP 访问来源。
线程池调优:根据业务负载调整(如写入密集型增加
bulk线程数,查询密集型增加search线程数)。快照策略:定期自动创建快照(结合 CRON 或 ILM),跨区域备份