Elasticsearch: rollover API

rollover使您能够根据索引大小,文档数或使用期限自动过渡到新索引。 当rollover触发后,将建立新索引,写别名(write alias)将更新为指向新索引,全部后续更新都将写入新索引。php

对于基于时间的rollover来讲,基于大小,文档数或使用期限过渡至新索引是比较适合的。 在任意时间rollover一般会致使许多小的索引,这可能会对性能和资源使用产生负面影响。elasticsearch

Rollover历史数据ide

  • 在大多数状况下,无限期保留历史数据是不可行的性能

    • 时间序列数据随着时间的流逝而失去价值,咱们最终不得不将其删除
    • 可是其中一些数据对于分析仍然很是有用
  • Elasticsearch 6.3引入了一项新的rollover功能,该功能网站

    • 以紧凑的聚合格式保存旧数据
    • 仅保存您感兴趣的数据

就像上面的图片看到的那样,咱们定义了一个叫作logs-alias的alias,对于写操做来讲,它老是会自动指向最新的能够用于写入index的一个索引。针对咱们上面的状况,它指向logs-000002。若是新的rollover发生后,新的logs-000003将被生成,并对于写操做来讲,它自动指向最新生产的logs-000003索引。而对于读写操做来讲,它将同时指向最早的logs-1,logs-000002及logs-000003。在这里咱们须要注意的是:在咱们最先设定index名字时,最后的一个字符必须是数字,好比咱们上面显示的logs-1。不然,自动生产index将会失败。编码

rollover例子

咱们仍是先拿一个rollover的例子来讲明,这样比较清楚。首先咱们定义一个log-alias的alias:url

PUT /%3Clogs-%7Bnow%2Fd%7D-1%3E
    {
      "aliases": {
        "log_alias": {
          "is_write_index": true
        }
      }
    }

若是你们对于上面的字符串“%3Clogs-%7Bnow%2Fd%7D-1%3E”比较陌生的话,能够参考网站https://www.urlencoder.io/。实际上它就是字符串“<logs-{now/d}-1>”的url编码形式。请注意上面的is_write_index必须设置为true。运行上面的结果是:code

{
      "acknowledged" : true,
      "shards_acknowledged" : true,
      "index" : "logs-2019.10.21-1"
    }

显然,它帮咱们生产了一个叫作logs-2019.10.21-1的index。接下来,咱们先使用咱们的Kibana来准备一下咱们的index数据。咱们运行起来咱们的Kibana:blog

咱们分别点击上面的1和2处:索引

点击上面的“Add data”。这样咱们就能够把咱们的kibana_sample_data_logs索引加载到Elasticsearch中。咱们能够经过以下的命令进行查看:

GET _cat/indices/kibana_sample_data_logs

命令显示结果为:

它显示kibana_sample_data_logs具备11.1M的数据,而且它有14074个文档:

咱们接下来运行以下的命令:

POST _reindex
    {
      "source": {
        "index": "kibana_sample_data_logs"
      },
      "dest": {
        "index": "log_alias"
      }
    }

这个命令的做用是把kibana_sample_data_logs里的数据reindex到log_alias所指向的index。也就是把kibana_sample_data_logs的文档复制一份到咱们上面显示的logs-2019.10.21-1索引里。咱们作以下的操做查看一下结果:

GET logs-2019.10.21-1/_count

显示的结果是:

{
      "count" : 14074,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      }
    }

显然,咱们已经复制到全部的数据。那么接下来,咱们来运行以下的一个指令:

POST /log_alias/_rollover?dry_run
    {
      "conditions": {
        "max_age": "7d",
        "max_docs": 14000,
        "max_size": "5gb"
      }
    }

在这里,咱们定义了三个条件:

  • 若是时间超过7天,那么自动rollover,也就是使用新的index
  • 若是文档的数目超过14000个,那么自动rollover
  • 若是index的大小超过5G,那么自动rollover

在上面咱们使用了dry_run参数,代表就是运行时看看,但不是真正地实施。显示的结果是:

{
      "acknowledged" : false,
      "shards_acknowledged" : false,
      "old_index" : "logs-2019.10.21-1",
      "new_index" : "logs-2019.10.21-000002",
      "rolled_over" : false,
      "dry_run" : true,
      "conditions" : {
        "[max_docs: 1400]" : true,
        "[max_size: 5gb]" : false,
        "[max_age: 7d]" : false
      }
    }

根据目前咱们的条件,咱们的logs-2019.10.21-1文档数已经超过14000个了,因此会生产新的索引logs-2019.10.21-000002。由于我使用了dry_run,也就是演习,因此显示的rolled_over是false。

为了能真正地rollover,咱们运行以下的命令:

POST /log_alias/_rollover
    {
      "conditions": {
        "max_age": "7d",
        "max_docs": 1400,
        "max_size": "5gb"
      }
    }

显示的结果是:

{
      "acknowledged" : true,
      "shards_acknowledged" : true,
      "old_index" : "logs-2019.10.21-1",
      "new_index" : "logs-2019.10.21-000002",
      "rolled_over" : true,
      "dry_run" : false,
      "conditions" : {
        "[max_docs: 1400]" : true,
        "[max_size: 5gb]" : false,
        "[max_age: 7d]" : false
      }
    }

说明它已经rolled_ovder了。咱们能够经过以下写的命令来检查:

GET _cat/indices/logs-2019*

显示的结果为:

咱们如今能够看到有两个以logs-2019.10.21为头的index,而且第二文档logs-2019.10.21-000002文档数为0。若是咱们这个时候直接再想log_alias写入文档的话:

POST log_alias/_doc
    {
      "agent": "Mozilla/5.0 (X11; Linux x86_64; rv:6.0a1) Gecko/20110421 Firefox/6.0a1",
      "bytes": 6219,
      "clientip": "223.87.60.27",
      "extension": "deb",
      "geo": {
        "srcdest": "IN:US",
        "src": "IN",
        "dest": "US",
        "coordinates": {
          "lat": 39.41042861,
          "lon": -88.8454325
        }
      },
      "host": "artifacts.elastic.co",
      "index": "kibana_sample_data_logs",
      "ip": "223.87.60.27",
      "machine": {
        "ram": 8589934592,
        "os": "win 8"
      },
      "memory": null,
      "message": """          
      223.87.60.27 - - [2018-07-22T00:39:02.912Z] "GET /elasticsearch/elasticsearch-6.3.2.deb_1 HTTP/1.1" 200 6219 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:6.0a1) Gecko/20110421 Firefox/6.0a1"
      """,
      "phpmemory": null,
      "referer": "http://twitter.com/success/wendy-lawrence",
      "request": "/elasticsearch/elasticsearch-6.3.2.deb",
      "response": 200,
      "tags": [
        "success",
        "info"
      ],
      "timestamp": "2019-10-13T00:39:02.912Z",
      "url": "https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.2.deb_1",
      "utc_time": "2019-10-13T00:39:02.912Z"
    }

显示的结果:

{
      "_index" : "logs-2019.10.21-000002",
      "_type" : "_doc",
      "_id" : "xPyQ7m0BsjOKp1OsjsP8",
      "_version" : 1,
      "result" : "created",
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "failed" : 0
      },
      "_seq_no" : 1,
      "_primary_term" : 1
    }

显然它写入的是logs-2019.10.21-000002索引。咱们再次查询log_alias的总共文档数:

GET log_alias/_count

显示的结果是:

{
      "count" : 14075,
      "_shards" : {
        "total" : 2,
        "successful" : 2,
        "skipped" : 0,
        "failed" : 0
      }
    }

显然它和以前的14074个文档多增长了一个文档,也就是说log_alias是同时指向logs-2019.10.21-1及logs-2019.10.21-000002。

总结:在今天的文档里,咱们讲述了如何使用rollover API来自动管理咱们的index。利用rollover API,它能够很方便地帮咱们自动根据咱们设定的条件帮咱们把咱们的Index过分到新的index。在将来的文章里,咱们将讲述如何使用Index life cycle policy来帮咱们管理咱们的index。

相关文章
相关标签/搜索