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集群架构:

  1. 集群由多个节点组成
  2. 节点角色决定功能职责
  3. 集群状态反映健康程度
  4. 合理配置防止脑裂
  5. 根据规模规划集群
  6. 专用节点提高稳定性

下一步,我们将学习分片管理。

最后更新:2026-03-27