Elasticsearch 集群设置:逐步配置指南

本综合指南提供了逐步指导,以设置和配置您的 Elasticsearch 集群。学习从安装到节点配置的关键步骤,包括集群名称、节点角色、网络配置和发现等关键设置。通过实际示例和最佳实践,优化您的分布式搜索和分析引擎,以实现最佳性能和可伸缩性。

36 浏览量

Elasticsearch 集群设置:循序渐进的配置指南

搭建强大的 Elasticsearch 集群是利用其强大的分布式搜索和分析能力的基础步骤。无论是为小型项目还是大型企业解决方案进行部署,理解核心配置原则对于确保最佳性能、可扩展性和可靠性都至关重要。本指南提供了配置 Elasticsearch 集群的全面、循序渐进的演练,涵盖了从初始安装到节点设置微调的关键方面。

正确的集群设置不仅能确保您的 Elasticsearch 实例平稳运行,还能使其准备好应对不断增长的数据量和查询负载。错误的配置可能导致性能瓶颈、数据不一致,甚至集群不稳定。遵循本指南,您将获得构建一个根据您的特定需求量身定制的、弹性且高效的 Elasticsearch 环境的知识。

先决条件

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

  • Java 开发工具包 (JDK): Elasticsearch 需要兼容的 JDK。Elasticsearch 7.x 及更高版本需要 JDK 11 或更高版本。请验证您的 Java 安装:
    bash java -version
  • 系统资源: 为您的 Elasticsearch 节点分配足够的 RAM、CPU 和磁盘空间。确切要求取决于您的数据量和查询复杂度。
  • 网络访问: 确保节点之间可以通过配置的传输端口(默认为 9300)进行通信。

安装

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

核心配置文件

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

集群设置:关键配置指令

1. 集群名称 (cluster.name)

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

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

2. 节点角色 (node.roles)

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

  • 主节点候选节点(Master-eligible node): 负责集群范围的操作,例如创建/删除索引、跟踪节点和分配分片 (shards)。为了稳定,建议在生产环境中设置专用的主节点。
    yaml node.roles: [ master ]
  • 数据节点(Data node): 存储数据并执行与数据相关的操作,例如索引和搜索。专用的数据节点对性能至关重要。
    yaml node.roles: [ data ]
  • 摄入节点(Ingest node): 用于在索引之前对文档进行预处理(例如,使用摄入管道)。
    yaml node.roles: [ ingest ]
  • 机器学习节点(Machine Learning node): 运行用于异常检测和其他任务的机器学习功能。
    yaml node.roles: [ ml ]
  • 仅协调节点(Coordinating-only node): 处理搜索和批量请求,但不存储数据或参与主节点选举。对于减轻数据节点或主节点上的繁重查询负载很有用。
    yaml node.roles: [ ] # 如果没有指定 master/data 角色,则默认没有特定角色意味着仅协调节点

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

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

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

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

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

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

这些设置对于节点查找和加入集群至关重要。

  • discovery.seed_hosts 集群中其他节点的 IP 地址或主机名列表,新节点可以连接到这些地址以发现集群。
    ```yaml
    discovery.seed_hosts:
    • "host1:9300"
    • "host2:9300"
    • "192.168.1.101:9300"
      ```
  • cluster.initial_master_nodes 当集群首次启动时,有资格成为初始主节点的节点名称列表。这对于引导集群至关重要。集群运行后,这些设置对于新节点加入的重要性降低,但对于集群重启场景仍然重要。
    ```yaml
    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 的 50%,并且由于压缩普通对象指针 (oops) 的限制,切勿超过 30-32GB。

示例 (jvm.options):

-Xms4g
-Xmx4g

这将初始和最大堆大小都设置为 4 GB(千兆字节)。

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

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

  • cluster.routing.allocation.disk.watermark.low, high, flood_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_shards(活动分片)、relocating_shards(迁移中分片)、initializing_shards(初始化分片)、unassigned_shards(未分配分片)。

提示: 目标是 green 状态。yellow 状态表示您的数据是安全的(主分片已分配),但可能缺乏足够的副本以实现高可用性。red 状态意味着数据处于风险之中,需要立即关注。

后续步骤

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

  • 索引创建: 定义您的数据将如何存储和组织。
  • 映射 (Mapping): 定义文档的 schema(模式),指定字段的数据类型。
  • 分析器 (Analyzers): 配置文本分析以实现高效的全文搜索。
  • 安全: 实施身份验证和授权。

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