强制清除Elasticsearch中已删除的文件

强制执行Elasticsearch删除文档清理
Elasticsearch基于Lucene,文档删除后不会立即从segment中移除,而是被标记为删除。在segment合并时,被删除文档才会真正消失。当需要释放资源时,可以使用 `_optimize` 命令强制合并并删除文档,但该操作需谨慎,可能消耗大量CPU和I/O资源,建议在维护窗口进行。操作期间应暂停读写操作,防止数据丢失。
部署运行你感兴趣的模型镜像

       Elasticsearch是建立在Apache Lucene 基础上的实时分布式搜索引擎,Lucene为了提高搜索的实时性,采用不可再修改(immutable)方式将文档存储在一个个segment中。也就是说,一个segment在写入到存储系统之后,将不可以再修改。那么Lucene是如何从一个segment中删除一个被索引的文档呢?简单的讲,当用户发出命令删除一个被索引的文档#ABC时,该文档并不会被马上从相应的存储它的segment中删除掉,而是通过一个特殊的文件来标记该文档已被删除。当用户再次搜索到#ABC时,Elasticsearch在segment中仍能找到#ABC,但由于#ABC文档已经被标记为删除,所以Lucene会从发回给用户的搜索结果中剔除#ABC,所以给用户感觉的是#ABC已经被删除了。

       Elasticseach会有后台线程根据Lucene的合并规则定期进行segment merging合并操作,一般不需要用户担心或者采取任何行动。被删除的文档在segment合并时,才会被真正删除掉。在此之前,它仍然会占用着JVM heap和操作系统的文件cache等资源。在某些情况下,我们需要强制Elasticsearch进行segment merging,已释放其占用的大量系统资源。

       POST /{index}/_optimize?only_expunge_deletes=true&wait_for_completion=true 

_optimize命令可强制进行segment合并,并删除所有标记为删除的文档。Segment merging要消耗CPU,以及大量的I/O资源,所以一定要在你的ElasticSearch集群处于维护窗口期间,并且有足够的I/O空间的(如:SSD)的条件下进行;否则很可能造成集群崩溃和数据丢失。

       下图展示了我们在进行强制expunge时,所观察到的CPU和磁盘I/O的使用情况。该集群运行在微软的Azure云平台IaaS虚拟机上,所有的数据节点都采用 D13 虚拟机,数据存储在本地的SSD磁盘中。该集群是一个备份集群,为了保证合并顺利进行,在此期间暂停了所有对其进行的写操作,仅有少量的读操作。这里需要注意: expunge操作是一种不得已而为之的操作,即在Elasticsearch不能有效自动清除删除文件的情况下才执行该操作。同时建议在此操作期间,最好停止对集群的所有读/写操作,并暂停止shard的自动分配 (cluster.routing.allocation.enable= none),以防有节点被踢出后shard自动分配造成的数据丢失。



       下面两个设置可以用于控制清除时的处理速度,其中给出值是默认值,可以根据需求进行调整,具体请参见Merge。此外, 还可以临时将所有索引的replica设置为0,这样只用针对Primary进行expunge,以减小I/O压力。


PUT /{index}/_settings
{
    "settings": {
        "index.merge.policy.expunge_deletes_allowed": "10",
        "index.merge.policy.max_merge_at_once_explicit" : "30"
    }
}


参考资料

  1. Lucene‘s Handling of Deleted Documents.




您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### DFS 强制删除命名空间的方法 在分布式文件系统(Distributed File System, DFS)中,强制删除命名空间的操作通常涉及特定命令或工具的支持。以下是针对 Hadoop 和 Elasticsearch 的具体方法: #### 1. **Hadoop 中的强制删除** Hadoop 提供了 `hdfs dfs` 命令来管理文件系统中的对象。如果需要强制删除某个命名空间下的目录或文件,可以使用 `-rm` 或 `-rmr` 参数,并配合 `-skipTrash` 来跳过回收站机制。 ```bash hdfs dfs -rm -r -skipTrash /path/to/namespace ``` 此命令的作用如下: - `-rm`: 删除指定路径的对象。 - `-r`: 表示递归删除整个目录及其子项。 - `-skipTrash`: 跳过垃圾回收站,直接永久删除目标对象[^2]。 需要注意的是,在执行该操作前应确认无误,因为一旦跳过回收站,数据将不可恢复。 #### 2. **Elasticsearch 中的索引删除** 对于 Elasticsearch (ES),可以通过 REST API 发送 HTTP DELETE 请求来移除指定的索引(相当于命名空间)。语法如下: ```http DELETE http://<es_host>:9200/<index_name> ``` 例如,要删除名为 `my_namespace_index` 的索引,则请求地址为: ```http DELETE http://localhost:9200/my_namespace_index ``` 此外,也可以通过 Kibana Console 执行相同的命令。值得注意的一点是,当存在副本时,主分片(primary shard)被销毁后,其对应的副本次级分片(replica shard)[^1]也会自动清理掉。 #### 注意事项 无论是哪种情况,都应当谨慎对待强制删除动作。尤其是在生产环境中,建议先做好充分测试以及必要的备份工作后再实施实际操作。 ```python import requests def delete_es_index(es_url, index_name): url = f"{es_url}/{index_name}" response = requests.delete(url) if response.status_code == 200: print(f"Index {index_name} deleted successfully.") else: print("Failed to delete the index.") delete_es_index('http://localhost:9200', 'test_index') ``` 以上 Python 函数展示了如何利用 Requests 库向 ES 实例发送 DELETE 请求以实现自动化批量处理需求场景下的索引清除任务。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值