探究 | Elasticsearch如何物理删除给定期限的历史数据?

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/curator

6.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 可以很方便的管理索引的保存期限。

参考:

[1]http://t.cn/RuwOTv [2]http://t.cn/RuwXHBr [3]http://t.cn/RuwOofC

原文发布于微信公众号 - 铭毅天下(gh_0475cf887cf7)

原文发表时间:2018-04-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序猿DD

12 条用于 Linux 的 MySQL/MariaDB 安全最佳实践

MySQL 是世界上最流行的开源数据库系统,MariaDB(一个 MySQL 分支)是世界上增长最快的开源数据库系统。在安装 MySQL 服务器之后,在默认配置...

37010
来自专栏文渊之博

xtrabackup部署以及使用

  备份mysql数据库一直是一个比较恶心的工作,主要就是备份的数据库比较大实在是慢。最近开始使用xtrabackup来备份数据库,速度上快了很多,尤其还原速度...

1143
来自专栏Python自动化测试

Python接口测试之对MySQL的操作(六)

本文章主要来说python对mysql数据库的基本操作,当然,前提是已经搭建了python环境和搭建了Mysql数据库的环境,python操作m...

1522
来自专栏GreenLeaves

Oracle 客户端管理软件安装

1、首先,先说明下为什么要安装Oracle客户端管理工具? 因为Oracle服务端过大,而且消耗的资源过多,大部分公司会把服务端装在公司的服务器上,而不会装在员...

2005
来自专栏决胜机器学习

《高性能MySQL》读书笔记(一) ——MySQL架构及重要属性概述

《高性能MySQL》读书笔记(一)——MySQL架构及重要属性概述 (原创内容,转载请注明来源,谢谢) 一、MySQL逻辑架构 1、三层架构 ...

4369
来自专栏Java技术交流群809340374

分布式锁的3种实现(数据库、缓存、Zookeeper)

目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题。

1490
来自专栏北京马哥教育

马哥linux | Linux系统性能和使用活动监控工具 sysstat

Sysstat是一个非常方便的工具,它带有众多的系统资源监控工具,用于监控系统的性能和使用情况。我们在日常使用的工具中有相当一部分是来自sysstat工具包的。...

3195
来自专栏pangguoming

MySQL 高可用性—keepalived+mysql双主(有详细步骤和全部配置项解释)

前言:生产环境中一台mysql主机存在单点故障,所以我们要确保mysql的高可用性,即两台MySQL服务器如果其中有一台MySQL服务器挂掉后,另外一台能立马接...

2823
来自专栏决胜机器学习

高性能网站架构方案(一) ——MySQL提升

高性能网站架构方案(一)——MySQL提升 原创内容,转载请注明来源,谢谢) 一、Mysql响应速度提升——HandlerSocket 1、概述 ...

3898
来自专栏你不就像风一样

使用hibernate造成的MySql 8小时问题解决方案

mysql5之前的版本,可以在jdbc连接的url中加入:autoReconnect = true

791

扫码关注云+社区

领取腾讯云代金券