发布集群状态编辑

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

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

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

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

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

集群状态更新的性能特征取决于每个符合主节点条件的节点上的存储速度,以及集群中所有节点之间网络互连的可靠性和延迟。因此,您必须确保集群中节点可用的存储和网络足以满足您的性能目标。