ElasticSearch集群架构全解析
一、引言:为什么需要 Elasticsearch 集群?
Elasticsearch 是一个基于 Lucene 的分布式搜索引擎。单节点虽可运行,但在面对以下需求时难以胜任:
- 大规模数据(TB\~PB级)存储与索引;
- 高可用:节点挂掉不影响服务;
- 可扩展性:支持水平扩展读写性能;
- 数据分片、副本容灾。
因此,集群架构成为生产环境中部署 Elasticsearch 的标准形态。
二、核心概念与术语
术语 | 说明 |
---|---|
节点(Node) | 单个 Elasticsearch 实例(Java进程) |
集群(Cluster) | 多个节点组成的整体 |
主节点(Master) | 负责管理集群状态、分片调度 |
数据节点(Data) | 存储实际索引数据 |
协调节点(Coordinator) | 处理用户请求、查询路由、聚合整合 |
索引(Index) | 类似关系型数据库中的“表” |
分片(Shard) | 索引数据的水平拆分单元 |
副本(Replica) | Shard 的冗余副本,用于容灾与负载均衡 |
三、整体架构图解(文字描述)
[协调节点]
|
[主节点] <--> [主节点] <--> [主节点] (选出1个主)
|
+---+---+------------+
| | |
[数据节点1] [数据节点2] ... [数据节点N]
| Shard 0 | Shard 1 | Shard 2 ...
- 协调节点:负责接收请求,分发到各个数据节点。
- 主节点:维护集群元信息,如索引映射、分片位置。
- 数据节点:存储实际数据分片,支持索引与查询。
四、节点类型配置示例
# elasticsearch.yml
node.name: node-1
node.roles: [master, data] # 同时作为主与数据节点
# 常见角色
# master:参与主节点选举
# data:存储索引数据
# ingest:负责预处理(pipeline)
# ml:负责机器学习任务
# coordinating_only(无 roles):仅作为协调器
五、分片与副本机制详解
5.1 分片示意图
索引 my_index(5主分片,1副本)
↓
分布在3个节点上如下:
Node1: shard_0 (primary), shard_3 (replica)
Node2: shard_1 (primary), shard_0 (replica)
Node3: shard_2 (primary), shard_1 (replica)
5.2 分片定义示例
PUT /my_index
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}
建议:
- 主分片数量不可变(除非使用reindex)
- 副本数可动态调整
六、主节点选举机制
6.1 最少节点数
discovery.seed_hosts: ["node1", "node2", "node3"]
cluster.initial_master_nodes: ["node1", "node2", "node3"]
如果集群启动时主节点不到半数,则无法完成选举。
6.2 分裂脑(Split-Brain)问题
若两个主节点同时工作,会导致:
- 索引元信息不一致;
- 分片状态冲突;
- 数据丢失风险。
解决办法:
- 使用奇数个主节点;
- 使用 quorum 策略;
- 推荐设定
minimum_master_nodes = (master_eligible_nodes / 2) + 1
七、集群级别操作示例
7.1 查看节点信息
GET /_cat/nodes?v
7.2 查看索引与分片分布
GET /_cat/shards?v
GET /_cluster/allocation/explain
7.3 查看集群健康状态
GET /_cluster/health
颜色含义:
- green:主分片与副本分片全部正常
- yellow:主分片正常,但部分副本分片未分配
- red:有主分片丢失
八、协调节点(Coordinator Node)详解
8.1 查询路由机制
用户请求 → 协调节点 → 查询请求发往相关分片 → 聚合/汇总 → 返回响应
举例查询:
GET /products/_search
{
"query": {
"match": { "name": "apple" }
}
}
调度过程:
- 协调节点广播查询到每个分片副本;
- 数据节点返回匹配结果;
- 协调节点排序、聚合;
- 返回结果。
九、高可用部署建议
项目 | 建议配置 |
---|---|
主节点数 | 3(奇数) |
数据节点数 | 3\~10+,支持动态扩展 |
协调节点 | 1\~3,支持负载均衡 |
分片数 | 控制在 20 * 节点数 以下 |
副本数 | 1\~2,根据硬盘空间与可用性 |
节点角色分离 | 主/数据/协调三类分离部署,避免资源竞争 |
十、跨集群复制与跨区域架构(简述)
ElasticSearch 提供 CCR(Cross-Cluster Replication)与 CCS(Cross-Cluster Search):
10.1 CCR 跨集群复制
- 一个索引在多个集群间复制
- 用于容灾、跨数据中心同步
10.2 CCS 跨集群搜索
- 查询可同时访问多个集群索引
- 用于全球节点统一视图搜索
配置示例:
cluster.remote.europe-cluster.seeds: ["europe-node:9300"]
十一、集群扩缩容实战
11.1 新增节点
- 准备新服务器,配置
elasticsearch.yml
- 设置
discovery.seed_hosts
指向现有主节点 - 启动后自动加入集群
11.2 分片重分配(rebalance)
POST /_cluster/reroute
或关闭再打开索引触发自动分配:
POST /my_index/_close
POST /my_index/_open
十二、常见问题与调优建议
问题 | 解决建议 |
---|---|
分片太多 | 控制每索引分片数,避免每GB数据使用多个分片 |
主节点不稳定 | 角色隔离 + 优化 JVM 内存 |
查询慢 | 启用 query cache、filter cache、避免高频排序字段 |
写入慢 | 批量写入 + 合理配置 refresh\_interval |
十三、图解总结(文字版)
+-------------------+
| Client Request |
+-------------------+
↓
+-------------------+
| Coordinator Node |
+-------------------+
↓ ↓
+------+ +------+
| Data Node 1 |
| (Shard 0, Replica) |
+------+ +------+
↓
+------+------+
| Master Node |
| (Manages Shard Routing) |
+---------------+
十四、总结
Elasticsearch 集群不仅仅是多个节点简单拼接的集合,它是一套完整的、可扩展的、具备高可用和高性能能力的分布式搜索平台。
通过本文你掌握了:
- 各类节点的职责与配置;
- 分片、副本的存储机制;
- 查询路由与主节点选举;
- 扩缩容与故障处理策略;
- 企业级高可用集群的最佳实践。
评论已关闭