无状态快照现在直接从对象存储读取。发布后,服务端“由于快照导致的不期望分配”警告完全停止。主分片在快照运行时可以自由搬迁,因此集群在负载下扩展时无需等待快照完成。在整个集群中,缓存未命中下降了超过 60%,缓存填充吞吐量中位数提升了约 50%。
在传统的有状态 Elasticsearch 中,快照会将主分片锁定在其活跃节点上,完全阻止搬迁。当集群拓扑稳定且节点在维护窗口之间保持在线时,这样工作良好,但无状态 Elasticsearch 的工作方式不同。索引数据存放在外部对象存储中,本地磁盘作为缓存,集群根据 CPU、内存和数据量自动扩展,包括垂直扩展(节点升级)和水平扩展(增加节点)。
在垂直扩展期间,现有节点必须腾空所有分片并关闭,然后新硬件接管。自 Elasticsearch 8.13 版本起,分片快照可以在节点关闭时暂停,并在搬迁后恢复,因此长时间运行的快照不会阻塞基础设施更新。
水平扩展则是另一回事:没有节点关闭,因此暂停逻辑永远不会触发。新节点闲置,等待现有节点完成其快照,而一旦快照入队,主分片就被锁定在其节点上,严重延迟了搬迁。
集群通常在已经处于高负载时进行扩展。此时阻止分片搬迁限制了集群减轻压力的能力,表现为索引吞吐量下降和延迟升高。资源不平衡还可能触发意外的 自动缩放 行为。即使整体拓扑保持不变,分片锁定也会破坏热点缓解和工作负载分布。这些故障以前表现为服务端警告:“由于快照导致的不期望分配”。
有状态 Elasticsearch | 无状态 Elasticsearch | |
|---|---|---|
快照读取自 | 保存主分片的节点上的本地分片数据 | 对象存储,使用提交记录中的文件位置 |
快照期间的主分片 | 锁定到其节点,直到快照完成 | 随时可自由搬迁 |
对水平扩展的影响 | 新节点等待正在进行的快照完成后才能接管分片 | 新节点立即接管分片,无论快照状态如何 |
分片快照锁定主分片,因为它需要读取本地分片数据。在无状态 Elasticsearch 中,这些数据已经存在于对象存储中,因此无需从本地磁盘读取。让快照直接从对象存储读取,消除了锁定主分片的需求。它们可以自由搬迁,备份与集群平衡解耦。
无状态提交包含对象存储中每个数据文件的位置信息,因此快照可以读取并直接流式传输到快照仓库(一个单独的对象存储桶)。未来,我们计划研究对象存储原生支持的服务端范围拷贝,以完全跳过本地拷贝步骤。
快照绑定到特定的提交点,该提交点决定了要备份哪些文件,并且这些文件必须在操作期间保持可访问。在有状态集群中,这很简单:快照节点和数据节点是同一个,因此提交在本地管理,并保留到完成。
在无状态模型中,快照节点和数据节点可以完全分离,或者如果分片在快照中途搬迁,它们可能会分叉。为了处理这种情况,我们添加了一个传输动作,通过网络在远程数据节点上获取提交。数据节点跟踪哪个提交属于哪个快照,并在集群状态发出完成信号时释放它。
搬迁过程中存在一个微妙之处。静止的分片依赖其提交点来保留文件。搬迁中的分片必须释放其提交,以便其本地存储可以干净关闭。为了在过渡期间保持文件可访问,新恢复的主分片会临时保留对象存储中所有现有的数据文件,直到通过集群状态收到快照完成通知。这既处理了优雅搬迁,也处理了因节点或引擎故障导致的非优雅恢复。
无状态快照上线后,服务端“由于快照导致的不期望分配”警告停止了。下图显示了前后对比,发布点由红色箭头标记。热点缓解变得更加响应,因为分片搬迁不再需要等待备份操作。

缓存使用也得到了改善。绕过本地分片数据的快照不再与索引竞争缓存空间。发布后(图中也有标记),我们在缓存指标中观察到以下两个积极变化:
面向对象存储的原生架构正日益成为云原生数据系统的标准,而无状态快照是朝着在 Elasticsearch 操作中充分利用这一模型迈出的一步。备份从对象存储读取,分片自由移动,两个过程互不等待。移除本地分片依赖关系是进一步模块化无状态架构的一步。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。