elasticsearch 索引翻滚

1. 前言

关于es 的索引,我们在使用时最期望的就是均衡,尤其是大数据量的时候,我们常讲查询没有银弹,但是可以有好的实践。Rollover Pattern,是一种,根据自定义策略去翻滚的方式,其工作方式和我们平时写日志的时候,日志文件的翻滚非常相似,达到一定的大小,或者按照时间产生新的日志文件,比如,info.log, 满足条件后,生成info.log.1, 然后新日志继续打到info.log。回到es 的索引管理上来,如法炮制,es研发人员也希望有一个类似logrotate 的功能,于是Rollover应运而生。滚动模式的工作原理如下:

  1. 有一个索引别名,它指向活跃索引。
  2. 活跃索引可以具有与您的热点节点一样多的分片,以利用所有昂贵硬件的索引资源。 当活跃索引太满或太旧时,它将滚动创建一个新索引,索引别名的写属性从旧索引到新索引。
  3. 旧的索引被移动到一个冷节点,并且被缩小到一个分片,这也可以被强制合并和压缩。

我们由浅入深。

2. 直接使用rollover

首先你需要有一个bootstrap 的索引,

PUT /logs-000001
{
  "aliases": {
    "logs_write": {
       "is_write_index": true 
    }
  }
}

修改id 写6次

PUT logs_write/log/1
{
  "log_data": "hello ilm1"
}

然后发一个翻滚命令

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

此时会发现 产生一个新的索引 logs-000002,并且该索引被赋予了logs-write 的别名,然后我们可以继续修改id 写6次,记得每次id加1哦,或者你bulk。

PUT logs_write/log/6
{
  "log_data": "hello ilm6"
}

然后又发一个翻滚命令

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

发现会发现 产生一个新的索引 logs-000003,并且该索引又被赋予了logs-write 的别名
之前的logs-000001,logs-000002,均有该别名,但是允许写入的只有最新的索引。

以上是新数据的写入,对于查询我们可以这样

GET  logs_write/_search

会拿到全部的索引数据。但是通过别名写入只会写入最新的索引内。是不是很开心,但是这里有一个问题,你必须cron 地去调用rollover 接口,那么有没有更省心的做法呢?

ILM

index lifecycle management 在6.6 第一次被引入beta版本,在6.7 里GA版本,它内部实现了cron 的工作,我们只需要去配置它的policy即可。真的是很贴心呢。让我们看下实现上面的功能,我们该如何配置。

  1. 我们首先创建一个索引模板:

    PUT _template/my_template
    {
      "index_patterns": ["test-*"], 
      "settings": {
        "index.lifecycle.name": "my_policy", 
        "index.lifecycle.rollover_alias": "test-alias" 
      }
    }
    
  2. 重点,创建一个策略

    PUT /_ilm/policy/my_policy
    {
      "policy":{
        "phases":{
          "hot":{
            "actions":{
              "rollover":{
                "max_docs":  3
              }
            }
          }
        }
      }
    }
    
  3. 创建一个初始的索引

    PUT test-000001 
    {
      "aliases": {
        "test-alias":{
          "is_write_index": true 
        }
      }
    } 
    
  4. 批量写数据

    POST test-alias/log/_bulk
    { "create": {"_id":1}}
    { "text": "Some log message", "@timestamp": "2016-07-04T01:00:00Z" }
    { "create": {"_id":2}}
    { "text": "Some log message", "@timestamp": "2016-07-05T01:00:00Z" }
    { "create": {"_id":3}}
    { "text": "Some log message", "@timestamp": "2016-07-04T01:00:00Z" }
    { "create": {"_id":4}}
    { "text": "Some log message", "@timestamp": "2016-07-05T01:00:00Z" }
    { "create": {"_id":5}}
    { "text": "Some log message", "@timestamp": "2016-07-04T01:00:00Z" }
    { "create": {"_id":6}}
    { "text": "Some log message", "@timestamp": "2016-07-05T01:00:00Z" }
    
  5. check 下效果吧

    GET test-alias/_ilm/explain
    

    看到没有变化哦,很遗憾,为什么。原来es 的集群设置,默认pollinterval 是10分钟,check一次,相当于cronjob 的执行间隔是10分钟。我们耐心等待10分钟,发现预期达到。

你可能感兴趣的:(EFK)