配置

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 调用)连接:

# 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: 16queue_size: 200
bulk 批量写入任务 fixed size: 16queue_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)

关键配置最佳实践

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

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

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

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