Elasticsearch删除操作详解 | 您所在的位置:网站首页 › elasticsearch清空数据 › Elasticsearch删除操作详解 |
文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484022&idx=1&sn=7a4de21570820b82df0170b3c769b169&chksm=eaa82a5edddfa348b3e300ac4bc611ab32a5e6024d20ef7a3cb297a42483fd60f0f459dd33ad&scene=21#wechat_redirect 01 题记 想到删除,基础认知是delete,细分为删除文档(document)和删除索引;要删除历史数据,基础认知是:删除了给定条件的数据,用delete_by_query。 实际操作发现: 删除文档后,磁盘空间并没有立即减少,反而增加了? 除了定时任务+delete_by_query,有没有更好的方式呢?02 常见的删除操作 2.1 删除单个文档 1DELETE /twitter/_doc/1 2.2 删除满足给定条件的文档 1POST twitter/_delete_by_query 2{ 3 "query": { 4 "match": { 5 "message": "some message" 6 } 7 } 8} 注意:执行批量删除的时候,可能会发生版本冲突。强制执行删除的方式如下: 1POST twitter/_doc/_delete_by_query?conflicts=proceed 2{ 3 "query": { 4 "match_all": {} 5 } 6} 2.3 删除单个索引 1DELETE /twitter 2.4 删除所有索引 1DELETE /_all 或者 1DELETE /* 删除所有索引是非常危险的操作,要注意谨慎操作。 03 删除文档后台做了什么? 执行删除后的返回结果: 1{ 2 "_index": "test_index", 3 "_type": "test_type", 4 "_id": "22", 5 "_version": 2, 6 "result": "deleted", 7 "_shards": { 8 "total": 2, 9 "successful": 1, 10 "failed": 0 11 }, 12 "_seq_no": 2, 13 "_primary_term": 17 14} 解读: 索引的每个文档都是版本化的。 删除文档时,可以指定版本以确保我们试图删除的相关文档实际上被删除,并且在此期间没有更改。 每个在文档上执行的写操作,包括删除,都会使其版本增加。 真正的删除时机: deleting a document doesn’t immediately remove the document from disk; it just marks it as deleted. Elasticsearch will clean up deleted documents in the background as you continue to index more data.04 删除索引和删除文档的区别? 1)删除索引是会立即释放空间的,不存在所谓的“标记”逻辑。 2)删除文档的时候,是将新文档写入,同时将旧文档标记为已删除。 磁盘空间是否释放取决于新旧文档是否在同一个segment file里面,因此ES后台的segment merge在合并segment file的过程中有可能触发旧文档的物理删除。 但因为一个shard可能会有上百个segment file,还是有很大几率新旧文档存在于不同的segment里而无法物理删除。想要手动释放空间,只能是定期做一下force merge,并且将max_num_segments设置为1。 1POST /_forcemerge 05 如何仅保存最近100天的数据? 有了上面的认知,仅保存近100天的数据任务分解为: 1)delete_by_query设置检索近100天数据; 2)执行forcemerge操作,手动释放磁盘空间。删除脚本如下: 1#!/bin/sh 2curl -H'Content-Type:application/json' -d'{ 3 "query": { 4 "range": { 5 "pt": { 6 "lt": "now-100d", 7 "format": "epoch_millis" 8 } 9 } 10 } 11} 12' -XPOST "http://192.168.1.101:9200/logstash_*/ 13_delete_by_query?conflicts=proceed" merge脚本如下: 1#!/bin/sh 2curl -XPOST 'http://192.168.1.101:9200/_forcemerge? 3only_expunge_deletes=true&max_num_segments=1' 06 有没有更通用的方法? 有,使用ES官网工具——curator工具。 6.1 curator简介 主要目的:规划和管理ES的索引。支持常见操作:创建、删除、合并、reindex、快照等操作。 6.2 curator官网地址 http://t.cn/RuwN0oM Git地址:https://github.com/elastic/curator6.3 curator安装向导 地址:http://t.cn/RuwCkBD 注意: curator各种博客教程层出不穷,但curator旧版本和新版本有较大差异,建议参考官网最新手册部署。 旧版本命令行方式新版本已不支持。 6.4 curator命令行操作 1$ curator --help 2Usage: curator [OPTIONS] ACTION_FILE 3 Curator for Elasticsearch indices. 4 See http://elastic.co/guide/en/elasticsearch/client/curator/current 5Options: 6 --config PATH Path to configuration file. Default: ~/.curator/curator.yml 7 --dry-run Do not perform any changes. 8 --version Show the version and exit. 9 --help Show this message and exit. 核心: 配置文件config.yml:配置要连接的ES地址、日志配置、日志级别等; 执行文件action.yml: 配置要执行的操作(可批量)、配置索引的格式(前缀匹配、正则匹配方式等)6.5 curator适用场景 最重要的是: 仅以删除操作为例:curator可以非常简单地删除x天后的索引的前提是:索引命名要遵循特定的命名模式——如:以天为命名的索引:logstash_2018.04.05。 命名模式需要和action.yml中的delete_indices下的timestring对应。07 小结 多参考官网最新的文档,历史版本的历史文档很容易误导人; 多真正去实践,而不是仅限于知道; medcl:ES新版本6.3 有一个 Index LifeCycle Management 可以很方便的管理索引的保存期限。 |
CopyRight 2018-2019 实验室设备网 版权所有 |