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分鐘,發現預期達到。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章