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