集群状态
Elastic Stack
集群状态是一种内部数据结构,用于跟踪每个节点所需的各种信息,包括:
- 集群中其他节点的身份和属性
- 集群范围的设置
- 索引元数据,包括每个索引的映射和设置
- 集群中每个分片副本的位置和状态
被选出的主节点确保集群中的每个节点都具有相同的集群状态副本。 集群状态 API 允许您检索此内部状态的表示形式,以用于调试或诊断目的。
被选出的主节点是集群中唯一可以更改集群状态的节点。 被选出的主节点一次处理一批集群状态更新,计算所需的更改,并将更新后的集群状态发布到集群中的所有其他节点。 每次发布都从被选出的主节点将更新后的集群状态广播到集群中的所有节点开始。 每个节点都会回复确认,但尚未应用新接收的状态。 一旦被选出的主节点从足够多的符合主节点条件的节点收集到确认,则表示新的集群状态已提交,并且主节点会广播另一条消息,指示节点应用现在已提交的状态。 每个节点收到此消息,应用更新后的状态,然后将第二次确认发送回主节点。
被选出的主节点允许每个集群状态更新在有限的时间内完全发布到所有节点。 它由 cluster.publish.timeout
设置定义,默认为 30s
,从发布开始的时间开始测量。 如果在提交新集群状态之前达到此时间,则拒绝集群状态更改,并且被选出的主节点认为自己已失败。 它将退出并开始尝试选举新的主节点。
如果在 cluster.publish.timeout
过去之前提交了新的集群状态,则被选出的主节点认为更改已成功。 它会等待超时过去或直到它收到集群中每个节点都已应用更新状态的确认,然后开始处理和发布下一个集群状态更新。 如果尚未收到某些确认(即,某些节点尚未确认它们已应用当前更新),则表示这些节点滞后,因为它们的集群状态落后于被选出的主节点的最新状态。 被选出的主节点会等待滞后的节点在更长的时间内赶上,即 cluster.follower_lag.timeout
,默认为 90s
。 如果节点在此时间内仍未成功应用集群状态更新,则认为它已失败,并且被选出的主节点会将其从集群中删除。
集群状态更新通常作为与先前集群状态的差异发布,这减少了发布集群状态更新所需的时间和网络带宽。 例如,当仅更新集群状态中一部分索引的映射时,只要这些节点具有先前的集群状态,就只需要将这些索引的更新发布到集群中的节点。 如果节点缺少先前的集群状态(例如,重新加入集群时),被选出的主节点会将完整的集群状态发布到该节点,以便它可以接收将来的更新作为差异。
Elasticsearch 是一个基于对等点的系统,节点之间直接通信。 高吞吐量 API(索引、删除、搜索)通常不与被选出的主节点交互。 被选出的主节点的责任是维护全局集群状态,包括在节点加入或离开集群时重新分配分片。 每次更改集群状态时,新状态都会如上所述发布到集群中的所有节点。
集群状态更新的性能特征是每个符合主节点条件的节点上的存储速度以及集群中所有节点之间的网络互连的可靠性和延迟的函数。 因此,您必须确保集群中节点可用的存储和网络足以满足您的性能目标。
当节点加入集群时,如果发现其本地数据目录中存储的任何分片在集群状态中尚不存在,则它会将这些分片视为属于“悬挂”索引。 您可以使用 悬挂索引 API 列出、导入或删除悬挂索引。
该 API 不能保证导入的数据是否真正代表索引仍然是集群一部分时数据的最新状态。