使用索引别名和Rollover滚动创建索引

使用索引别名和Rollover滚动创建索引

ElasticSearch6.3.2 集群做节点冷(warm) 热(hot) 分离中,实现了ElasticSearch集群节点的冷热分离,新创建的索引只允许分配到hot节点上,而随着时间推移,旧的历史索引数据需要迁移到warm节点上。因此,ES索引上存储的数据一般是按时间划分的:比如每个月自动生成一个索引,用来存储这个月生产的所有数据。为了更方便地管理按时间生成的索引,可采用索引模板并结合ES的Rollover功能来方便地管理索引。

先创建索引模板,索引模板里面定义的索引别名是不能用于rollover的。因为,索引模板里面的索引别名一般会指向多个"物理"索引。具体可参考:rollover-failing。指向多个"物理"索引的索引别名不能用来写数据。

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 官方文档。

创建新索引,自动命中索引模板,并为索引pubchat-202001创建一个专门用来搜索的别名:pubchat-search-alias

#创建一个索引
PUT pubchat-202001

指定一个专门 进行rollover(滚动写入) 的索引别名。索引别名 pubchat-write-alias 是为了数据写入使用

#为索引再指定一个只用来 rollover 的别名
POST _aliases
{
  "actions": [
    {
      "add": {
        "index": "pubchat-202001",
        "alias": "pubchat-write-alias"
      }
    }
  ]
}

rollover别名pubchat-write-alias只需要在创建第一个索引时指定一次,后面pubchat-write-alias会自动滚动指向:pubchat-202002、pubchat-202003……

rollover 索引别名的主要作用是"滚动写入",因此rollover索引别名只能指向一个具体的索引。

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.

关于索引别名的详细描述可参考官方文档:Write Index

为索引指定滚动策略。这里为了测试方便,当一个索引中超过2篇文档时,就生成一个新索引。

# 指定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-202001、pubchat-202002、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,应该能更方便地管理索引了吧。

原文:https://www.cnblogs.com/hapjin/p/11386965.html

posted @ 2019-09-14 12:49  大熊猫同学  阅读(4559)  评论(0编辑  收藏  举报