0%

配置

Elasticsearch 配置详解:从基础到高级优化

Elasticsearch 的配置直接影响集群的性能、稳定性和安全性。配置分为静态配置(仅通过配置文件设置,需重启生效)和动态配置(可通过 API 实时修改)。本文将系统解析核心配置项,包括网络、脚本、快照、线程池、索引等关键模块。

配置类型与优先级

  1. 静态配置
    • 定义位置:elasticsearch.yml(主配置文件)、jvm.options(JVM 参数)。
    • 生效方式:修改后需重启节点。
    • 涵盖范围:网络绑定、端口、JVM 堆大小、节点角色等基础参数。
  2. 动态配置
    • 定义方式:通过 /_cluster/settings API 设置。
    • 生效方式:实时生效,无需重启。
    • 涵盖范围:集群级参数(如副本数、刷新间隔)、线程池设置等。
  3. 优先级:显式配置(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 调用)连接:

1
2
3
4
5
6
7
8
# elasticsearch.yml 中配置
http:
port: 9200-9300 # 端口范围,默认 9200
host: 0.0.0.0 # 绑定所有网卡
cors:
enabled: true # 允许跨域(如 Kibana 访问)
allow-origin: "*" # 允许所有来源(生产环境需限制)
max_content_length: 100mb # 最大请求体大小

Transport 配置(节点间通信)

控制节点间内部通信(默认 9300 端口),确保集群成员发现和数据同步:

1
2
3
4
5
6
# elasticsearch.yml 中配置
transport:
port: 9300-9400 # 端口范围
tcp:
no_delay: true # 禁用 TCP 延迟(提升实时性)
keep_alive: true # 保持长连接

集群发现配置

节点通过发现机制加入集群,默认使用 zen 发现(7.x 后逐步迁移至 discovery.seed_hosts):

1
2
3
4
5
6
7
# 单播发现(生产环境推荐,替代组播)
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)实现复杂操作,脚本配置需平衡灵活性与安全性。

1
2
3
4
5
6
7
8
9
# elasticsearch.yml 中配置
script:
max_compilations_rate: 75/5m # 5分钟内最多编译75个脚本(防止DOS攻击)
painless:
regex:
enabled: false # 禁用正则表达式(减少安全风险)
cache:
max_size: 100 # 脚本缓存最大数量
expire: 0ms # 缓存永不过期(默认)
  • 动态修改:通过 API 实时调整缓存大小:

    1
    2
    3
    4
    5
    6
    PUT _cluster/settings
    {
    "transient": { # 临时生效,重启失效
    "script.cache.max_size": 200
    }
    }

快照与备份配置:数据安全保障

快照(Snapshot)用于备份集群数据,支持本地文件系统、S3、GCS 等存储介质。

注册快照仓库

1
2
3
4
5
6
7
8
# 创建本地文件系统仓库
PUT _snapshot/my_backup
{
"type": "fs",
"settings": {
"location": "/path/to/backup" # 备份目录(需所有节点可访问)
}
}

核心参数:

  • compress: 是否压缩快照(默认 true)。
  • max_snapshot_bytes_per_sec: 快照生成速度限制(默认 40mb/s)。

创建与恢复快照

  • 创建快照

    1
    2
    3
    4
    PUT _snapshot/my_backup/snapshot_1?wait_for_completion=true
    {
    "indices": "index1,index2" # 仅备份指定索引(默认备份所有)
    }
  • 恢复快照

    1
    2
    3
    4
    5
    6
    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: 16queue_size: 200
bulk 批量写入任务 fixed size: 16queue_size: 500
refresh 索引刷新任务 scaling max: 10(最大线程数)

动态调整线程池

1
2
3
4
5
6
7
PUT _cluster/settings
{
"transient": {
"thread_pool.search.size": 40, # 调整搜索线程池大小
"thread_pool.bulk.queue_size": 1000 # 调整批量队列长度
}
}

注意:线程数建议不超过 CPU 核心数的 2 倍,队列长度过大会导致内存占用过高。

索引配置:控制索引行为与资源

索引级配置影响单个索引的性能,可在模板中预定义或动态修改。

内存与缓存配置

  • 索引缓冲区:用于缓存待索引的文档,满后写入磁盘。

    1
    indices.memory.index_buffer_size: 10%  # 节点总索引缓冲区占堆内存比例
  • 字段数据缓存text 字段聚合 / 排序时使用的内存缓存。

    1
    indices.fielddata.cache.size: 20%  # 限制占堆内存比例

断路器配置(防止内存溢出)

断路器限制各类操作的内存使用,避免 OOM:

1
2
3
4
indices.breaker:
total.limit: 70% # 所有断路器总内存上限(堆内存的70%)
fielddata.limit: 40% # 字段数据缓存上限
request.limit: 40% # 单个请求内存上限

索引恢复配置

控制分片恢复速度(如节点重启后数据同步):

1
indices.recovery.max_bytes_per_sec: 40mb  # 恢复速度限制(默认40mb/s)

关键配置最佳实践

  1. JVM 堆内存:设置为物理内存的 50%(最大不超过 31GB,避免 JVM 压缩指针失效)。

    1
    2
    3
    # jvm.options 中配置
    -Xms16g
    -Xmx16g
  2. 生产环境网络:禁用组播,使用单播发现;绑定私有 IP,限制 HTTP 访问来源。

  3. 线程池调优:根据业务负载调整(如写入密集型增加 bulk 线程数,查询密集型增加 search 线程数)。

  4. 快照策略:定期自动创建快照(结合 CRON 或 ILM),跨区域备份

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10