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