2. Elasticsearch 集群基础:节点角色、集群发现、分片与副本机制回顾

在深入跨集群联邦查询之前,必须重新夯实单集群的核心运行机制。节点角色决定了集群的职责划分,集群发现是节点间通信的基石,而分片与副本则直接决定了数据的分布、可用性与查询性能。本节将逐一回顾这些基础概念,并建立后续章节所需的统一术语体系。

2.1 节点角色与职责划分

Elasticsearch 集群中的每个节点可以承担一个或多个角色。角色决定了节点在集群中承担的任务类型。合理配置角色可以隔离资源、提升稳定性。

角色名称 配置项 核心职责 典型场景
主节点 (Master) node.roles: [ master ] 管理集群元数据、创建/删除索引、分配分片、维护集群状态 小集群 3 台专用主节点,避免脑裂
数据节点 (Data) node.roles: [ data ] 存储分片数据、执行 CRUD、搜索与聚合操作 承载大部分磁盘 I/O 和 CPU 负载
协调节点 (Coordinating) node.roles: [](空列表) 接收客户端请求、分发到数据节点、合并结果返回 作为负载均衡层,不存储数据
Ingest 节点 node.roles: [ ingest ] 在索引前执行数据预处理管道(如字段转换、去重) 日志清洗、字段标准化
机器学习节点 (ML) node.roles: [ ml ] 运行机器学习任务(异常检测、数据帧分析) 需要独立计算资源的 ML 作业
远程集群客户端 (Remote Cluster Client) cluster.remote.connect 相关配置 在联邦查询中扮演网关,连接远程集群 跨集群搜索的桥梁节点
生产建议: 中型以上集群(≥10 节点)应至少配置 3 台专用主节点(node.roles: [ master ]),数据节点不参与主节点选举,协调节点独立部署以隔离查询压力。联邦查询场景下,协调节点通常也承担远程集群客户端的角色。

2.2 集群发现机制

集群发现(Discovery)是节点间相互识别、选举主节点、维护集群拓扑的核心过程。Elasticsearch 默认使用基于种子节点的发现方式。

2.2.1 发现流程

  1. 种子节点探测: 节点启动后读取 discovery.seed_hosts 列表,尝试连接这些已知节点。
  2. 主节点选举: 使用 Zen Discovery 或基于协调的选举算法,从具有主节点资格的节点中选出唯一主节点。
  3. 集群状态同步: 主节点将集群状态(Cluster State)广播给所有节点,节点确认后加入集群。
  4. 故障检测: 主节点定期 ping 其他节点,若节点超时未响应,则将其标记为离线并重新分配其分片。

2.2.2 关键配置参数

参数 默认值 说明
discovery.seed_hosts ["127.0.0.1", "[::1]"] 种子节点地址列表,支持 IP 或主机名
cluster.initial_master_nodes 空列表 首次启动时参与主节点选举的节点列表
discovery.zen.minimum_master_nodes 1 防止脑裂的最小主节点数,推荐公式:(master_eligible_nodes / 2) + 1
discovery.zen.ping_timeout 3s 节点间 ping 超时时间,网络不稳定时可适当调大
脑裂风险: 如果 discovery.zen.minimum_master_nodes 设置过小(例如 1),网络分区时可能同时出现两个主节点,导致集群状态分裂、数据不一致。务必遵循公式计算该值。

2.3 分片与副本机制

分片(Shard)是 Elasticsearch 数据分布的最小单元,副本(Replica)是分片的冗余拷贝。理解两者的关系是优化查询性能和保障数据可靠性的前提。

2.3.1 分片类型与生命周期

  • 主分片 (Primary Shard): 索引创建时指定,每个分片包含索引的一部分数据。主分片数量在索引创建后不可修改。
  • 副本分片 (Replica Shard): 主分片的完整拷贝,用于提高查询吞吐量和数据容错。副本数量可以动态调整。
  • 分片分配: 主节点根据节点负载、磁盘空间、分片分配策略将分片分配到数据节点。
  • 分片恢复: 节点故障或加入时,主节点触发分片迁移或副本复制,确保集群达到预期副本数。

2.3.2 分片与副本的权衡

维度 主分片数多 副本数多 最佳实践
查询性能 并行度提高,但协调开销增加 副本可分担查询负载,提升吞吐 副本数通常设为 1~2,主分片数按数据量预估
写入性能 写入需路由到更多主分片,可能降低吞吐 写入完成后需同步到所有副本,增加延迟 写入密集场景可适当减少副本数(如设为 0 或 1)
磁盘空间 主分片数不影响总数据量 副本数直接翻倍磁盘占用 按 总数据量 × (1 + 副本数) 规划磁盘
容错能力 主分片丢失需从副本恢复 副本数 ≥ 1 时可容忍节点故障 生产环境至少保留 1 个副本

2.3.3 分片分配感知与强制感知

Elasticsearch 支持基于节点属性的分片分配感知(Shard Allocation Awareness),确保主分片和副本分片分布在不同的物理机架、可用区或数据中心,避免单点故障。

# elasticsearch.yml 配置示例
cluster.routing.allocation.awareness.attributes: rack_id
cluster.routing.allocation.awareness.force.rack_id.values: rack1, rack2, rack3

当节点属性 rack_id 的值只有 rack1 和 rack2 时,Elasticsearch 会强制将主分片和副本分片分配到不同的机架,即使某个机架故障,数据仍然可用。

2.4 集群基础架构总览

下图展示了单集群内部节点角色、发现机制与分片副本的协作关系,为后续跨集群联邦查询的架构对比提供基准。

Elasticsearch 单集群基础架构 客户端 / 应用 协调节点 (Coordinating Only) 主节点 (Master) 集群状态管理 / 分片分配 数据节点 1 主分片 P1 / 副本 R2 数据节点 2 主分片 P2 / 副本 R1 集群发现:种子节点探测 → 主节点选举 → 集群状态同步 → 故障检测 分片与副本分布示例(索引 settings: number_of_shards=2, number_of_replicas=1) 主分片 P1 复制 副本 R1 主分片 P2 复制 R2 P1 与 R2 分布在不同的数据节点,P2 与 R1 分布在不同的数据节点,实现故障隔离
核心要点:
  • 主节点不存储数据,只管理集群状态;数据节点不参与主节点选举,专注数据读写。
  • 协调节点是联邦查询的入口,负责将跨集群请求分发到远程集群的数据节点。
  • 分片分配感知是跨可用区部署的关键,联邦查询场景下需确保远程集群的节点属性一致。
  • 副本数越多,查询吞吐越高,但写入延迟和磁盘开销也越大;生产环境建议至少 1 个副本。