Elasticsearch 节点与集群的原理、类型、配置、运维与最佳实践

在 Elasticsearch 中,节点(Node)集群(Cluster) 是其分布式架构的基石。理解它们的组成、角色、通信机制与管理方式,是构建稳定、高性能搜索系统的前提。

本文将全面详解 Elasticsearch 节点与集群的原理、类型、配置、运维与最佳实践。


一、什么是集群(Cluster)?

集群(Cluster) 是由一个或多个 Elasticsearch 节点组成的逻辑整体,共同存储数据、提供搜索服务。

  • 所有节点通过 集群名称(cluster.name) 识别是否属于同一集群;
  • 集群对外表现为一个整体,客户端无需关心数据在哪个节点;
  • 集群自动管理数据分布、故障转移、负载均衡。
# elasticsearch.yml
cluster.name: my-prod-cluster

✅ 一个集群中可以有多个索引,每个索引的数据分布在多个节点上。


二、什么是节点(Node)?

节点(Node) 是一个运行 Elasticsearch 服务的实例,是集群的物理组成单元。

  • 每个节点启动时加入指定名称的集群;
  • 节点通过 发现机制(Discovery) 找到其他节点并组成集群;
  • 节点可以承担不同角色(如主节点、数据节点等)。
# elasticsearch.yml
node.name: es-data-01

三、节点类型(Node Roles)

从 7.0 开始,Elasticsearch 使用 显式角色划分(替代旧的 node.master, node.data 等配置):

角色配置项说明
主节点候选(master-eligible)node.roles: [ master ]参与主节点选举,管理集群状态
数据节点(data)node.roles: [ data ]存储分片,执行 CRUD、聚合等操作
协调节点(coordinating)默认开启接收请求,转发到其他节点,合并结果
** ingest 节点**node.roles: [ ingest ]执行 ingest pipeline 预处理数据
远程客户端节点(remote_cluster_client)node.roles: [ remote_cluster_client ]用于跨集群搜索
ml 节点node.roles: [ ml ]运行机器学习任务
transform 节点node.roles: [ transform ]执行 transform 作业

✅ 一个节点可拥有多个角色,但生产环境建议角色分离


1. 主节点候选节点(Master-Eligible Node)

  • 负责管理集群范围的状态:如索引创建、删除、分片分配;
  • 不存储数据(建议);
  • 必须有奇数个(3、5)以避免脑裂;
  • 配置示例:
    node.roles: [ master ]
    node.master: true  # 7.x 仍兼容
    

2. 数据节点(Data Node)

  • 存储主分片和副本分片;
  • 承担搜索、聚合、写入等重负载操作;
  • 需要大容量磁盘、高内存、高性能 CPU;
  • 配置示例:
    node.roles: [ data ]
    

3. 协调节点(Coordinating Node)

  • 不显式配置,所有节点默认都是协调节点;
  • 接收客户端请求,将查询广播到相关分片,合并结果;
  • 高并发场景可部署专用协调节点,减轻数据节点压力;
  • 特点:低 CPU、低内存、无磁盘。

4. Ingest 节点

  • 在索引前执行 pipeline 处理数据(如 grok 解析、字段重命名);
  • 减轻客户端或数据节点压力;
  • 配置:
    node.roles: [ ingest ]
    

5. 专用节点组合示例(生产推荐)

节点类型数量配置建议
Master-Eligible316GB RAM, 4CPU, SSD, 仅运行 master 角色
Data NodeN64GB+ RAM, 多核 CPU, 大容量磁盘
Coordinating OnlyM16GB RAM, 4CPU, 无磁盘,仅协调
Ingest NodeK32GB RAM, 高 CPU,用于日志解析

四、集群发现与通信

1. 发现机制(Discovery)

节点启动时通过 seed hosts 发现集群:

# elasticsearch.yml
discovery.seed_hosts: ["es-node1:9300", "es-node2:9300"]
cluster.initial_master_nodes: ["es-node1", "es-node2", "es-node3"]
  • 9300transport port(节点间通信);
  • cluster.initial_master_nodes 仅在首次启动时使用,防止脑裂。

2. 主节点选举

  • 使用 Zen Discovery(7.x)Coordination Layer(8.x)
  • 通过投票选出主节点;
  • 主节点负责维护集群状态(Cluster State);
  • 集群状态包括:索引元数据、分片分配、节点信息等。

3. 集群状态(Cluster State)

  • 存储在内存中,不持久化到磁盘;
  • 由主节点管理,变更时广播给所有节点;
  • 过大的集群状态(如太多索引/字段)会导致性能下降。

五、集群健康状态

通过 _cluster/health 查看集群整体状态:

GET /_cluster/health

返回示例:

{
  "cluster_name": "my-prod-cluster",
  "status": "green",
  "timed_out": false,
  "number_of_nodes": 5,
  "number_of_data_nodes": 3,
  "active_primary_shards": 10,
  "active_shards": 20,
  "relocating_shards": 0,
  "initializing_shards": 0,
  "unassigned_shards": 0,
  "delayed_unassigned_shards": 0
}

状态含义:

状态说明
🟢 green所有主分片和副本都正常分配
🟡 yellow主分片正常,副本未全部分配(常见于副本数 > 节点数)
🔴 red有主分片未分配,部分数据不可用

✅ 生产环境应尽量保持 green


六、节点管理命令

1. 查看节点信息

GET /_cat/nodes?v
GET /_nodes
GET /_nodes/stats

输出示例:

ip          heap.percent ram.percent cpu load_1m node.role   master name
10.0.1.101  45           70          8   0.15    dilm        *      es-data-01
10.0.1.102  12           50          2   0.05    m           -      es-master-01

2. 关闭节点(滚动升级)

PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.enable": "primaries"
  }
}

然后安全关闭节点。


七、常见问题与解决方案

Q1:脑裂(Split Brain)如何避免?

现象:两个主节点同时存在,导致数据不一致。

解决方案

  • 使用奇数个 master-eligible 节点(3、5);
  • 设置 discovery.zen.minimum_master_nodes(7.x)或使用默认协调层(8.x);
  • 避免网络分区。

Q2:节点离线怎么办?

  • 检查网络、防火墙、JVM 是否 OOM;
  • 查看日志:logs/elasticsearch.log
  • 使用 GET /_cluster/allocation/explain 分析分片未分配原因。

Q3:如何扩容?

增加数据节点:
  1. 配置新节点的 cluster.namediscovery.seed_hosts
  2. 启动,自动加入集群;
  3. 集群自动重新平衡分片。
增加主节点:
  • 修改 cluster.initial_master_nodes(仅首次);
  • 建议提前规划,避免频繁变更。

Q4:节点负载过高?

  • 检查 GET /_nodes/stats 中的 CPU、内存、磁盘、线程池;
  • 优化查询(避免 wildcardnested 查询);
  • 增加副本分片提升读吞吐;
  • 拆分大索引。

八、集群安全配置

1. 启用安全功能

xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

2. 用户与角色

  • 创建专用用户:
    POST /_security/user/analytics_user
    {
      "password": "pass",
      "roles": [ "kibana_reader", "viewer" ]
    }
    

九、监控与运维建议

工具用途
Kibana Stack Monitoring可视化集群状态、节点负载、索引性能
Prometheus + Grafana自定义监控大盘
Elastic Agent + Metricbeat采集节点指标
Slow Log定位慢查询
_cluster/allocation/explain排查分片分配问题

十、最佳实践总结 ✅

项目建议
主节点3 个专用节点,奇数,不存储数据
数据节点根据容量规划,SSD + 大内存
角色分离生产环境避免“全能节点”
发现配置正确设置 seed_hostsinitial_master_nodes
集群名称不同环境使用不同名称(prod/staging/dev)
监控必须监控节点健康、磁盘、JVM
备份定期 snapshot 到共享存储或云存储

十一、扩展建议

场景建议方案
多可用区部署使用 node.attr.zone 实现机架感知
跨集群搜索(CCS)配置 remote clusters
热温架构数据节点分 hot/warm 角色
Serverless / 云托管使用 Elastic Cloud、AWS OpenSearch
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值