使用索引别名和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

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

时间: 2024-08-29 19:16:36

使用索引别名和Rollover滚动创建索引的相关文章

索引深入浅出(10/10):创建索引时,键列位置的重要性

在过去的文章里,我们已经讨论了各种不同索引.这个文章里,我们会讨论下键列的顺序(索引列的顺序).索引键列的顺序基于数据的访问模式还有你想如何组织数据. 对于索引键列的顺序,常规指导方针就是把查询用到最多的列放在第一列.这并不是说,所有你索引里的唯一ID列就应该是第一列.优化器是基于索引上的可用统计信息来选择索引的.统计信息会给你键列的使用密度信息,即索引的唯一性,直方图(histogram )用来存储那一列值分布情况信息. 让我们用customer表做例子,它保存来自各个国家的客户信息. 1 C

Mysq索引优化(什么情况创建索引,什么情况不创建索引)

一.以下情况需要创建索引 1.主键自动建立唯一索引 2.频繁作为查询条件的字段应该创建索引 3.查询中与其他表关联的字段,外键关系建立索引 4.单键/组合索引的选择问题,组合索引性价比更高 5.查询中排序的字段,排序字段若通过索引去访问将大大提交排序速度 6.查询中排序或者分组字段 (分组会先进行排序再进行分组) 二.以下情况不要创建索引 1.表记录太少 2.经常增删改的表或者字段 3.Where条件里用不到的字段不创建索引 4.过滤性不好的不适合建索引 原文地址:https://www.cnb

Elasticsearch之curl创建索引库和索引时注意事项

前提, Elasticsearch之curl创建索引库 Elasticsearch之curl创建索引 注意事项 1.索引库名称必须要全部小写,不能以下划线开头,也不能包含逗号 2.如果没有明确指定索引数据的ID,那么es会自动生成一个随机的ID,需要使用POST参数 curl -XPOST http://192.168.80.200:9200/zhouls/emp/ -d '{"name" : "tom"}' 3.如果想要确定我们创建的都是全新的数据 1:使用随机I

创建索引的方法有两种

创建索引的方法有两种:创建表的同时创建索引,在已有表上创建索引. 方法一:创建表的同时创建索引. 使用这种方法创建索引时,可以一次性地创建一个表的多个索引(例如唯一性索引.普通索引.复合索引等),其语法格式与创建的语法格式基本相同(注意粗体字部分的代码). Create  table 表名( 字段名1数据类型 [约束条件] 字段名字2   数据类型 [约束条件] - [unique][fulltext] index [索引名](字段名[(长度)] [asc|desc]) )engine=存储引擎

企业如何给MYSQL创建表,查询表,创建索引实例

创建表 数据类型   int(整形,整数) not null,char(字符) tinyint(最小的整形) varchar (变长的字符类型) create table xiaohu( id int(4) not null, name char(20) not null, age tinyint(2) not null default '0',(不可以为空,但可以给0) dept varchar(16) default null (可以为空) 如 mysql> create table stu

lucene入门创建索引——(一)

1.程序宏观结构图 2.创建索引过程 3.代码实现 创建索引库: 1)  创建JavaBean对象 2)  创建Docment对象 3)  将JavaBean对象所有的属性值,均放到Document对象中去,属性名可以和JavaBean相同或不同 4)  创建IndexWriter对象 5)  将Document对象通过IndexWriter对象写入索引库中 6)  关闭IndexWriter对象 Jar包: 代码: 1 // 创建索引 2 @Test 3 public void testInd

物化视图,索引视图,函数索引,创建索引时使用DESC

老板交给的一个任务,搜了一下资料,觉得还是总结一下比较好.假如以后用到了呢?围绕两个主题:一是视图上能够建索引,二是在创建索引时是否可以使用DESC关键字. 一.能否在视图上创建索引 因为普通的视图并没有存储实际的信息,它所操作的数据来自于基本表,所以在普通视图上不可以创建索引. 在oracle中执行如下的语句,会报"视图不适用于此处"的错误 create view test_car as select license from cars; create index index_vew

Lucene.net 从创建索引到搜索的代码范例

关于Lucene.Net的介绍网上已经很多了在这里就不多介绍Lucene.Net主要分为建立索引,维护索引和搜索索引Field.Store的作用是通过全文检查就能返回对应的内容,而不必再通过id去DB中加载.Field.Store.YES:存储字段值(未分词前的字段值)Field.Store.NO:不存储,存储与索引没有关系Field.Store.COMPRESS:压缩存储,用于长文本或二进制,但性能受损Field.Index.ANALYZED:分词建索引 Field.Index.ANALYZE

基于lucene的案例开发:创建索引

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/42872711 从这篇博客开始,不论是API介绍还是后面的案例开发,都是基于 lucene4.3.1 这个版本,Lucene4.3.1 下载请点击这里, Lucene其他版本下载请点击这里,Lucene4.3.1官方API文档请点击这里. 创建索引demo 在开始介绍之前,先看一个简单的索引创建demo程序: /** *@Description: 索引创建demo */ pack