发布集群状态

编辑

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

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

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

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

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

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