美文网首页说说Elasticsearch那点事
ES 索引的生命周期管理

ES 索引的生命周期管理

作者: 饿虎嗷呜 | 来源:发表于2020-03-09 22:53 被阅读0次

    简介

    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
    有少量改动。

    相关文章

      网友评论

        本文标题:ES 索引的生命周期管理

        本文链接:https://www.haomeiwen.com/subject/ttcvdhtx.html