Elasticsearch集群架构 #
一、集群概述 #
1.1 集群概念 #
text
Elasticsearch集群
├── 一个或多个节点组成
├── 集群名称唯一标识
├── 自动发现和加入节点
└── 数据自动分布和均衡
1.2 集群架构图 #
text
集群架构
┌─────────────────────────────────────────────┐
│ Cluster: production │
├─────────────┬─────────────┬─────────────────┤
│ Node-1 │ Node-2 │ Node-3 │
│ (Master) │ (Master) │ (Master) │
│ 候选 │ 候选 │ 候选 │
├─────────────┼─────────────┼─────────────────┤
│ Node-4 │ Node-5 │ Node-6 │
│ (Data) │ (Data) │ (Data) │
├─────────────┼─────────────┼─────────────────┤
│ Node-7 │ Node-8 │ │
│ (Coordinat) │ (Coordinat) │ │
└─────────────┴─────────────┴─────────────────┘
二、节点类型 #
2.1 节点角色 #
| 角色 | 配置值 | 功能 |
|---|---|---|
| master | master | 主节点候选,管理集群状态 |
| data | data | 数据节点,存储和搜索数据 |
| ingest | ingest | 预处理节点,执行管道 |
| coordinating_only | - | 协调节点,路由请求 |
| ml | ml | 机器学习节点 |
| remote_cluster_client | remote_cluster_client | 远程集群客户端 |
2.2 配置节点角色 #
主节点:
yaml
node.roles: [master]
数据节点:
yaml
node.roles: [data]
主+数据节点:
yaml
node.roles: [master, data]
协调节点:
yaml
node.roles: []
数据内容节点:
yaml
node.roles: [data_content]
热数据节点:
yaml
node.roles: [data_hot]
温数据节点:
yaml
node.roles: [data_warm]
冷数据节点:
yaml
node.roles: [data_cold]
2.3 节点角色详解 #
Master节点:
text
Master节点职责
├── 集群状态管理
│ ├── 创建/删除索引
│ ├── 节点加入/离开
│ └── 分片分配
├── 避免数据节点角色
│ └── 减轻负担
└── 建议数量
└── 3个(奇数)
Data节点:
text
Data节点职责
├── 存储数据
├── 执行搜索和聚合
├── 执行CRUD操作
└── 建议配置
├── 大内存
├── SSD存储
└── 多核CPU
Coordinating节点:
text
Coordinating节点职责
├── 请求路由
├── 结果聚合
├── 查询缓存
└── 建议场景
├── 高并发查询
└── 复杂聚合
三、集群状态 #
3.1 集群健康状态 #
| 状态 | 含义 | 说明 |
|---|---|---|
| Green | 健康 | 所有分片正常分配 |
| Yellow | 警告 | 主分片正常,副本未分配 |
| Red | 故障 | 部分主分片未分配 |
3.2 查看集群健康 #
bash
GET /_cluster/health
响应:
json
{
"cluster_name": "production",
"status": "green",
"timed_out": false,
"number_of_nodes": 6,
"number_of_data_nodes": 3,
"active_primary_shards": 30,
"active_shards": 60,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0,
"delayed_unassigned_shards": 0,
"number_of_pending_tasks": 0,
"number_of_in_flight_fetch": 0,
"task_max_waiting_in_queue_millis": 0,
"active_shards_percent_as_number": 100.0
}
3.3 查看集群状态 #
bash
GET /_cluster/state
3.4 查看节点信息 #
bash
GET /_cat/nodes?v
GET /_nodes/stats
四、集群发现 #
4.1 发现机制 #
text
发现机制
├── Zen Discovery
│ ├── 单播发现
│ └── 多播发现(已废弃)
├── 配置
│ ├── discovery.seed_hosts
│ └── cluster.initial_master_nodes
└── 选举
└── 基于Bully算法
4.2 发现配置 #
yaml
cluster.name: production
discovery.seed_hosts: ["node1", "node2", "node3"]
cluster.initial_master_nodes: ["node1", "node2", "node3"]
4.3 选举配置 #
yaml
discovery.seed_providers: file
discovery.type: zen
五、脑裂问题 #
5.1 脑裂原因 #
text
脑裂原因
├── 网络分区
│ └── 节点间网络断开
├── 节点负载过高
│ └── 响应超时
└── 配置不当
└── 最小主节点数配置错误
5.2 防止脑裂 #
yaml
discovery.zen.minimum_master_nodes: 2
计算公式:(master_eligible_nodes / 2) + 1
5.3 选举超时配置 #
yaml
discovery.zen.fd.ping_timeout: 30s
discovery.zen.fd.ping_retries: 3
discovery.zen.master_election.wait_for_joins_timeout: 30s
六、集群规划 #
6.1 小规模集群 #
text
小规模集群(< 3TB)
├── 3节点
│ └── 每节点: master + data
├── 配置
│ ├── 32GB内存
│ ├── 2TB SSD
│ └── 8核CPU
└── 分片
└── 每索引3主分片
6.2 中等规模集群 #
text
中等规模集群(3-10TB)
├── 3 Master节点
│ └── 16GB内存
├── 6+ Data节点
│ └── 64GB内存, 4TB SSD
└── 2 Coordinating节点
└── 32GB内存
6.3 大规模集群 #
text
大规模集群(> 10TB)
├── 3 Master节点
│ └── 专用主节点
├── 10+ Data节点
│ ├── 热数据节点
│ ├── 温数据节点
│ └── 冷数据节点
├── 3+ Coordinating节点
│ └── 负载均衡
└── 监控节点
└── Kibana + 监控
6.4 容量规划 #
text
容量规划原则
├── 内存
│ ├── 50%给JVM堆
│ └── 50%给Lucene
├── 存储
│ ├── 数据大小 × 1.5
│ └── 预留增长空间
├── 分片
│ ├── 单分片10-50GB
│ └── 每节点< 20分片/GB堆
└── CPU
└── 根据查询复杂度
七、集群操作 #
7.1 滚动重启 #
bash
POST /_cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "primaries"
}
}
POST /_flush/synced
重启节点后:
bash
POST /_cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "all"
}
}
7.2 排除节点 #
bash
PUT /_cluster/settings
{
"persistent": {
"cluster.routing.allocation.exclude._name": "node_to_exclude"
}
}
7.3 集群设置 #
bash
GET /_cluster/settings?include_defaults=true
PUT /_cluster/settings
{
"persistent": {
"cluster.max_shards_per_node": 1000
}
}
八、最佳实践 #
8.1 节点规划 #
text
节点规划建议
├── 专用主节点
│ └── 3个,避免数据角色
├── 数据节点分离
│ ├── 热温冷分离
│ └── 根据访问模式
├── 协调节点
│ └── 高并发场景
└── 监控节点
└── 独立部署
8.2 配置建议 #
text
配置建议
├── 集群名称
│ └── 有意义的名称
├── 发现配置
│ └── 列出所有种子节点
├── 最小主节点数
│ └── 防止脑裂
└── 内存锁定
└── bootstrap.memory_lock: true
九、总结 #
本章介绍了Elasticsearch集群架构:
- 集群由多个节点组成
- 节点角色决定功能职责
- 集群状态反映健康程度
- 合理配置防止脑裂
- 根据规模规划集群
- 专用节点提高稳定性
下一步,我们将学习分片管理。
最后更新:2026-03-27