ElasticSearch 集群
内容涵盖:集群架构、节点角色、分片机制、路由、复制、主节点选举、网络、扩容缩容、最佳实践、集群规划方案。
ElasticSearch 集群是 多个节点(Nodes)协同工作,存储数据、提供搜索、提供高可用能力的逻辑整体。
一个集群由:
- cluster name(必须一致)
- 一个或多个节点
- 索引(index) + 分片(shard)
- 主节点(master)管理集群元数据
- data 节点存储数据
从 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
每个索引会被切成多个 Primary Shard(主分片) 和 Replica Shard(副本)
如:
indexA: 5 主分片,每个 1 副本 -> 共 10 分片
ElasticSearch 用以下方式定位文档属于哪个分片:
shard = hash(_id) % number_of_primary_shards
特点:
- 主分片数量 索引创建后不能修改
- 扩容只能通过创建新索引 + Reindex
副本分片用于:
- 高可用
- 读扩展
同一个主分片的副本绝不会落在同一个节点
ES 使用 Zen2 算法(Raft 变种)进行选举。
必须:
- 至少 3 个 Master 节点
- discovery.seed_hosts 配置正确
否则会产生 master flapping(主节点震荡)。
- 9300 端口用于节点间通信
- 9200 用于 REST API
若 9300 被防火墙阻挡 -> 节点无法加入集群。
新增 data 节点 -> 自动触发分片重分配。
必须确认:
- cluster.routing.allocation.enable = all
否则可能不分配分片。
需要先:
PUT _cluster/settings
{
"transient": {
"cluster.routing.allocation.exclude._name": "node-01"
}
}
数据迁走后再关节点。
| 状态 | 含义 | 原因 |
|---|---|---|
| 🟢 Green | 主 + 副本全部 ok | 集群健康 |
| 🟡 Yellow | 主分片 ok,副本未分配 | 节点不足 / 磁盘不足 |
| 🔴 Red | 主分片不可用 | 数据丢失风险、节点崩溃 |
排查命令:
GET /_cluster/allocation/explain
- heap.percent < 75%
- CPU < 70%
- load5 < CPU 核心数
- fs.disk_usage < 90%
- unassigned_shards = 0
- relocating_shards < 5%
- segment count
- indexing latency
- query latency
推荐监控工具:
- Elastic Stack(Kibana)
- Grafana + ES Exporter
- Prometheus
node.roles: ["master"]
每个分片大小 20GB~50GB 最佳
估算:
分片数量 = 数据总量 / 每分片大小
避免垃圾索引撑爆集群:
PUT _cluster/settings
{
"persistent": {
"action.auto_create_index": "false"
}
}
bootstrap.memory_lock: true
- heap = 物理内存 50%
- 最大 31GB
10 节点
| 节点 | 数量 | 配置 |
|---|---|---|
| Master | 3 | 4C16G |
| Data Hot | 4 | 16C64G |
| Data Warm | 2 | 16C64G |
| Coordinating | 1 | 4C16G |
适合:日志、业务搜索、订单系统。
25 节点
- 3 Master
- 10 Hot
- 6 Warm
- 6 Cold
- Coordinating 2
使用 ILM 管理冷热数据。
当出现以下任意情况要扩容:
- heap > 75%
- 磁盘 > 80%
- 查询 P99 > 1s
- 分片数 > 节点数 × 25
- 写入速率达不到要求