更新时间:2024-11-29 GMT+08:00

索引生命周期管理

操作场景

用户基于时间管理索引,可以定期对旧索引执行某些操作(例如减少副本或者删除索引),来保持集群中有充足的资源。索引生命周期管理插件允许用户根据索引的存在时间、大小、文档量来定期触发管理操作,从而实现自动化管理。

基本概念

描述

policy

索引生命周期中定义的策略

states

描述索引当前所处的状态,例如热状态、冷状态

actions

指策略进入某个状态时依次执行的动作

conditions

指状态之间转移需要满足的条件

策略常用命令

常用操作

命令

查看policy_1策略的内容

GET _opendistro/_ism/policies/policy_1

删除index_1索引的策略

POST _opendistro/_ism/remove/index_1

修改index_1索引的策略

POST _opendistro/_ism/change_policy/index_1

重试index_1中的close状态

POST _opendistro/_ism/retry/index_1

{

"state": "close"

}

查看index_1索引中的策略的执行情况

GET _opendistro/_ism/explain/index_1

删除policy_1策略

DELETE _opendistro/_ism/policies/policy_1

支持的Action列表

action

作用

注意

rollover

索引按照预设的文档条数、索引年龄、索引大小来滚动生成新的索引

设置rollover的索引的名字需要满足^.*-\d+$的正则,例如logs-000001,需要为该索引设置别名,将别名的is_write_index属性设置为true,并且需要将opendistro.index_state_management.rollover_alias参数的值设置为该别名

open

打开索引

-

close

关闭索引

-

read_only

将索引设置为只读状态

-

read_write

将索引恢复为可写状态

-

replica_count

缩减副本的数量

-

index_priority

设置索引的恢复优先级,数值越高,优先级越高

-

freeze_index

将索引设置为冻结状态

-

unfreeze_index

去掉索引的冻结状态

-

allocation

将冷索引迁至冷实例,实现冷热分离

  • 首先将部分实例配置为warm实例或者clod实例,用来存储冷索引
  • warm实例数需要大于集群中分片数最大的索引的分片数,否则可能会导致部分适配无法分配

shrink

减少索引的主分片个数

shrink操作会将所有的主分片迁移至同一实例,请确保该索引的分片所在的实例磁盘上有充足的空间

主分片缩减的个数必须是源索引分片总数的一个因数,例如一个8个主分片的索引可以缩减至4个或者2个或者1个主分片,如果是主分片数为质数,则只能shrink至1个主分片

在shrink操作执行成功后,索引名字将会变更为shrink-原索引名的形式,原索引的名字作为shrink后索引的别名

不推荐使用

snapshot

给索引创建快照

快照操作需要预先创建好仓库,不推荐使用

force_merge

对索引执行段合并

在较大数据量下段合并耗时较长,不推荐使用

delete

删除索引

删除操作,若配置不当,可能会导致数据误删,请谨慎配置

开源open distro插件的ISM功能介绍,请参考https://opendistro.github.io/for-elasticsearch-docs/docs/ism/。

conditions常用参数介绍

参数

描述

类型

min_index_age

索引至少创建多长时间后,可以触发转换。可选参数。

string

min_doc_count

索引中至少包含多少文档数,可以触发转换。可选参数。

number

min_size

索引中主分片存储总量(不包括副本)至少为多少,可以触发转换。可选参数。

例如,如果将“min_size”参数设置为100GB,并且索引有5个主分片和5个副本分片,每个分片20GB,则所有主分片的总大小为100GB,因此索引将转换到下一个state。

string

min_step_age

上个state结束后等待多长时间转换进入下一个state。可选参数。

string

使用样例

  1. 创建策略。

    PUT  _opendistro/_ism/policies/default_policy
    {
        "policy":{
            "description":"this policy is for all action.",
            "default_state":"hot",
            "states":[
                {
                    "name":"hot",
                    "actions":[
                        {
                            "index_priority":{
                                "priority":10
                            }
                        },
                        {
                            "rollover":{
                                "min_size":"1tb",
                                "min_doc_count":"1000000000",
                                "min_index_age":"1d"
                            }
                        }
                    ],
                    "transitions":[
                        {
                            "state_name":"warm",
                            "conditions":{
                                "min_index_age":"15d"
                            }
                        }
                    ]
                },
                {
                    "name":"warm",
                    "actions":[
                        {
                            "index_priority":{
                                "priority":5
                            }
                        },
                        {
                            "read_only":{
    
                            }
                        },
                        {
                            "allocation":{
                                "require":{
                                    "temperature":"warm"
                                }
                            }
                        },
                        {
                            "force_merge":{
                                "max_num_segments":1
                            }
                        }
                    ],
                    "transitions":[
                        {
                            "state_name":"cold",
                            "conditions":{
                                "min_index_age":"60d"
                            }
                        }
                    ]
                },
                {
                    "name":"cold",
                    "actions":[
                        {
                            "index_priority":{
                                "priority":1
                            }
                        },
                        {
                            "freeze_index":{
    
                            }
                        },
                        {
                            "shrink":{
                                "number_of_shards":10
                            }
                        }
                    ],
                    "transitions":[
                        {
                            "state_name":"close",
                            "conditions":{
                                "min_index_age":"90d"
                            }
                        }
                    ]
                },
                {
                    "name":"close",
                    "actions":[
                        {
                            "close":{
    
                            }
                        }
                    ]
                }
            ],
            "ism_template":{
                "index_patterns":[
                    "indextest*"
                ],
                "priority":100
            }
        }
    }

    绑定策略到索引。

    在完成策略创建后,需要将策略应用到一个或者一组索引上。也可以将策略设置到索引模板中,来使新建的索引应用该策略。

    创建第一个索引时指定策略和别名:

    PUT indextest-000001
    {
      "settings": {
        "opendistro.index_state_management.policy_id": "policy_id",
        "opendistro.index_state_management.rollover_alias": "indextest"
      },
      "aliases": {
        "indextest": {
          "is_write_index": true
        }
      }
    }
    • 若policy中配置了shrink,需要提前将“cluster.routing.allocation.same_shard.host”设置为“false”。这是因为shrink操作需要将所有分片迁移到一个实例上,但是“cluster.routing.allocation.same_shard.host”“true”时,不允许所有实例迁移到统一实例上,使得shrink无法执行。

      修改“cluster.routing.allocation.same_shard.host”的命令如下:

      PUT _cluster/settings{ "persistent": { "cluster.routing.allocation.same_shard.host":"false" }}

    • 如果需要使用滚动索引,索引名必须满足^.*-\d+$的正则。
    • 需要自行创建第一个符合命名规范的索引,后续写入、查询时均使用索别名即可。

    将策略添加至索引模板:

    PUT _template/<template_name>
    {
      "index_patterns": ["indextest*"],                 
      "settings": {      
        "index.opendistro.index_state_management.policy_id": "policy_id",
        "index.opendistro.index_state_management.rollover_alias":"indextest" 
      }
    }
    • 请针对不同的业务场景设置合理的index_patterns,请勿将index_patterns配置为*。
    • policy_id中不能包含#等特殊字符。

    将策略添加至集群中已存在的索引:

    PUT /indextest-000001/_settings?pretty
    {
      "opendistro.index_state_management.policy_id": "policy_id",
      "opendistro.index_state_management.rollover_alias": "indextest"
    }
    POST /_aliases
    {
      "actions": [
        {
          "add": {
            "index": "indextest-000001",
            "alias": "indextest",
            "is_write_index": true
          }
        }
      ]
    }
    • 新增的策略只有在集群yellow或者green的状态下才会调度,若集群处于red状态,请先修复状态为red的索引。
    • 如果需要使用滚动索引,索引名必须满足^.*-\d+$的正则。

冷热分离配置样例

  1. 新建warm实例组。

    登录“Manager”页面,选择“集群 > 待操作集群的名称 > 服务 > Elasticsearch > 实例组”,分别在EsNodeX下面单击,“组名称”为warm,单击“确定”,创建一个warm实例组。

  2. 为实例组添加实例。

    在EsNodeX“基本”页面选择要设置为warm的实例,单击“移动”,“目标实例组”选择“warm”,单击“确定”,将实例移动至新建的warm实例组中。

  3. 为warm实例打上warm标签。

    在新建的warm实例组中选择“配置 > 全部配置 > 冷热模式”,将“node.attr.temperature”参数的值设置为“warm”。

  4. 重启warm实例

    重启warm组的实例后,warm配置生效。