在部署 INFINI Easysearch 分布式集群时,初学者往往认为所有节点都是平等的:它们都存储数据,都能响应请求。但实际上,Easysearch 内部有着严格的等级制度和分工。
在一个繁忙的集群中,虽然成百上千个 Data Node(数据节点) 在卖力地搬运数据、执行计算,但真正掌控全局、维持集群秩序的,往往只是背后默默工作的少数几个节点。
今天我们就来揭秘 Easysearch 集群的“大脑”——Master Node(主节点),以及它是如何确立统治地位的。
1. 什么是 Master Node? #
在 Easysearch 集群中,Master Node 是唯一有权更新“集群状态(Cluster State)”的节点。
集群状态包含什么? #
你可以把集群状态想象成一本“户口簿”或“总账本”,里面记录了:
- 节点信息:当前有哪些节点在线?
- 索引元数据:有哪些索引?它们的 Mapping 和 Setting 是什么?
- 分片路由表:每个索引的分片(Shard)究竟分布在哪个节点的哪块硬盘上?
Master 的核心职责: #
- 创建/删除索引:当你发起
PUT /index请求时,最终必须由 Master 批准并更新元数据。 - 跟踪节点状态:如果有节点宕机,Master 负责将其踢出集群,并触发分片重平衡(Rebalance)。
- 分配分片:决定新创建的索引分片应该放在哪里。
注意:Master 节点通常不参与文档级别的索引(Index)和搜索(Search)操作。这意味着,即使你的搜索流量把数据节点压垮了,只要 Master 节点安然无恙,集群的拓扑结构就是稳定的。
2. 谁来当 Master?(选举机制) #
Easysearch 集群并不是只有一台 Master,否则一旦这台机器断电,整个集群就瘫痪了。
为了高可用,我们通常配置多个 Master-eligible(候选主节点)。
选举流程 #
当集群启动或当前 Master 挂掉时,所有候选节点会发起一场投票:
- 候选节点相互通信(Zen Discovery)。
- 根据特定算法(通常是 ID 大小或资格),推举出一个临时领袖。
- 如果这个领袖得到了**法定票数(Quorum)**的支持,它就正式成为 Active Master(现任主节点)。
- 其他候选节点进入“待命”状态,同步集群状态,随时准备接班。
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 集群中:
- Master Node 是“大脑”,掌管元数据和集群状态,不负责具体的数据搬运。
- 为了防止“脑裂”导致的灾难性后果,请务必准备 3 个 候选主节点。
- 随着业务增长,一定要将 Master 角色和 Data 角色物理分离。这是保证 Easysearch 集群在高负载下依然“稳如泰山”的最重要秘诀。
理解了这一点,你就迈出了从“会用”到“精通” Easysearch 架构运维的关键一步。





