📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

在部署 INFINI Easysearch 分布式集群时,初学者往往认为所有节点都是平等的:它们都存储数据,都能响应请求。但实际上,Easysearch 内部有着严格的等级制度和分工。

在一个繁忙的集群中,虽然成百上千个 Data Node(数据节点) 在卖力地搬运数据、执行计算,但真正掌控全局、维持集群秩序的,往往只是背后默默工作的少数几个节点。

今天我们就来揭秘 Easysearch 集群的“大脑”——Master Node(主节点),以及它是如何确立统治地位的。

1. 什么是 Master Node? #

在 Easysearch 集群中,Master Node 是唯一有权更新“集群状态(Cluster State)”的节点。

集群状态包含什么? #

你可以把集群状态想象成一本“户口簿”或“总账本”,里面记录了:

  • 节点信息:当前有哪些节点在线?
  • 索引元数据:有哪些索引?它们的 Mapping 和 Setting 是什么?
  • 分片路由表:每个索引的分片(Shard)究竟分布在哪个节点的哪块硬盘上?

Master 的核心职责: #

  1. 创建/删除索引:当你发起 PUT /index 请求时,最终必须由 Master 批准并更新元数据。
  2. 跟踪节点状态:如果有节点宕机,Master 负责将其踢出集群,并触发分片重平衡(Rebalance)。
  3. 分配分片:决定新创建的索引分片应该放在哪里。

注意:Master 节点通常不参与文档级别的索引(Index)和搜索(Search)操作。这意味着,即使你的搜索流量把数据节点压垮了,只要 Master 节点安然无恙,集群的拓扑结构就是稳定的。

2. 谁来当 Master?(选举机制) #

Easysearch 集群并不是只有一台 Master,否则一旦这台机器断电,整个集群就瘫痪了。
为了高可用,我们通常配置多个 Master-eligible(候选主节点)

选举流程 #

当集群启动或当前 Master 挂掉时,所有候选节点会发起一场投票:

  1. 候选节点相互通信(Zen Discovery)。
  2. 根据特定算法(通常是 ID 大小或资格),推举出一个临时领袖。
  3. 如果这个领袖得到了**法定票数(Quorum)**的支持,它就正式成为 Active Master(现任主节点)
  4. 其他候选节点进入“待命”状态,同步集群状态,随时准备接班。

3. 致命隐患:脑裂(Split Brain) #

在分布式系统中,最可怕的不是节点宕机,而是网络分区

假设你有 2 个候选主节点(Node A 和 Node B),没有其他约束。

  • 突然网络故障,A 和 B 之间的网线断了,但它们都能连接数据节点。
  • Node A 认为 B 挂了,自己宣布自己是 Master。
  • Node B 认为 A 挂了,自己也宣布自己是 Master。
  • 结果:集群分裂成两个,也就是“脑裂”。
  • 后果:数据分别写入两个集群,产生不可逆的数据冲突和丢失。

解决方案:法定票数(Quorum) #

Easysearch 遵循分布式系统的黄金法则:(N / 2) + 1
即:一个节点想要当选 Master,必须获得超过半数候选节点的投票。

  • 如果是 2 个候选节点:(2/2) + 1 = 2 票。如果断网,各自只有 1 票,谁也当不了 Master,集群停止服务(保护数据安全)。
  • 如果是 3 个候选节点:(3/2) + 1 = 2 票。如果断网,拥有 2 个节点的那一侧会选出 Master,继续服务;落单的那 1 个节点会自我封锁。

最佳实践结论:永远配置奇数个(通常是 3 个)Master-eligible 节点。

4. 实战:节点角色配置最佳实践 #

easysearch.yml 中,我们可以通过 node.roles 来定义节点的身份。

场景一:小型集群(< 5 个节点) #

对于开发环境或小规模生产环境,为了节省成本,节点可以身兼数职。

# 既是主节点候选人,又负责存数据
node.roles: [master, data, ingest]

场景二:中大型集群(> 10 个节点) #

这是企业级生产环境的标准配置。强烈建议职责分离

1. 专用主节点(Dedicated Master) x 3
只负责管理,不存数据,不处理繁重的搜索请求。配置低 CPU、低内存、小磁盘即可。

node.roles: [master]
# 优点:不会因为复杂的聚合查询导致内存溢出(OOM),从而拖垮整个集群的管理。

2. 数据节点(Data Node) x N
只负责干苦力(存储和计算)。

node.roles: [data, ingest]

3. 仅投票节点(Voting-only Node)
Easysearch 的一种特殊角色。
如果你只有 2 台高性能机器做 Master,又不想买第 3 台机器,可以找一台配置极低的机器做“仅投票节点”。它只参与凑票数防止脑裂,永远不会被选为 Master。

node.roles: [master, voting_only]

5. 总结 #

在 Easysearch 集群中:

  1. Master Node 是“大脑”,掌管元数据和集群状态,不负责具体的数据搬运。
  2. 为了防止“脑裂”导致的灾难性后果,请务必准备 3 个 候选主节点。
  3. 随着业务增长,一定要将 Master 角色和 Data 角色物理分离。这是保证 Easysearch 集群在高负载下依然“稳如泰山”的最重要秘诀。

理解了这一点,你就迈出了从“会用”到“精通” Easysearch 架构运维的关键一步。