Elasticsearch索引全生命周期管理指南之一

#作者:猎人

文章目录

一、索引常规操作

索引数据特点:

索引中的数据随着时间,持续不断增长

按照时间序列划分索引的好处&挑战:

按照时间进行划分索引,会使得管理更加简单。例如,完整删除一个索引,性能比 delete by query 好。

如何进行自动化管理,减少人工操作。从Hot 移动到 Warm。定期关闭或者删除索引。

1、创建索引

(1)创建索引的语法

用settings给这个索引在创建时可以添加一些设置,还有可以初始化一些type的mapping

复制代码
curl -XPUT 'http://elasticsearch02:9200/twitter?pretty' -d '
{
    "settings" : {
        "index" : {
            "number_of_shards" : 3, 
            "number_of_replicas" : 2 
        }
    },
    "mappings" : {
        "type1" : {
            "properties" : {
                "field1" : { "type" : "text" }
            }
        }
    }
}'

(2)索引创建返回消息的解释

默认索引创建命令会在每个primary shard的副本开始进行复制以后,或者是请求超时以后,返回一个响应消息,类似下面这样的。其中acknowledged表明了这个索引有没有创建成功,shards_acknowledged表明了每个primary shard有没有足够数量的replica开始进行复制了。有可能这两个参数会为false,但是索引依然可以创建成功。因为这些参数仅仅是表明在请求超时之前,那两个行为有没有成功,也有可能请求超时,在超时前都没成功,但是超时后在es server端还是都执行了。如果acknoledged是false,那么就可能是超时了,此时接受到响应消息的时候,cluster state都还没变更,没有加入新创建的index,但是也许之后还是会创建这个index。如果shards_acknowledged是false,那么可能在primary shard进行副本copy之前,就timeout了,但是此时也许index创建成功了,而且cluster state已经加入了新创建的index。

复制代码
{
    "acknowledged": true,
    "shards_acknowledged": true
}

2、删除索引

curl -XDELETE 'http://elasticsearch02:9200/twitter?pretty'

删除索引中的一个type

3、查询索引设置信息

curl -XGET 'http://elasticsearch02:9200/twitter?pretty'

4、打开/关闭索引

复制代码
curl -XPOST 'http://elasticsearch02:9200/twitter/_close?pretty'
curl -XPOST 'http://elasticsearch02:9200/twitter/_open?pretty'
curl -XPUT 'http://elasticsearch02:9200/twitter/type1/1?pretty' -d '
{
	"field1": "1"
}

'

如果关闭了一个索引之后,那么这个索引是不会带来任何的性能开销了,只要保留这个索引的元数据即可,然后对这个索引的读写操作都不会成功。一个关闭的索引可以接着再打开,打开以后会进行shard recovery过程。

比如在做一些运维操作的时候,现在要对某一个索引做一些配置,运维操作,修改一些设置,关闭索引,不允许写入,成功以后再打开索引。

5、压缩索引

shrink命令可以将一个已有的索引压缩成一个新的索引,同时primary shard会更少。因为以前提到过,primary shard因为涉及到document的hash路由问题,所以是不允许修改的。但是如果要减少index的primary shard,可以用shrink命令来压缩index。但是压缩后的shard数量必须可以被原来的shard数量整除。举例来说,一个有8个primary shard的index可以被压缩成4个,2个,或者1个primary shard的index。

压缩索引,是这样啊,如果你的索引中本来比如是要保留7天的数据,那么给了10个shard,但是现在需求变了,这个索引只要保留3天的数据就可以了,那么数据量变小了,就不需要10个shard了,就可以做shrink操作,5个shard。

shrink命令的工作流程如下:

(1)首先,它会创建一个跟source index的定义一样的target index,但是唯一的变化就是primary shard变成了指定的数量

(2)接着它会将source index的segment file直接用hard-link的方式连接到target index的segment file,如果操作系统不支持hard-link,那么就会将source index的segment file都拷贝到target index的data dir中,会很耗时。如果用hard-link会很快

(3)最后,会将target index进行shard recovery恢复

如果要shrink index,那么这个index必须先被标记为read only,而且这个index的每个shard的某一个copy,可以是primary或者是replica,都必须被复制到一个节点上去。默认情况下,index的每个shard有可能在不同机器上的,比如说,index有5个shard,shard0和shard1在机器1上,shard2、shard3在机器2上,shard4在机器3上。现在还得把shard0,shard1,shard2,shard3,shard4全部拷贝到一个同一个机器上去,但是可以是shard0的replica shard。而且每个primary shard都必须存在。可以通过下面的命令来完成。其中index.routing.allocation.require._name必须是某个node的名称,这个都是可以自己设置的。

复制代码
curl -XPUT 'http://elasticsearch02:9200/twitter/_settings?pretty' -d '
{
  "settings": {
    "index.routing.allocation.require._name": "node-elasticsearch-02", 
    "index.blocks.write": true 
  }
}'

这个命令会花费一点时间将source index每个shard的一个copy都复制到指定的node上去,可以通过GET _cat/recovery?v命令来追踪这个过程的进度。

等上面的shard copy relocate过程结束之后,就可以shrink一个index,用下面的命令即可:POST my_source_index/_shrink/my_target_index。如果target index被添加进了cluster state之后,这个命令就会立即返回,不是等待shrink过程完成之后才返回的。当然还可以用下面的命令来shrink的时候修改target index的设置,在settings里就可以设置target index的primary shard的数量。

复制代码
curl -XPOST 'http://elasticsearch02:9200/twitter/_shrink/twitter_shrinked?pretty' -d '
{
  "settings": {
    "index.number_of_replicas": 1,
    "index.number_of_shards": 1, 
    "index.codec": "best_compression" 
  }
}

'

当然也是需要监控整个shrink的过程的,用GET _cat/recovery?v即可。

6、rollover index

rollover命令可以将一个alias重置到一个新的索引上去,如果已经存在的index被认为太大或者数据太旧了。这个命令可以接收一个alias名称,还有一系列的condition。如果索引满足了condition,那么就会创建一个新的index,同时alias会指向那个新的index。比如下面的命令。举例有一个logs-0000001索引,给了一个别名是logs_write,然后发起了一个rollover的命令,如果logs_write别名之前指向的那个index,也就是logs-0000001,创建了超过7天,或者里面的document已经超过了1000个了,然后就会创建一个logs-000002的索引,同时logs_write别名会指向新的索引。

也可以写一个shell脚本,每天0:00的时候就执行以下rollover命令,此时就判断,如果说之前的索引已经存在了超过1天了,那么此时就创建一个新的索引出来,同时将别名指向新的索引。自动去滚动创建新的索引,保持每个索引就只有一个小时,一天,七天,三天,一周,一个月。

类似用es来做日志平台,就可能分布式电商平台,可能订单系统的日志,单独的一个索引,要求的是保留最近3天的日志就可以了。交易系统的日志,是单独的一个索引,要求的是保留最近30天的日志。

复制代码
curl -XPUT 'http://elasticsearch02:9200/logs-000001?pretty' -d ' 
{
  "aliases": {
    "logs_write": {}
  }
}'
 
# Add > 1000 documents to logs-000001
 
curl -XPUT 'http://elasticsearch02:9200/logs-000001/data/1?pretty' -d '
{
	"userid": 1,
	"page": 1
}'
curl -XPUT 'http://elasticsearch02:9200/logs-000001/data/2?pretty' -d '
{
	"userid": 2,
	"page": 2
}'
curl -XPUT 'http://elasticsearch02:9200/logs-000001/data/3?pretty' -d '
{
	"userid": 3,
	"page": 3
}'
 
curl -XPOST 'http://elasticsearch02:9200/logs_write/_rollover?pretty' -d ' 
{
  "conditions": {
    "max_age":   "1d",
    "max_docs":  3
  }
}'
 
{
  "acknowledged": true,
  "shards_acknowledged": true,
  "old_index": "logs-000001",
  "new_index": "logs-000002",
  "rolled_over": true, 
  "dry_run": false, 
  "conditions": { 
    "[max_age: 7d]": false,
    "[max_docs: 1000]": true
  }
}

这个过程常见于网站用户行为日志数据,比如按天来自动切分索引,写个脚本定时去执行rollover,就会自动不断创建新的索引,但是别名永远是一个,对于外部的使用者来说,用的都是最新数据的索引。

比如用es做网站的实时用户行为分析,要求的是一个索引只要保留当日的数据就可以了,那么就可以用这个rollover的策略,确保每个索引都是包含当日的最新数据的。老的数据,就变成别的索引了,此时可以写一个shell脚本,删除旧的数据,这样的话,es里就保留当前最新的数据就可以了。也可以根据你的需求,就保留最近7天的数据,但是最新一天的数据在一个索引中,供分析查询使用。

默认情况下,如果已经存在的那个索引是用-符号加上一个数字结尾的,比如说logs-000001,那么新索引的名称就会是自动给那个数字加1,比如logs-000002,自动就是给一个6位的数字,而且会自动补零。但是我们也可以自己指定要的新的索引名称,比如下面这样:

复制代码
POST /my_alias/_rollover/my_new_index_name
{
  "conditions": {
    "max_age":   "7d",
    "max_docs":  1000
  }
}

可以将rollover命令和date日期结合起来使用,比如下面的例子,先创建了一个logs-2016.10.31-1格式的索引。接着每次如果成功rollover了,那么如果是在当天rollover了多次,那就是当天的日期,末尾的数字递增。如果是隔天才rollover,会自动变更日期,同时维护末尾的数字序号。

复制代码
PUT /%3Clogs-%7Bnow%2Fd%7D-1%3E 
{
  "aliases": {
    "logs_write": {}
  }
}
 
PUT logs_write/log/1
{
  "message": "a dummy log"
}
 
POST logs_write/_refresh
 
# Wait for a day to pass
 
POST /logs_write/_rollover 
{
  "conditions": {
    "max_docs":   "1"
  }
}

当然,还可以在rollover的时候,给新的index进行新的设置:

复制代码
POST /logs_write/_rollover
{
  "conditions" : {
    "max_age": "7d",
    "max_docs": 1000
  },
  "settings": {
    "index.number_of_shards": 2
  }
}

二、索引mapping和别名管理

1、mapping管理

put mapping命令可以让我们给一个已有的索引添加一个新的type,或者修改一个type,比如给某个type加一些字段

下面这个命令是在创建索引的时候,直接跟着创建一个type

curl -XPUT 'http://elasticsearch02:9200/twitter?pretty' -d '

{

"mappings": {

"tweet": {

"properties": {

"message": {

"type": "text"

}

}

}

}

}'

下面这个命令是给一个已有的索引添加一个type

复制代码
curl -XPUT 'http://elasticsearch02:9200/twitter/_mapping/user?pretty' -d ' 
{
  "properties": {
    "name": {
      "type": "text"
    }
  }
}'

下面这个命令是给一个已有的type添加一个field

复制代码
curl -XPUT 'http://elasticsearch02:9200/twitter/_mapping/tweet?pretty' -d '
{
  "properties": {
    "user_name": {
      "type": "text"
    }
  }
}'

curl -XGET 'http://elasticsearch02:9200/twitter/_mapping/tweet?pretty',上面这行命令可查看某个type的mapping映射信息

curl -XGET 'http://elasticsearch02:9200/twitter/_mapping/tweet/field/message?pretty',这行命令可以看某个type的某个field的映射信息

mapping管理是运维中,索引管理中,很基础的一块。生产环境中索引应考虑禁止 Dynamic IndexMapping,避免过多字段导致 Cluster State占用过多。禁止索引自动创建的功能,创建时必须提供Mapping 或通过Index Template 进行设定。

2、索引别名管理

复制代码
curl -XPOST 'http://elasticsearch02:9200/_aliases?pretty' -d '
{
    "actions" : [
        { "add" : { "index" : "twitter", "alias" : "twitter_prod" } }
    ]
}'
 
curl -XPOST 'http://elasticsearch02:9200/_aliases?pretty' -d '
{
    "actions" : [
        { "remove" : { "index" : "twitter", "alias" : "twitter_prod" } }
    ]
}'
 
POST /_aliases
{
    "actions" : [
        { "remove" : { "index" : "test1", "alias" : "alias1" } },
        { "add" : { "index" : "test2", "alias" : "alias1" } }
    ]
}
 
POST /_aliases
{
    "actions" : [
        { "add" : { "indices" : ["test1", "test2"], "alias" : "alias1" } }
    ]
}

上面是给某个index添加和删除alias的命令,还有重命名alias的命令(先删除再添加),包括将一个alias绑定多个index

复制代码
POST /_aliases
{
    "actions" : [
        {
            "add" : {
                 "index" : "test1",
                 "alias" : "alias2",
                 "filter" : { "term" : { "user" : "kimchy" } }
            }
        }
    ]
}

DELETE /logs_20162801/_alias/current_day

GET /_alias/2016

索引别名是说可以将一个索引别名底层挂载多个索引,比如说7天的数据。索引别名常常和之前讲解的那个rollover结合起来,为了性能和管理方便,每天的数据都rollover出来一个索引,但是在对数据分析的时候,比如有一个索引access-log,指向了当日最新的数据,用来计算实时数据的; 有一个索引access-log-7days,指向了7天的7个索引,可以让我们进行一些周数据的统计和分析。

3、index settings管理

复制代码
curl -XPUT 'http://elasticsearch02:9200/twitter/_settings?pretty' -d '
{
    "index" : {
        "number_of_replicas" : 1
    }
}'
 
curl -XGET 'http://elasticsearch02:9200/twitter/_settings?pretty'

经常可能要对index做一些settings的调整,常常和之前的index open和close结合起来

4、index template管理

什么是Index Template

Index Templates - 帮助你设定 Mappings 和 Settings,并按照一定的规则自动匹配到新创建的索引之上。模版仅在一个索引被新创建时,才会产生作用。修改模版不会影响已创建的索引。你可以设定多个索引模版,这些设置会被"merge"在一起。你可以指定"order"的数值,控制"merging"的过程。

Index Template 的工作方式:

当一个索引被新创建时

应用 Elasticsearch 默认的 settings 和 mappings

应用 order 数值低的 Index Template 中的设定

应用 order 高的 Index Template 中的设定,之前的设定会被覆盖0

应用创建索引时,用户所指定的 Settings 和 Mappings,并覆盖之前模版中的设定

Demo:

创建 2个Index Templates

查看 根据名字查看 Template。

查看所有 templates,template/*

创建一个临时索引,查看replica和数据类型推断

将索引名字设为能Index Template 匹配时,查看所生成的 ndex 的 mappings 和 Settings

什么是 Dynamic Template:

根据 Elasticsearch 识别的数据类型,结合字段名称,来动态设定字段类型

所有的字符串类型都设定成 Keyword,或者关闭 keyword 字段

is 开头的字段都设置成 boolean

long_开头的都设置成 long 类型

Dynamic Template:

Dynamic Tempate 是定义在在某个索引的 Mapping 中

Template有一个名称

匹配规则是一个数组

为匹配到字段设置 Mapping

可以定义一些index template,这样template会自动应用到新创建的索引上去。template中可以包含settings和mappings,还可以包含一个pattern,决定了template会被应用到哪些index上。而且template仅仅在index创建的时候会被应用,修改template,是不会对已有的index产生影响的。

复制代码
curl -XPUT 'http://elasticsearch02:9200/_template/template_access_log?pretty' -d '
{
  "template": "access-log-*",
  "settings": {
    "number_of_shards": 2
  },
  "mappings": {
    "log": {
      "_source": {
        "enabled": false
      },
      "properties": {
        "host_name": {
          "type": "keyword"
        },
        "created_at": {
          "type": "date",
          "format": "EEE MMM dd HH:mm:ss Z YYYY"
        }
      }
    }
  },
  "aliases" : {
      "access-log" : {}
  }
}'

curl -XDELETE 'http://elasticsearch02:9200/_template/template_access_log?pretty'

curl -XGET 'http://elasticsearch02:9200/_template/template_access_log?pretty'

curl -XPUT 'http://elasticsearch02:9200/access-log-01?pretty'

curl -XGET 'http://elasticsearch02:9200/access-log-01?pretty'

index template,可能是这样子的,就是你可能会经常创建不同的索引,比如说商品,分成了多种,每个商品种类的数据都很大,可能就是说,一个商品种类一个索引,但是每个商品索引的设置是差不多的,所以干脆可以搞一个商品索引模板,然后每次新建一个商品种类索引,直接绑定到模板,引用相关的设置

相关推荐
zuozewei1 小时前
随笔之TDengine基准测试示例
大数据·时序数据库·tdengine
数据要素X4 小时前
【数据架构10】数字政府架构篇
大数据·运维·数据库·人工智能·架构
ApacheSeaTunnel5 小时前
从日志到告警,带你用好 SeaTunnel 的事件监听能力
大数据·数据集成·seatunnel·技术分享
智海观潮6 小时前
DeepSeek在大数据领域正掀起一场深刻的变革
大数据·ai·deepseek
星月昭铭7 小时前
Spring AI集成Elasticsearch向量检索时filter过滤失效问题排查与解决方案
人工智能·spring boot·spring·elasticsearch·ai
陈煜的博客7 小时前
elasticSearch 增删改查 java api
java·大数据·elasticsearch
Hello.Reader7 小时前
Rust × Elasticsearch官方 `elasticsearch` crate 上手指南
elasticsearch·rust·jenkins
zskj_zhyl8 小时前
让科技之光,温暖银龄岁月——智绅科技“智慧养老进社区”星城国际站温情纪实
大数据·人工智能·科技·生活
不辉放弃8 小时前
Spark的累加器(Accumulator)
大数据·数据库·spark
梦想养猫开书店9 小时前
36、spark-measure 源码修改用于数据质量监控
大数据·分布式·spark