历史保留编辑

Elasticsearch 有时需要重放对分片执行的一些操作。例如,如果副本短暂脱机,则重放它脱机时错过的少量操作可能比从头开始重建它更有效。类似地,跨集群复制通过在领导者集群上执行操作,然后在跟随者集群上重放这些操作来工作。

在 Lucene 级别,Elasticsearch 对索引执行的写入操作实际上只有两种:可以索引新文档,或者可以删除现有文档。更新通过原子地删除旧文档,然后索引新文档来实现。索引到 Lucene 的文档已经包含重放该索引操作所需的所有信息,但删除文档并非如此。为了解决这个问题,Elasticsearch 使用了一个名为 *软删除* 的功能来保留 Lucene 索引中的最近删除,以便可以重放它们。

Elasticsearch 仅保留索引中某些最近删除的文档,因为软删除的文档仍然占用一些空间。最终,Elasticsearch 将完全丢弃这些软删除的文档以释放该空间,以便索引不会随着时间的推移而变得越来越大。幸运的是,Elasticsearch 不需要能够重放曾经对分片执行的每个操作,因为它始终可以创建分片在远程节点上的完整副本。但是,复制整个分片可能比重放一些丢失的操作花费更长时间,因此 Elasticsearch 尝试保留它预计将来需要重放的所有操作。

Elasticsearch 使用一种称为 *分片历史保留租约* 的机制来跟踪它预计将来需要重放的操作。每个可能需要重放操作的分片副本必须首先为自己创建一个分片历史保留租约。例如,此分片副本可能是分片的副本,或者可能是使用跨集群复制时跟随者索引的分片。每个保留租约跟踪相应分片副本未接收到的第一个操作的序列号。当分片副本接收新操作时,它会增加其保留租约中包含的序列号,以表明它将来不需要重放这些操作。Elasticsearch 在任何保留租约不再持有软删除操作时丢弃它们。

如果分片副本失败,它将停止更新其分片历史保留租约,这意味着 Elasticsearch 将保留所有新操作,以便在失败的分片副本恢复时可以重放它们。但是,保留租约的有效期有限。如果分片副本没有及时恢复,则其保留租约可能会过期。这可以保护 Elasticsearch 免于在分片副本永久失败时永远保留历史记录,因为一旦保留租约过期,Elasticsearch 就可以开始再次丢弃历史记录。如果分片副本在保留租约过期后恢复,则 Elasticsearch 将回退到复制整个索引,因为它不再能够简单地重放丢失的历史记录。保留租约的到期时间默认为 12h,这对于大多数合理的恢复场景来说应该足够长。

历史保留设置编辑

index.soft_deletes.enabled
[7.6.0] 在 7.6.0 中弃用。创建禁用软删除的索引已弃用,将在未来的 Elasticsearch 版本中删除。 指示索引上是否启用了软删除。软删除只能在索引创建时配置,并且只能在 Elasticsearch 6.5.0 或之后创建的索引上配置。默认为 true
index.soft_deletes.retention_lease.period
在分片历史保留租约被视为过期之前保留它的最长时间。分片历史保留租约确保在 Lucene 索引上的合并期间保留软删除。如果软删除在可以复制到跟随者之前被合并掉,则以下过程将由于领导者上的历史记录不完整而失败。默认为 12h