Elasticsearch 集群搭建:分步配置指南

使用安全的节点角色、发现设置、网络配置、堆大小调整和健康检查来配置 Elasticsearch 集群。

Elasticsearch 集群搭建:分步配置指南

搭建 Elasticsearch 集群主要在于早期正确做出几个关键选择:节点名称、发现机制、角色、网络和内存。如果这些基础设置出错,集群可能无法可靠形成、在错误的接口上暴露自身,或在节点重启时出现问题。

本指南将引导您审查在将 Elasticsearch 投入实际工作负载前应检查的核心设置。示例使用 elasticsearch.yml,并假设是一个小型三节点集群,但相同的检查也适用于扩展场景。

前提条件

在深入配置之前,请确保已具备以下条件:

  • Java 运行时: 许多 Elasticsearch 发行版包含捆绑的 JDK。如果您自行提供 Java 运行时,请查阅您 Elasticsearch 版本的支持矩阵。
    java -version
    
  • 系统资源: 为您的 Elasticsearch 节点分配足够的 RAM、CPU 和磁盘空间。具体需求取决于您的数据量和查询复杂度。
  • 网络访问: 确保节点能够在配置的传输端口(默认为 9300)上相互通信。

安装

虽然本指南侧重于配置,但成功的搭建始于正确的安装。Elasticsearch 可以通过包管理器(apt、yum)、下载归档文件或使用 Docker 进行安装。请参阅官方 Elasticsearch 文档以获取适用于您操作系统或部署方法的详细安装说明。

核心配置文件

Elasticsearch 的主要配置文件是 elasticsearch.yml,通常位于 Elasticsearch 安装目录的 config/ 目录中。此文件中的关键设置决定了集群的行为。

集群搭建:关键配置指令

1. 集群名称 (cluster.name)

此设置唯一标识您的集群。同一集群中的所有节点必须共享相同的 cluster.name。如果未设置,则默认为 elasticsearch

  • 重要性: 节点发现并加入正确集群所必需。同一网络中的不同集群应具有不同的名称。
  • 示例 (elasticsearch.yml):
    cluster.name: my-production-cluster
    

2. 节点角色 (node.roles)

可以为 Elasticsearch 节点分配特定角色以优化资源分配和性能。常见角色包括 masterdataingestml。对于较小的集群,单个节点可以拥有多个角色。

  • 符合主节点资格的节点: 负责集群范围的操作,如创建/删除索引、跟踪节点和分配分片。建议在生产环境中使用专用主节点以确保稳定性。
    node.roles: [ master ]
    
  • 数据节点: 存储数据并执行与数据相关的操作,如索引和搜索。专用数据节点对性能至关重要。
    node.roles: [ data ]
    
  • 预处理节点: 用于在索引之前预处理文档(例如,使用预处理管道)。
    node.roles: [ ingest ]
    
  • 机器学习节点: 运行机器学习功能,用于异常检测和其他任务。
    node.roles: [ ml ]
    
  • 仅协调节点: 处理搜索和批量请求,但不存储数据也不参与主节点选举。用于从数据节点或主节点卸载繁重的查询负载。
    node.roles: []
    

最佳实践: 在生产环境中,将节点专用于特定角色(例如,将主节点与数据节点分开)以获得更好的容错性和性能。对于较小的设置,节点可以具有组合角色。

3. 网络设置 (network.host, http.port, transport.port)

这些设置控制您的 Elasticsearch 节点如何通信。

  • network.host 节点绑定的 IP 地址或主机名。对于多节点集群,请设置为其他节点可访问的 IP 地址。使用 0.0.0.0 将绑定到所有可用的网络接口。
    network.host: 192.168.1.100
    # 或
    network.host: _site_
    # 或
    network.host: 0.0.0.0
    
  • http.port HTTP REST API 的端口(默认:9200)。
    http.port: 9200
    
  • transport.port 节点间通信的端口(默认:9300)。
    transport.port: 9300
    

警告: 请注意防火墙规则,确保节点可以在 transport.port 上通信。

4. 发现设置 (discovery.seed_hosts, cluster.initial_master_nodes)

这些设置对于节点发现并加入集群至关重要。

  • discovery.seed_hosts 集群中其他节点的 IP 地址或主机名列表,新节点可以连接这些地址以发现集群。
    discovery.seed_hosts:
      - "host1:9300"
      - "host2:9300"
      - "192.168.1.101:9300"
    
  • cluster.initial_master_nodes 仅用于引导全新集群的符合主节点资格的节点名称列表。集群形成后,请移除此设置。保留过时的引导设置可能会导致后续重建或意外集群形成时出现混乱。
    cluster.initial_master_nodes:
      - "node-1"
      - "node-2"
      - "node-3"
    

提示: 在云环境或动态网络中,考虑使用 DNS 或云提供商发现机制等服务。

配置多节点集群

要设置多节点集群,您需要配置每个节点的 elasticsearch.yml 文件。确保:

  1. 所有节点的 cluster.name 相同。
  2. 每个节点都有唯一的 node.name(例如,node-1node-2)。
  3. network.host 设置为其他节点可访问的 IP 地址。
  4. discovery.seed_hosts 至少列出法定数量的符合主节点资格的节点地址。
  5. 仅在首次集群引导期间,cluster.initial_master_nodes 包含初始符合主节点资格的节点名称。

node-1 示例:

cluster.name: my-production-cluster
node.name: node-1
node.roles: [ master, data ]
network.host: 192.168.1.100
http.port: 9200
transport.port: 9300
discovery.seed_hosts:
  - "192.168.1.100:9300"
  - "192.168.1.101:9300"
  - "192.168.1.102:9300"
cluster.initial_master_nodes:
  - "node-1"
  - "node-2"
  - "node-3"

node-2 示例(类似,使用 node.name: node-2):

cluster.name: my-production-cluster
node.name: node-2
node.roles: [ master, data ]
network.host: 192.168.1.101
http.port: 9200
transport.port: 9300
discovery.seed_hosts:
  - "192.168.1.100:9300"
  - "192.168.1.101:9300"
  - "192.168.1.102:9300"
cluster.initial_master_nodes:
  - "node-1"
  - "node-2"
  - "node-3"

5. 堆大小 (jvm.options)

Elasticsearch 使用大量内存。Java 虚拟机 (JVM) 堆大小在 jvm.options 文件(通常位于 config/ 目录)中配置。建议将最小和最大堆大小设置为相同的值,以避免因堆大小调整导致的性能问题。

  • 最佳实践: 将堆大小设置为不超过系统 RAM 的一半左右,并为文件系统缓存留出内存。避免过大的堆;许多部署保持在压缩普通对象指针阈值以下,该阈值通常在 30 GB 左右,但取决于 JVM。

示例 (jvm.options):

-Xms4g
-Xmx4g

这将初始和最大堆大小都设置为 4 GB。

6. 分片分配和复制 (cluster.routing.*)

这些设置控制分片如何在节点之间分布和复制。

  • cluster.routing.allocation.disk.watermark.lowhighflood_stage:防止在磁盘空间不足时分配分片的阈值。
  • cluster.routing.allocation.enable 控制分片分配(例如,allprimariesnew_primariesnone)。

示例:

cluster.routing.allocation.disk.watermark.low: "85%"
cluster.routing.allocation.disk.watermark.high: "90%"
cluster.routing.allocation.disk.watermark.flood_stage: "95%"

验证集群健康

节点启动后,您可以使用集群健康 API 检查集群的健康和状态。

curl -X GET "localhost:9200/_cluster/health?pretty"

关键输出字段:

  • status green(所有分片已分配)、yellow(某些副本未分配)、red(某些主分片未分配)。
  • number_of_nodes 集群中的节点总数。
  • number_of_data_nodes 指定为数据节点的节点数。
  • active_shardsrelocating_shardsinitializing_shardsunassigned_shards

提示: 目标是 green 状态。yellow 状态表示虽然您的数据是安全的(主分片已分配),但您可能缺乏足够的高可用性副本。red 状态意味着数据面临风险,需要立即处理。

后续步骤

成功设置 Elasticsearch 集群后,您通常会继续进行:

  • 索引创建: 定义数据的存储和组织方式。
  • 映射: 定义文档的模式,为字段指定数据类型。
  • 分析器: 配置文本分析以实现有效的全文搜索。
  • 安全: 实施身份验证和授权。

本指南为稳定且高性能的 Elasticsearch 集群提供了必要的基础。根据您的具体工作负载进行持续监控和调整是长期成功的关键。