ES 索引的生命周期管理

简介

ES最早在6.8版本在X-pack套件中引入了索引生命周期管理功能。在此之前,索引的生命周期管理往往是利用定时任务加脚本,或者是第三方方案进行实时的。

与其他方案相比,x-pack的索引生命周期管理(ILM)模块具有支持功能全面(支持索引的创建,关闭,删除,更新配置,aliased-rotate等功能)在不需要其他工具支持下具备定时任务,高可用和跨集群管理等能力,并且支持全部ES版本的索引。此外,在使用kibana的情况下,拥有图形化的管理界面。

最重要的一点是,该方案是包含在免费的x-pack基本授权内的。

制定ILM规则

用户可以使用Kibana的图形界面,或者使用ES的ILM API定义多套规则。

PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
            "max_size": "25GB" 
          }
        }
      },
      "delete": {
        "min_age": "30d",
        "actions": {
          "delete": {} 
        }
      }
    }
  }
}

上面这段来自ES官方网站的文档,使用了PUTAPI定义了一条ILM规则,这个规则中定义了2个阶段:hotdelete

  1. hot阶段,会在索引大小达到25GB时对索引做rollover操作。
  2. 当索引的存在时间达到30天时,索引进入delete阶段,在此阶段,索引会被删除。

在ILM规则被指定后,需要将ILM规则和索引模板相关联:

PUT _template/my_template
{
  "index_patterns": ["test-*"], 
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1,
    "index.lifecycle.name": "my_policy", 
    "index.lifecycle.allocation.require.box_type": "hot",
    "index.lifecycle.rollover_alias": "test-alias"
  }
}

如上:

  1. 该模板适用于所有前缀为"test-"的索引。

  2. 使用index.lifecycle.name设置规则名称为"my_policy"

  3. 设置该索引需要分配在拥有box_typehot的节点上。

  4. 使用index.lifecycle.rollover_alias设置进行rollover的索引别名为"test-alias"

在设置完成后,创建一个索引开始生命周期管理。

PUT test-000001
{
  "aliases": {
    "test-alias":{
      "is_write_index": true 
    }
  }
}

需要注意的是,在创建这个索引时,我们将这个索引的alias设成了"test-alias",并将其写入属性"is_write_index"置为true

ILM的4个阶段

image-20200309205748714.png

如图所示,ILM拥有4个阶段:

Hot:索引写入和查询阶段。

Warm:索引不再被写入,但是会被查询阶段。

Cold:索引不再被写入,并且查询量也很少的阶段。

Delete:索引生命周期的完结,可以被从磁盘删除。

其中,Hot阶段是设置ILM规则必备的,而其他几个阶段属于可选。在规则的设置中,每个阶段都有一个"min_age"来控制每个阶段的进入时间点,如果不做设置,这个值默认为0ms。

ILM规则检测周期由集群的配置indices.lifecycle.poll_interval进行设置,默认值是10分钟。设置方法:

PUT _cluster/settings
{
  "persistent": {
    "indices.lifecycle.poll_interval":"10s"
  }
}

这里将检测周期设置成了10秒钟。

几个重要的操作

ES的运行对内存和硬盘IO的较为敏感,而内存及SSD也往往是成本较高的硬件部件。在实际运维中,可以通过给节点打上hot,warm等标签来进行冷热节点设置。为hot节点提供较高的内存配置并配备SSD,而在warm节点用大容量的机械硬盘用来存储大量不常使用的数据。在数据的生命周期结束时,删除索引以节省硬盘空间。

ILM在这几个阶段提供了一些操作,来完成索引生命阶段的重要行为。

rollover:在hot阶段防止单个索引体积过大,文档数量过高,或者写入事件过长。

allocate:在warm或者cold阶段,将索引转移到cold节点上,并更改其备份数。

shrink: 在warm阶段对分片进行合并,减少体积。

delete:在delete阶段,即索引的生命终点将其删除。

本文只讨论单个集群中的行为。

rollover

ES的索引API提供了rollover功能,而ILM的Hot阶段中的rollover操作的功能与之完全一致。由于索引的API只能由外部程序主动触发,需要另外编写定时任务或者脚本执行,因此ILM中的rollover操作在使用方面更加便利。

PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover" : {
            "max_age": "7d",
            "max_size": "100GB"
          }
        }
      }
    }
  }
}

Rollover Action拥有3个可选参数:

max_size:索引的最大容量

max_docs:索引中包含的最大文档数

max_age:索引存在时间

配置Rollover 操作时,需要设置上面三个参数中的一个或多个。

allocate

allocate操作允许ILM在索引进入Warm或者Cold阶段时,指定其节点以及备份个数。

number_of_replicas: 指定索引备份个数。

require: 分配的节点必须包含的属性标签。

exclude: 分配的节点不能拥有的属性标签。

include: 分配的节点需要拥有include指定的属性标签之一。

这4个属性必须指定一个,否则规则设置会失败。

PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "warm": {
        "actions": {
          "allocate" : {
            "number_of_replicas": 1,
            "require" : {
              "box_type": "cold"
            }
        }
        }
      }
    }
  }
}

上述操作,将索引的备份数设为1,并且将其分配到cold节点上。

Shrink

Shrink操作能够减少索引的分片数,与索引操作的同名操作一样,源索引的分片数需要是目标索引的分片数的整数倍,比如说,在Hot阶段,索引有6个分片,那么在Warm阶段,只能指定将其缩减为3,2或者1个分片。同时,目标节点需要拥有足够的磁盘空间。缩减后的索引的单个分片要满足单个索引分片数的文档数限制。

number_of_shards:指定分片数,该属性必须被设置。

在该操作被运行时,该索引会被设为read-only。

example:

PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "warm": {
        "actions": {
          "shrink" : {
            "number_of_shards": 1
          }
        }
      }
    }
  }
}

Delete

在索引生命的终点将其删除,只能在Delete阶段被执行。该操作没有额外的参数。

example:

PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "delete": {
        "actions": {
          "delete" : { }
        }
      }
    }
  }
}

启动/关闭以及检查ILM的状态

ILM的提供了API对其状态进行检查:

检查状态

GET _ilm/status

ILM会拥有三个状态:running,stopping,stopped

其中stopping表明ILM已经接收到了停止的指令,但还有一些请求未执行完成。

关闭ILM的API:

POST _ilm/stop

启动ILM的API:

POST _ilm/start

小结

ES x-pack的生命周期管理功能提供了一种优雅的方式对集群的索引进行管理,并且完美地适配了冷热节点的设置,在将来一定会逐渐取代当前的索引管理方式。

本文样例均来自ElasticSearch官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.1/index-lifecycle-management.html
有少量改动。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335