使用索引別名和Rollover滾動建立索引

使用索引別名和Rollover滾動建立索引

ElasticSearch6.3.2 集羣作節點冷(warm) 熱(hot) 分離中,實現了ElasticSearch集羣節點的冷熱分離,新建立的索引只容許分配到hot節點上,而隨着時間推移,舊的歷史索引數據須要遷移到warm節點上。所以,ES索引上存儲的數據通常是按時間劃分的:好比每月自動生成一個索引,用來存儲這個月生產的全部數據。爲了更方便地管理按時間生成的索引,可採用索引模板並結合ES的Rollover功能來方便地管理索引。html

先建立索引模板,索引模板裏面定義的索引別名是不能用於rollover的。由於,索引模板裏面的索引別名通常會指向多個"物理"索引。具體可參考:rollover-failing。指向多個"物理"索引的索引別名不能用來寫數據。java

PUT _template/pubchat
{
  "index_patterns": "pubchat-*",
  "settings": {
    "index": {
      "number_of_shards": "3",
      "number_of_replicas": "1",
      "routing": {
        "allocation": {
          "exclude": {
            "box_type": "warm"
          },
          "require": {
            "box_type": "hot"
          }
        }
      }
    }
  },
  "mappings": {
    "_doc": {
      "_source": {
        "enabled": true
      },
      "properties": {
        "uid": {
          "type": "keyword"
        },
        "nick": {
          "type": "keyword"
        },
        "chatTime": {
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss"
        }
      }
    }
  },
  "aliases": {
    "pubchat-search-alias": {}
  }
}

索引別名 pubchat-search-alias 主要是爲了用來搜索(讀操做)。要注意區分2類索引別名:一種是write index,另外一種是read index,具體可參考 ES Index Alias 官方文檔。app

建立新索引,自動命中索引模板,併爲索引pubchat-202001建立一個專門用來搜索的別名:pubchat-search-aliaselasticsearch

#建立一個索引
PUT pubchat-202001

指定一個專門 進行rollover(滾動寫入) 的索引別名。索引別名 pubchat-write-alias 是爲了數據寫入使用ide

#爲索引再指定一個只用來 rollover 的別名
POST _aliases
{
  "actions": [
    {
      "add": {
        "index": "pubchat-202001",
        "alias": "pubchat-write-alias"
      }
    }
  ]
}

rollover別名pubchat-write-alias只須要在建立第一個索引時指定一次,後面pubchat-write-alias會自動滾動指向:pubchat-20200二、pubchat-202003……測試

rollover 索引別名的主要做用是"滾動寫入",所以rollover索引別名只能指向一個具體的索引。ui

An alias that points to one and only one index can be used to read and write data. An alias that points to more than one index is read-only.spa

關於索引別名的詳細描述可參考官方文檔:Write Indexrest

爲索引指定滾動策略。這裏爲了測試方便,當一個索引中超過2篇文檔時,就生成一個新索引。code

# 指定rollover 的策略
POST /pubchat-write-alias/_rollover 
{
  "conditions": {
    "max_docs":  2
  }
}

因爲是新建立的索引,裏面沒有數據,所以應該返回以下:

{
  "acknowledged": false,
  "shards_acknowledged": false,
  "old_index": ""pubchat-202001",
  "new_index": "pubchat-202002",
  "rolled_over": false,
  "dry_run": false,
  "conditions": {
    "[max_docs: 2]": false
  }
}

最後,只須要向rollover索引別名 pubchat-write-alias 寫數據便可,當知足rollover指定的策略時,會自動建立下一個新索引。

# 寫一點測試數據進去
PUT pubchat-write-alias/_doc/1
{
    "uid" : "111",
    "nick" : "test"
}

值得注意的是:index.refresh_interval 參數會影響滾動策略準確性。好比max_docs設置成2,受refresh_interval 影響,索引中包含的文檔數量是有可能大於2個的。

一個示例說明:

爲了一個月生成一個索引(pubchat-yyyyMM),好比:pubchat-20200一、pubchat-20200二、pubchat-202003……

引入了Rollover以後,寫數據只須要往 pubchat-write-alias 索引(別名)上寫,當寫入的數據觸發 指定的 rollover 策略時,會自動生成新的索引(會去匹配已定義好的索引模板)

restHighLevelClient.bulkWrite("pubchat-write-alias");

若不採用Rollover,則須要本身在代碼邏輯中寫數據時,按月判斷生成索引名稱。

restHighLevelClient.bulkWrite("pubchat-202001");//1月份
restHighLevelClient.bulkWrite("pubchat-202002");//2月份
....

顯然rollover簡化了索引的管理。另,ES6.7版本引入了 Index LifeCycle Management,應該能更方便地管理索引了吧。

原文:http://www.javashuo.com/article/p-kstihozi-ba.html

相關文章
相關標籤/搜索