二丫讲梵 二丫讲梵
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)

二丫讲梵

行者常至,为者常成
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)
  • Nexus系列文章

  • Jenkins系列文章

  • ELK笔记

    • ELK

    • FileBeat

    • LogStash

    • ElasticSearch

      • elasticsearch高可用的探索
      • elasticsearch索引管理
      • elasticsearch配置等优化
      • elasticsearch-7-x使用xpack进行安全认证
      • elasticsearch的mapping
      • elasticsearch的日常维护参数
      • elasticsearch-ILM-索引生命周期管理探微
        • 1,快速体验
          • 1,创建索引策略
          • 2,创建索引模板
          • 3,创建索引
          • 4,配置 lifecycle 检测时间
          • 5,功能验证
        • 2,索引策略详解
        • 3,正式应用
          • 1,创建索引策略
          • 2,创建索引模板
          • 3,创建索引
        • 4,参考
      • 如何优雅地下掉一台es节点
    • Kibana

  • Kubernetes笔记

  • LLM专题

  • 系列专题
  • ELK笔记
  • ElasticSearch
二丫讲梵
2020-07-29
目录

elasticsearch-ILM-索引生命周期管理探微

文章发布较早,内容可能过时,阅读注意甄别。

索引生命周期管理将会是 es 维护管理中重要的一环,生产中已经有一个集群用的 7.x 版本,一直也没有使用自带的生命周期管理工具,今天就来研究一下,现在先通过简单的例子来理解这个功能以及用法。

# 1,快速体验

# 1,创建索引策略

我们可以在 kibana 设置的图形界面里配置索引策略,但是使用工具来进行管理维护显得更加方便便捷。

PUT _ilm/policy/eryajf_policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
              "rollover":{
                  "max_age":"30s"
              }
        }
      },
      "delete": {
        "min_age": "90s",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

这里为了演示方便,定义了索引在hot节点保留10s,然后就会触发滚动策略到delete阶段,到delete阶段之后,保留60s左右,就会删除,在这个过程中,我们能够比较清晰地看到索引在声明周期中的变化。

# 2,创建索引模板

PUT _template/template_eryajf
{
  "index_patterns": ["eryajf*"],
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1,
    "index.lifecycle.name": "eryajf_policy",
    "index.lifecycle.rollover_alias": "eryajf"
  }
}
1
2
3
4
5
6
7
8
9
10
  • index_patterns: 索引以 eryajf 开头的自动采用settings的配置,事实上这里还可以加入 mapping 等的的配置,不是本文重点,不再赘述。
  • index.lifecycle.name:表示采用 eryajf_policy这个策略
  • index.lifecycle.rollover_alias:表示索引滚动策略基于eryajf这个别名进行管理,注意,这个别名相当重要。

# 3,创建索引

此处需要注意的是,创建的索引后缀需要带有数字并以中横杠分割,否则在策略应用的时候会报如下错误:

illegal_argument_exception: index name [liql-test] does not match pattern '^.*-\d+$',至少在我当前使用的版本当中,是有这样一个限制的,亦即:索引必须以中横杠分割且以数字结尾。

PUT eryajf-1
{
  "aliases": {
    "eryajf": {
      "is_write_index": true
    }
  }
}
1
2
3
4
5
6
7
8

# 4,配置 lifecycle 检测时间

PUT _cluster/settings
{
  "transient": {
    "indices.lifecycle.poll_interval": "10s"
  }
}
1
2
3
4
5
6

默认策略轮询时间间隔为十分钟,这里改成 10 秒,是为了方便观察滚动效果。

# 5,功能验证

实际操作之前,首先来描述下将要操作与验证的流程:

  1. 查看当前情况。
  2. 往索引写入 3 条数据,间隙赶忙观察索引状态变化。
  3. 看到索引已经成功轮替之后,再往索引写入 6 条数据,注意数据落点在何处。
  4. 然后再多观察几轮,就能大概体会生命周期管理的意义了。

验证之前,可以先看一下当前索引状况:

然后批量写入几条数据,注意这个地方,写数据的索引是 eryajf,也就是上边配置的别名。实际生产当中,也应该往这个别名里写内容,而非其他。

PUT /eryajf/_doc/_bulk
{"index":{}}
{"message":"hello-01"}
{"index":{}}
{"message":"hello-02"}
{"index":{}}
{"message":"hello-03"}
1
2
3
4
5
6
7

此时通过如下命令进行观测:

GET eryajf-*/_ilm/explain
1

记得及时观测变化情况,重点是数据落脚点,此时落到了新的滚动索引 eryajf-000002上。

稍微等一下,看到再次滚动之后,再写入 6 条数据:

PUT /eryajf/_doc/_bulk
{"index":{}}
{"message":"hello-01"}
{"index":{}}
{"message":"hello-02"}
{"index":{}}
{"message":"hello-03"}
{"index":{}}
{"message":"hello-04"}
{"index":{}}
{"message":"hello-05"}
{"index":{}}
{"message":"hello-06"}
1
2
3
4
5
6
7
8
9
10
11
12
13

然后观测数据落脚点,可以看到落到了新的轮替索引上了,就是如此轮替的一个方案。

大概经过 15 秒之后,可以看到索引名称更新了,新的索引名叫 然后再过 30 秒左右,数据也就被删除了。

# 2,索引策略详解

  • 策略可以定义四个阶段
    • hot
    • warm
    • cold
    • delete
  • 滚动的依据有三种情况
    • max_age:在当前阶段索引保留最长时间(以索引创建时间为准)
    • max_size:在当前阶段索引保留最大大小
    • max_docs:在当前阶段索引保留最多文档数

一个相对完整的索引策略如下:

PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
            "max_age": "7d",    //rollover前距离索引的创建时间最大为7天
            "max_size": "50G",  //rollover前索引的最大大小不超过50G
            "max_docs": 1,      //rollover前索引的最大文档数不超过1个(测试用)
          }
        }
      },
      "warm": {
        "min_age": "30d",       //rollover之后进入warm阶段的时间不小于30天
        "actions": {
          "forcemerge": {
            "max_num_segments": 1   //强制分片merge到segment为1
          },
          "shrink": {
            "number_of_shards": 1   //收缩分片数为1
          },
          "allocate": {
            "number_of_replicas": 2 //副本数为2
          }
        }
      },
      "cold": {
        "min_age": "60d",       //rollover之后进入cold阶段的时间不小于60天
        "actions": {
          "allocate": {
            "require": {
              "type": "cold"    //分配到cold 节点,ES可根据机器资源配置不同类型的节点
            }
          }
        }
      },
      "delete": {
        "min_age": "90d",       //rollover之后进入cold阶段的时间不小于60天
        "actions": {
          "delete": {}
        }
      }
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

可根据实际情况进行调整配置。

# 3,正式应用

操作流程大概应该如下,先创建索引策略,然后创建索引模板,接着创建一个索引,然后往索引模板中定义的别名写数据就可以了。

# 1,创建索引策略

PUT _ilm/policy/shop-policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
              "rollover":{
                  "max_age":"30d"
              }
          }
      },
      "delete": {
        "min_age": "30d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

这里定义了两个阶段,hot 阶段保留 30 天,然后进入 delete 再保留 30 天。亦即索引保留 60 天。

# 2,创建索引模板

PUT _template/template_shop
{
  "index_patterns": ["shop*"],
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1,
    "index.lifecycle.name": "shop-policy",
    "index.lifecycle.rollover_alias": "shop"
  }
}
1
2
3
4
5
6
7
8
9
10

# 3,创建索引

PUT shop-1
{
  "aliases": {
    "shop": {
      "is_write_index": true
    }
  }
}
1
2
3
4
5
6
7
8

需要注意这个索引并非最终写入端使用的索引,别名才是,这个索引只是为了滚动所需。注意命名要求。

因为别名是匹配的,因此会自动应用上前边创建的策略,此时写入方指定的索引名为 shop,对,就是上边定义的索引别名。

在这个索引创建 30 天之后,就会触发rollover,将老的数据定义到delete阶段,然后新建一个索引,名字应该为:shop-000002,再过 30 天之后,shop-000002会进入 delete 阶段,并生成shop-000003 ,然后 shop-1会被删除,如此循环往复下去。

之前被别名以及索引绕来绕去,快整晕了,目前来看,至少当前这种思路是可行可用的。如果你有更好的思路,可以分享一下哦。

# 4,参考

  • https://elasticsearch.cn/article/6358
微信 支付宝
#elk#elasticsearch
上次更新: 2024/07/04, 22:40:37
elasticsearch的日常维护参数
如何优雅地下掉一台es节点

← elasticsearch的日常维护参数 如何优雅地下掉一台es节点→

最近更新
01
学习周刊-总第212期-2025年第21周
05-22
02
从赵心童世锦赛夺冠聊聊我的斯诺克情缘
05-16
03
学习周刊-总第211期-2025年第20周
05-15
更多文章>
Theme by Vdoing | Copyright © 2017-2025 | 点击查看十年之约 | 浙ICP备18057030号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式