历史保留

编辑

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