历史记录保留
edit历史保留
editElasticsearch 有时需要重放一些在分片上执行的操作。例如,如果一个副本短暂离线,那么重放它在离线期间错过的少量操作,可能比从头开始重建它更高效。同样,跨集群复制通过在主集群上执行操作,然后在从集群上重放这些操作来工作。
在Lucene级别,Elasticsearch对索引执行的写操作实际上只有两种:可以索引新文档,或者可以删除现有文档。更新是通过原子地删除旧文档然后索引新文档来实现的。已经索引到Lucene中的文档已经包含了重放该索引操作所需的所有信息,但对于文档删除来说并非如此。为了解决这个问题,Elasticsearch使用了一个名为软删除的功能来保留Lucene索引中的最近删除,以便它们可以被重放。
Elasticsearch 只在索引中保留某些最近删除的文档,因为软删除的文档仍然占用一些空间。最终,Elasticsearch 会完全丢弃这些软删除的文档以释放空间,从而使索引不会随着时间的推移变得越来越大。幸运的是,Elasticsearch 不需要能够重放曾经在分片上执行的每一个操作,因为始终可以在远程节点上制作分片的全量副本。然而,复制整个分片可能比重放一些缺失的操作花费更长的时间,因此 Elasticsearch 会尝试保留它预计将来需要重放的所有操作。
Elasticsearch 使用一种称为 分片历史保留租约 的机制来跟踪它预期在未来需要重放的操作。每个可能需要重放操作的分片副本必须首先为自己创建一个分片历史保留租约。例如,这个分片副本可能是一个分片的副本,或者在使用跨集群复制时,它可能是一个追随者索引的分片。每个保留租约都会跟踪相应分片副本尚未接收到的第一个操作的序列号。当分片副本接收到新的操作时,它会增加其保留租约中包含的序列号,以表明它将来不需要重放这些操作。一旦软删除的操作不再被任何保留租约持有,Elasticsearch 就会丢弃它们。
如果一个分片副本失败,它将停止更新其分片历史保留租约,这意味着Elasticsearch将保留所有新操作,以便在失败的分片副本恢复时可以重放这些操作。然而,保留租约仅持续有限的时间。如果分片副本没有足够快地恢复,其保留租约可能会过期。这保护了Elasticsearch,使其在分片副本永久失败的情况下不会永久保留历史记录,因为一旦保留租约过期,Elasticsearch可以再次开始丢弃历史记录。如果分片副本在其保留租约过期后恢复,Elasticsearch将回退到复制整个索引,因为它不能再简单地重放丢失的历史记录。保留租约的过期时间默认为12h,这应该足以应对大多数合理的恢复场景。
历史保留设置
edit-
index.soft_deletes.enabled -
[7.6.0]
在7.6.0中已弃用。创建禁用软删除的索引已被弃用,并将在未来的Elasticsearch版本中移除。
指示索引上是否启用了软删除。软删除只能在索引创建时配置,并且只能在Elasticsearch 6.5.0或更高版本创建的索引上配置。默认为
true。 -
index.soft_deletes.retention_lease.period -
在分片历史保留租约被视为过期之前保留的最大期限。分片历史保留租约确保在Lucene索引合并期间保留软删除。如果软删除在可以复制到跟随者之前被合并掉,由于领导者上的历史记录不完整,后续过程将失败。默认为
12h。