1. 大规模索引架构总览

当数据量从百万级文档增长到数十亿、上百亿文档时,Elasticsearch 的部署形态会发生根本性变化。单机时代“装好即用”的思路不再成立,取而代之的是一套围绕分片、角色分工、生命周期和容量规划构建的分布式架构。本节从核心概念出发,逐步展开集群角色分工、索引生命周期管理,以及大规模场景下的架构设计原则,为后续章节的性能优化打下结构基础。

一、分布式索引的三个核心概念

理解 Elasticsearch 的分布式索引,首先要抓住三个概念:分片(Shard)、副本(Replica)和路由(Routing)。

索引在逻辑上是一个整体,但在物理上被切分为若干个主分片。每个主分片是一个独立的 Lucene 索引,可以独立写入、独立检索。副本是主分片的拷贝,既承担读请求分流,也在主分片所在节点故障时被提升为新的主分片。路由则决定了文档写入哪个分片:默认使用文档 _id 的哈希值对主分片数取模,公式为 shard = hash(_id) % number_of_primary_shards。这也解释了为什么主分片数在索引创建后不能随意修改——一旦改变,所有文档的路由位置都会失效。

一个常见的容量估算示例:假设单分片建议控制在 30~50 GB,某业务每日新增 200 GB 原始数据,经索引膨胀系数约 1.1 后约为 220 GB,保留 30 天则总数据量约 6.6 TB。按每分片 40 GB 计算,需要约 165 个主分片。若集群有 10 个数据节点,则平均每节点承载约 16~17 个主分片,再叠加 1 个副本,每节点约 33 个分片。这个数量级在中等规模集群中是可接受的,但如果继续增长,就需要引入分层架构和生命周期管理。

Elasticsearch 分布式索引架构总览 客户端 / 应用 写入 / 查询请求 协调节点 Coordinating 路由转发 · 结果聚合 主节点 Master 集群状态 · 分片分配 数据节点 Data 存储 · 检索 · 聚合 索引 → 主分片 → 副本 分布示意 索引 logs-2024.06(5 主分片 · 1 副本) P0 Node-1 P1 Node-2 P2 Node-3 P3 Node-4 P4 Node-5 R0 → Node-2 R1 → Node-3 R2 → Node-4 R3 → Node-5 R4 → Node-1 索引生命周期(ILM)阶段流转 Hot 高频写入 · 快速检索 Warm 只读 · 合并段 Cold 低频查询 · 可搜索快照 Delete 到期删除 路由公式:shard = hash(_id) % number_of_primary_shards

二、集群角色分工

Elasticsearch 7.x 之后,节点角色被显式拆分,这对大规模集群尤为重要。常见的角色包括:

  • master 节点:负责集群状态管理、索引创建删除、分片分配决策。大规模集群建议配置 3 个专用 master 节点,避免与数据节点混部导致选举抖动。
  • data 节点:存储分片、执行写入和查询。可进一步细分为 data_hot、data_warm、data_cold、data_frozen,配合 ILM 实现数据分层。
  • ingest 节点:执行预处理管道,如字段提取、富化、转换。写入吞吐高时建议独立部署,避免抢占数据节点的 CPU。
  • coordinating 节点:只做请求分发和结果聚合,不存数据、不参与选举。查询并发高时,独立协调节点能显著降低数据节点压力。
  • ml 节点:运行机器学习任务,与数据节点隔离,防止模型训练影响在线检索。

一个典型的大规模集群配置示例:3 个专用 master(4C8G)、6 个 data_hot(16C64G,NVMe SSD)、6 个 data_warm(16C64G,SATA SSD)、3 个 coordinating(8C16G)、2 个 ingest(8C16G)。这种分工让每类节点只做自己最擅长的事,避免资源争抢。

三、索引生命周期管理(ILM)

ILM 把索引从创建到删除的全过程划分为 Hot、Warm、Cold、Delete 四个阶段。每个阶段可以配置不同的操作:

  • Hot:滚动索引(rollover)在分片达到 50 GB 或文档数达到 5 亿时触发,保证单个分片不会无限膨胀。
  • Warm:执行 force merge 将段合并到较少数量,减少文件句柄和内存占用;同时可设置副本数为 1 以节省存储。
  • Cold:将索引迁移到低成本节点,或转为可搜索快照(searchable snapshot),存储成本可下降约 50%。
  • Delete:到期后自动删除,避免人工清理遗漏。

ILM 的价值在于把“什么时候滚动、什么时候合并、什么时候删除”这些决策从人工操作变成策略驱动,在大规模场景下这是维持集群稳定的关键机制。

四、大规模架构设计原则

结合上述概念,大规模索引架构可以归纳为几条原则:

  1. 分片数量与节点数匹配:单节点分片总数建议控制在 20~25 个/GB 堆内存以内,避免分片过多导致集群状态膨胀和查询开销上升。
  2. 冷热分层:Hot 层用高性能 SSD 承载写入和近期查询,Warm/Cold 层用大容量低成本存储承载历史数据,通过 ILM 自动迁移。
  3. 角色隔离:master、data、ingest、coordinating 各司其职,避免单节点承担多种角色导致资源竞争。
  4. 滚动索引 + 别名:写入始终指向别名,rollover 后新索引自动接管,应用无需感知索引切换。
  5. 容量预留:磁盘使用率控制在 85% 以下,为段合并、副本恢复和突发写入留出空间。
在实际规划中,可以先按“日增数据量 × 保留天数 × 膨胀系数”估算总容量,再按单分片 30~50 GB 反推主分片数,最后结合节点数和堆内存校验分片密度是否合理。这个顺序能避免先定分片数再发现节点扛不住的被动局面。