Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

ElasticSearch 集群

内容涵盖:集群架构、节点角色、分片机制、路由、复制、主节点选举、网络、扩容缩容、最佳实践、集群规划方案。

1. 什么是 ES 集群?

ElasticSearch 集群是 多个节点(Nodes)协同工作,存储数据、提供搜索、提供高可用能力的逻辑整体。

一个集群由:

  • cluster name(必须一致)
  • 一个或多个节点
  • 索引(index) + 分片(shard)
  • 主节点(master)管理集群元数据
  • data 节点存储数据

2. ElasticSearch 节点类型(非常关键)

节点角色类型 ⭐

从 ES 7.x 以后所有节点「默认全角色」,但生产必须拆分。

角色 功能 是否建议独立
master 元数据、集群管理、分片调度 ✅ 强烈建议独立 3 节点
data 存储 + 搜索 + 聚合 ✅ 数据量大时需要多节点
data_hot 热数据写入 ✅ 热数据分层场景
data_warm/cold 冷数据存储 ✅ ILM
coordinating-only 负责 query 分发、合并结果 可选
ingest pipeline 预处理 可选

集群推荐结构(常用三种)

小规模(< 3TB)

  • 3 个 Master + Data 混部(最低可用)

中等规模(3TB ~ 30TB)

  • 3 Master
  • 6–12 Data 节点
  • 1–3 Coordinating Nodes

大规模(30TB+)

  • 3 Dedicated Master
  • N Hot Nodes
  • N Warm Nodes
  • N Coordinating Nodes

3. 集群核心机制

3.1 分片(Shard) ⭐

每个索引会被切成多个 Primary Shard(主分片)Replica Shard(副本)

如:

indexA: 5 主分片,每个 1 副本 -> 共 10 分片

3.2 路由机制(Routing) ⭐

ElasticSearch 用以下方式定位文档属于哪个分片:

shard = hash(_id) % number_of_primary_shards

特点:

  • 主分片数量 索引创建后不能修改
  • 扩容只能通过创建新索引 + Reindex

3.3 复制机制(Replication) ⭐

副本分片用于:

  • 高可用
  • 读扩展

同一个主分片的副本绝不会落在同一个节点

3.4 主节点选举 ⭐

ES 使用 Zen2 算法(Raft 变种)进行选举。

必须:

  • 至少 3 个 Master 节点
  • discovery.seed_hosts 配置正确

否则会产生 master flapping(主节点震荡)。

3.5 跨节点通信 ⭐

  • 9300 端口用于节点间通信
  • 9200 用于 REST API

若 9300 被防火墙阻挡 -> 节点无法加入集群。

4. 集群扩容缩容机制

4.1 扩容(增加节点) ⭐

新增 data 节点 -> 自动触发分片重分配。

必须确认:

  • cluster.routing.allocation.enable = all

否则可能不分配分片。

4.2 缩容(减少节点) ⭐

需要先:

PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.exclude._name": "node-01"
  }
}

数据迁走后再关节点。

5. 集群健康(health)状态

状态 含义 原因
🟢 Green 主 + 副本全部 ok 集群健康
🟡 Yellow 主分片 ok,副本未分配 节点不足 / 磁盘不足
🔴 Red 主分片不可用 数据丢失风险、节点崩溃

排查命令:

GET /_cluster/allocation/explain

6. 集群监控的关键指标(必须监控)

6.1 节点级

  • heap.percent < 75%
  • CPU < 70%
  • load5 < CPU 核心数
  • fs.disk_usage < 90%

6.2 分片级

  • unassigned_shards = 0
  • relocating_shards < 5%

6.3 索引级

  • segment count
  • indexing latency
  • query latency

推荐监控工具:

  • Elastic Stack(Kibana)
  • Grafana + ES Exporter
  • Prometheus

7. 集群最佳实践(重中之重)

(1) Master 最小 3 个(奇数) ⭐

node.roles: ["master"]

(2) 不要混用 master 和 data(中大型集群必须分离)

(3) 规划分片数量(最常见的错误) ⭐

每个分片大小 20GB~50GB 最佳

估算:

分片数量 = 数据总量 / 每分片大小

(4) 关闭自动创建索引 ⭐

避免垃圾索引撑爆集群:

PUT _cluster/settings
{
  "persistent": {
    "action.auto_create_index": "false"
  }
}

(5) 不要开启 swap ⭐

bootstrap.memory_lock: true

(6) JVM 不要超过 31GB(因为压缩指针) ⭐

  • heap = 物理内存 50%
  • 最大 31GB

8. 典型集群架构方案(可直接用)

🔥 方案 A:中型业务(推荐)

10 节点

节点 数量 配置
Master 3 4C16G
Data Hot 4 16C64G
Data Warm 2 16C64G
Coordinating 1 4C16G

适合:日志、业务搜索、订单系统。

🔥 方案 B:企业级日志集群(ELK)

25 节点

  • 3 Master
  • 10 Hot
  • 6 Warm
  • 6 Cold
  • Coordinating 2

使用 ILM 管理冷热数据。

9. 如何判断集群需要扩容?

当出现以下任意情况要扩容:

  • heap > 75%
  • 磁盘 > 80%
  • 查询 P99 > 1s
  • 分片数 > 节点数 × 25
  • 写入速率达不到要求