发布集群状态

编辑

选出的主节点是集群中唯一可以对集群状态进行更改的节点。选出的主节点一次处理一批集群状态更新,计算所需的更改并将更新后的集群状态发布到集群中的所有其他节点。每次发布都从选出的主节点向集群中的所有节点广播更新后的集群状态开始。每个节点都会以确认响应,但尚未应用新接收的状态。一旦选出的主节点从足够多的主节点候选节点收集到确认,新的集群状态就被认为是已提交的,并且主节点广播另一个消息指示节点应用现在已提交的状态。每个节点接收此消息,应用更新后的状态,然后向主节点发送第二个确认。

选出的主节点允许每个集群状态更新在完全发布到所有节点之前花费有限的时间。它由cluster.publish.timeout设置定义,默认为30s,从发布开始时计算。如果在新的集群状态提交之前达到此时间,则集群状态更改将被拒绝,并且选出的主节点认为自己已失败。它会退出并开始尝试选举新的主节点。

如果新的集群状态在cluster.publish.timeout超时之前已提交,则选出的主节点认为更改已成功。它等待超时时间到期或直到它收到确认,确认集群中的每个节点都已应用更新后的状态,然后开始处理和发布下一个集群状态更新。如果一些确认尚未收到(即某些节点尚未确认它们已应用当前更新),则这些节点被称为滞后,因为它们的集群状态落后于选出的主节点的最新状态。选出的主节点等待滞后节点进一步赶上cluster.follower_lag.timeout时间,默认为90s。如果在此时间内节点仍未成功应用集群状态更新,则认为它已失败,并且选出的主节点将其从集群中移除。

集群状态更新通常作为对先前集群状态的差异发布,这减少了发布集群状态更新所需的时间和网络带宽。例如,当仅更新集群状态中一部分索引的映射时,只要这些节点具有先前的集群状态,就只需要将这些索引的更新发布到集群中的节点。如果某个节点缺少先前的集群状态,例如在重新加入集群时,选出的主节点将向该节点发布完整的集群状态,以便它可以接收未来的更新作为差异。

Elasticsearch 是一个基于对等系统的系统,其中节点直接相互通信。高吞吐量 API(索引、删除、搜索)通常不与选出的主节点交互。选出的主节点的职责是维护全局集群状态,其中包括在节点加入或离开集群时重新分配分片。每次更改集群状态时,都会如上所述将新状态发布到集群中的所有节点。

集群状态更新的性能特征是每个主节点候选节点存储速度以及集群中所有节点之间网络互连的可靠性和延迟的函数。因此,您必须确保集群中节点可用的存储和网络足够好,以满足您的性能目标。