2. 集群架构与角色规划

Elasticsearch 集群的性能与稳定性,很大程度上在“节点怎么分工”这一步就已经决定。默认情况下,每个节点都同时承担主节点候选、数据存储、协调转发等职责,小规模时省事,规模一大就会出现主节点被数据写入拖累、协调节点成为瓶颈、批量导入压垮查询等连锁问题。角色分离的本质,是把不同性质的负载放到不同节点上,让每类节点只做自己擅长的事。

一、节点角色的职责边界

Elasticsearch 7.x 之后通过 node.roles 显式声明角色,常见角色及其职责如下:

  • master(主节点候选):负责集群状态管理——创建/删除索引、分片分配、节点上下线、映射变更等元数据操作。它不存储业务数据,也不处理搜索和写入请求。主节点是集群的“大脑”,一旦被数据负载拖慢,整个集群的元数据操作都会卡住。
  • data(数据节点):存储分片、执行文档的索引与检索、参与分片恢复和段合并。这是资源消耗最大的角色,CPU、内存、磁盘 IO 都集中在这里。
  • data_content / data_hot / data_warm / data_cold:数据节点的细分角色,配合 ILM(索引生命周期管理)实现冷热分层。热层用 SSD 承载高频写入查询,温冷层用大容量 HDD 存放历史数据。
  • ingest(预处理节点):在文档真正写入索引前执行 ingest pipeline,完成字段解析、grok 提取、时间戳转换、富化等。它消耗 CPU,尤其是正则和脚本处理。
  • coordinating(协调节点):不承担主节点、数据、ingest 角色,只负责接收客户端请求、把请求分发到相关分片、汇总各分片结果并返回。它相当于查询的“汇聚层”。
  • ml、transform、remote_cluster_client:分别用于机器学习、转换任务和跨集群检索,按需启用。

需要强调:协调节点不是一个可以显式声明的角色,而是“不承担其他角色”的节点自然形成的定位。任何节点都会参与请求转发,但只有把主、数据、ingest 都剥离后,它才成为专职协调节点。

二、主节点与数据节点为什么要分离

主节点候选数量应满足“奇数且至少 3 个”的法定人数要求,推荐 3 个专用主节点,避免 2 个(无法形成多数派)或过多(选举开销上升)。专用主节点配置可以很低:2~4 vCPU、4~8 GB 堆内存即可,但网络必须稳定、延迟低,因为它们之间要频繁同步集群状态。

数据节点则相反,需要大内存、多核 CPU 和高速磁盘。把主节点和数据节点混在一起,风险在于:一次大规模写入或段合并会占满 CPU 和 IO,导致主节点心跳超时、集群状态发布延迟,严重时触发重新选举,出现“脑裂”式的服务抖动。因此生产集群普遍采用专用主节点 + 专用数据节点的组合。

三、协调节点与 ingest 节点的选型

协调节点的价值在查询密集场景最明显。一个搜索请求会打到多个分片,协调节点负责扇出(scatter)和汇聚(gather)。如果协调节点同时还是数据节点,它既要处理自己的分片查询,又要汇总其他节点的结果,容易在高峰期成为瓶颈。专用协调节点建议配置高 CPU 和较大堆内存(因为要缓存和合并大量分片结果),一般 8~16 vCPU、16 GB 堆内存起步,数量根据并发查询量横向扩展。

ingest 节点的选型取决于 pipeline 复杂度。如果只是简单的 set、rename 处理器,开销很小,可以和数据节点合并;如果使用 grok 正则、脚本、enrich 富化,CPU 消耗显著,建议独立部署,避免拖慢数据节点的索引和查询。一个实用的判断方法是:观察 ingest pipeline 的 current 指标和节点 CPU,如果 ingest 耗时占写入链路比例超过 20%,就应考虑拆分。

典型生产集群角色拓扑(3 主 + 3 协调 + 热/温数据层 + ingest) 客户端 / Kibana 写入 & 查询请求 协调节点层(coordinating only) coord-1 coord-2 coord-3 专用主节点(3 个) 集群状态 / 分片分配 2~4 vCPU · 4~8 GB 堆 ingest 节点(可选) grok / enrich / 脚本 CPU 密集 · 按 pipeline 扩展 数据节点层(data_content / data_hot / data_warm) 热层 data_hot SSD · 高频写入与查询 hot-1 hot-2 主分片 + 副本分片 温层 data_warm 大容量 HDD · 历史数据 warm-1 warm-2 ILM 自动迁移 元数据操作 写入预处理 查询扇出 / 结果汇聚 写入文档 分片分配指令 角色分离后:主节点不被数据负载拖累,协调节点专注汇聚,ingest 与数据写入解耦,热温分层控制存储成本

四、典型集群拓扑与容量影响

下面给出三种常见规模下的拓扑参考,均为示例配置,实际需按数据量、QPS 和 SLA 调整:

规模节点构成适用场景容量影响
小型(≤ 3 节点)3 个节点,主+数据+协调合一开发测试、日志量 < 50 GB/天角色混布,主节点易受写入影响,扩展性差
中型(6~10 节点)3 专用主 + 3~5 数据 + 2 协调生产日志、中等业务检索主节点稳定,协调层可横向扩展,数据层按磁盘扩容
大型(20+ 节点)3 专用主 + 热/温/冷数据层 + 3+ 协调 + 独立 ingest高并发检索、PB 级数据、冷热分层各层独立扩展,成本可控,故障域隔离清晰

角色分离对容量的影响体现在几个方面。第一,专用主节点不存数据,会“浪费”少量资源,但换来集群状态稳定,这是值得的。第二,协调节点不存数据,需要额外机器,但能显著提升查询吞吐,尤其在高并发聚合场景。第三,热温分层让热层用少量 SSD 承载高频数据,温层用廉价大容量盘存历史,整体存储成本可下降 40%~60%。第四,分片数量与数据节点数量要匹配:每个数据节点建议承载 20~50 个分片(含副本),分片过多会加重主节点和协调节点的元数据与汇聚负担。

一个实用的容量估算示例:假设每天新增 100 GB 原始日志,副本数 1,保留 30 天,则热层需承载约 100 GB × 2(副本)× 7 天 ≈ 1.4 TB,温层承载剩余 23 天约 4.6 TB。按单节点 2 TB 可用 SSD 计算,热层至少 1 个节点(建议 2 个保证副本分布),温层至少 3 个节点。这只是粗略估算,实际还要考虑段合并临时空间和预留 20% 余量。

五、配置落地要点

在 elasticsearch.yml 中显式声明角色,避免默认全角色带来的耦合:

# 专用主节点
node.roles: [ master ]
node.name: master-1

# 专用数据节点(热层)
node.roles: [ data_hot, data_content ]
node.name: hot-1

# 专用协调节点
node.roles: [ ]
node.name: coord-1

# 专用 ingest 节点
node.roles: [ ingest ]
node.name: ingest-1

注意 node.roles: [ ] 表示该节点不承担任何显式角色,即专职协调节点。主节点候选数量必须为奇数,且 discovery.seed_hosts 和 cluster.initial_master_nodes 要正确配置,否则集群无法稳定选主。角色调整后需要重启节点,且要确保数据分片有足够副本,避免重启期间数据不可用。

不要在主节点上启用 data 角色,也不要在数据节点上启用 master 角色(除非是 3 节点以内的小集群且明确接受风险)。角色混布是生产环境最常见的性能隐患之一。

总结来说,角色规划的核心逻辑是:让主节点只做决策、数据节点只做存储与计算、协调节点只做汇聚、ingest 节点只做预处理。规模越大,这种分离带来的收益越明显;规模很小时可以适度合并,但必须清楚合并的代价在哪里。拓扑设计没有唯一答案,关键是让每类负载都有明确的承载者,并且能够独立扩展。