ILM介绍
引入索引生命周期管理的一个最重要的目的就是对大量时序数据在es读写操作的性能优化,对于日志或指标(metric)类时序性强的ES索引,因为数据量大,并且写入和查询大多都是近期时间内的数据。可以采用hot-warm-cold架构将索引数据切分成hot/warm/cold的索引。hot阶段索引负责最新数据的读写,可使用SSD存储;warm阶段索引负责较旧数据的读取,可使用高性能磁盘存储;cold阶段索引很少被读取,可使用大容量磁盘存储。delete阶段索引将被被删除。随着时间的推移,索引数据不断从hot阶段->warm阶段->cold阶段>delete阶段迁移。针对不同阶段的索引我们还可以调整索引的主分片数,副本数,单分片的segment数等等,更好的利用机器资源。
生命周期管理四个阶段
ES索引生命周期管理分为4个阶段:hot、warm、cold、delete,其中hot主要负责对索引进行rollover操作,warm、cold、delete分别对rollover后的数据进一步处理。
阶段 | 描述 |
---|---|
hot | 主要处理时序数据的实时写入 |
warm | 可以用来查询,但是不再写入 |
cold | 索引不再有更新操作,并且查询也会很少 |
delete | 数据将被删除 |
注意:上述四个阶段不是必须同时存在。针对多数的小规模的日志场景下通常只需使用 hot 和 delete 阶段。
Elastic 节点类型配置(可选)
热节点
热节点类型的数据节点执行集群内所有的操作,节点存储的数据经常被查询,属于IO、CPU密集型操作,因而需要CPU比较空闲和装有高性能IO读写的磁盘(如SSD)的服务器支撑。
代码语言:javascript复制#配置方法
vim /etc/elasticsearch/elasticsearch.yml
#每个热节点加入如下配置并重启服务
node.attr.box_type: hot
node.attr.rack: rack1
#这两项配置是为节点增加标签,具体名称并不是写死的,与后面模板和策略配置有关
温节点
温节点类型的数据节点处理不太常用的索引(比如前一天的日志数据),这种数据查询的实时性不算高,索引为只读索引,不会有写入操作,因此不需要SSD磁盘存储,降低存储成本。
代码语言:javascript复制#配置方法
vim /etc/elasticsearch/elasticsearch.yml
#每个温节点加入如下配置并重启服务
node.attr.box_type: warm
node.attr.rack: rack1
冷节点
冷节点类型的数据适合作为归档使用,比温节点查询还要少(比如半月以上的归档日志),这种类型数据一般很少查询,并不会消耗CPU性能及IO,但是存储容量会很大,需要更低成本的存储,例如OSS或S3;ES可以使用经过fuse协议挂载的对象存储作为后端存储。
代码语言:javascript复制#配置方法
vim /etc/elasticsearch/elasticsearch.yml
#每个温节点加入如下配置并重启服务
node.attr.box_type: cold
node.attr.rack: rack1
索引生命周期处理流程
索引生命周期策略可以触发以下操作
- Rollover:当前索引达到特定大小、文档数量或周期时,创建一个新的写入索引。
- Shrink:减少索引中主分片的数量。
- force merge:触发强制合并以减少索引分片中的段数。
- Freeze:冻结索引并使其只读。
- delete:永久删除索引,包括其所有数据和元数据。
场景举例
例如日志数据输出到 Elasticsearch 集群中生成索引,可以定义一个策略,说明:
- 当索引的主分片总大小达到 50GB 时,滚动到新索引。
- warm阶段,将索引标记为只读,并将其缩小为单个分片。
- 7 天后,将索引移至冷阶段并将其移至较便宜的硬件。
- 达到所需的 30 天保留期后,删除索引。
索引生命周期实现步骤
- 创建 ILM (Index Lifecycle Management)Policy
- 创建 Index template
- Logstash 写入数据并观察 ILM 的结果
创建 ILM policy
建议使用api创建,kibana 查看编辑。
api 创建
代码语言:javascript复制PUT _ilm/policy/bash_policy
{
"policy": {
"phases": {
"hot": {
"min_age": "0ms",
"actions": {
"rollover": {
"max_size": "50gb",
"max_age": "30d",
"max_docs": 5
},
"set_priority": {
"priority": 100
}
}
},
"delete": {
"min_age": "5m",
"actions": {
"delete": {}
}
}
}
}
}
说明:热滚动更新和所属节点的冷热属性无关、即使索引模板使索引一开始分配到冷节点,但只要关联的生命周期配置了滚动更新,索引在达到触发条件时就会滚动更新。
Kibana 创建
索引生命周期管理
Rollover 滚动更新条件
索引删除阶段
ILM policy 说明
如果一个 index 的大小超过 50GB,那么自动 rollover
如果一个 index 日期已在30天前创建索引后,那么自动 rollover
如果一个 index 的文档数超过5,那么也会自动 rollover (文档数超过5仅测试使用)
在rollover后当一个 index 创建的时间超过5m,那么也自动删除(5分钟用于测试,可根据实际情况修改)
查看ILM策略
代码语言:javascript复制GET _ilm/policy/bash_policy
创建 Index template
api 创建
代码语言:javascript复制PUT _template/bash_template
{
"index_patterns": ["bash-*"],
"settings": {
"number_of_shards": 2,
"number_of_replicas": 1,
"index.lifecycle.name": "bash_policy",
"index.routing.allocation.require.data": "hot",
"index.lifecycle.rollover_alias": "bash"
}
}
模板参数介绍
PUT _template/bash_template
{
"index_patterns": ["bash-*"], #指定以 bash-* 开头的index遵循该模板规则
"settings": {
"number_of_shards": 2, #指定索引的分片
"number_of_replicas": 1, #指定索引的副本
"index.lifecycle.name": "bash_policy", #指定索引生命周期策略名称
"index.lifecycle.rollover_alias": "bash", #指定rollover别名(索引写入与读取时所用的名称)
"routing.allocation.require.box_type": "hot" #指定索引新建时所分配的节点(此项不指定会默认分配到所有节点,当没有指定节点属性时无需指定该参数)
}
}
kibana 创建模板
索引管理--索引模板--创建模板
保持默认即可
索引设置
代码语言:javascript复制{
"lifecycle": {
"name": "bash_policy",
"parse_origination_date": "true",
"rollover_alias": "bash"
},
"routing": {
"allocation": {
"require": {
"data": "hot"
}
}
},
"refresh_interval": "1s",
"number_of_shards": "2",
"number_of_replicas" : "1"
}
保持默认即可
保持默认即可
完成索引模板创建
查看模板
代码语言:javascript复制GET _index_template/bash_template
ILM 检查时间
ILM 的检查时间默认的 10 分钟,修改成 10 秒。
代码语言:javascript复制PUT _cluster/settings
{
"transient": {
"indices.lifecycle.poll_interval": "10s"
}
}
将 ILM 轮询间隔设置回其默认值,以防止主节点上出现不必要的负载。
代码语言:javascript复制PUT _cluster/settings
{
"transient": {
"indices.lifecycle.poll_interval": "null"
}
}
logstash ilm 配置
代码语言:javascript复制output{
#stdout{codec => rubydebug}
if "bash" in [tags]{
elasticsearch{
ilm_enabled => true
ilm_rollover_alias => "bash"
ilm_pattern => "000001"
ndex => "bash-%{ YYYY.MM.dd}"
ilm_policy => "secure"
#index => "secure-%{ YYYY.MM.dd}"
hosts => ["192.168.10.33:9200"]
user => "elastic"
password => "password"
}
}
}
查看索引文档数
代码语言:javascript复制GET bash-000029/_count
查看索引
代码语言:javascript复制GET _cat/indices/bash-*
查看索引状态
索引完成自动 rollover,当前操作为complete ,三分钟后索引将会被删除!
正在写入索引,当前操作为rollover
查看索引ilm策略
通过下面的api用户可以查看当前索引调用的策略处于什么阶段
代码语言:javascript复制GET bash-000029/_ilm/explain
curl 操作
查看索引
代码语言:javascript复制 curl -u elastic:password -XGET http://ip:9200/_cat/indices
集群节点
代码语言:javascript复制curl -u elastic:password http://ip:9200/_cat/nodes?v
集群健康状态
代码语言:javascript复制curl -u elastic:password http://ip:9200/_cluster/health
删除指定索引
代码语言:javascript复制curl -u elastic:password -XDELETE http://ip:9200/bash-000029
查看索引
代码语言:javascript复制curl -u elastic:password -XGET http://ip:9200/_cat/indices