ES7中,冷热分离和索引生命周期的简单实践

个人学习笔记,谢绝转载!!!

原文:https://www.cnblogs.com/wshenjin/p/15161861.html


索引生命周期管理的本质--RollOver

当现有索引被认为太大或太旧时,滚动索引API将别名滚动到新索引。
该API接受一个别名和一个条件列表。别名必须只指向一个索引。如果索引满足指定条件,则创建一个新索引,并将别名切换到指向新索引的位置。

ES索引生命周期管理分为4个阶段:hot、warm、cold、delete,其中hot主要负责对索引进行rollover操作,warm、cold、delete分别对rollover后的数据进一步处理

  • hot: 主要处理时序数据的实时写入,该阶段可以根据索引的文档数、大小、时长决定是否调用rollover API来滚动索引
  • warm: 可以用来查询,但是不再写入
  • cold: 索引不再有更新操作,并且查询也会很少
  • delete: 数据将被删除

注意:上述四个阶段不是必须同时存在(除hot阶段,其他为非必须)


一个简单的需求:将实时写入的索引写入到高性能但容量较小的节点,将不更新的历史索引转移到大容量性能不高的节点,并删除一段时间之前的索引。

配置两个节点(hot/warn)的ES集群

在配置文件中给ES节点打标签,用于区分冷热节点:

node.attr.node_type: hot    //热节点
node.attr.node_type: warn   //冷节点

效果:

GET /_cat/nodeattrs?v&h=node,attr,value
node       attr              value
es-node-01 node_type         hot
es-node-02 node_type         warn
......

配置索引模板

创建message-logs-*索引模板,并设置索引落到 hot 节点

PUT/_template/template_message_logs {
  "index_patterns": ["message-logs-*"],
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 0,
    "routing.allocation.require.node_type": "hot"
  }
}

配置定时任务

## 每天1点将前一天的日志转移到warn节点
00 01 * * * curl -XPUT -H 'Content-Type: application/json' "http://127.0.0.1:9200/message-logs-$(date +\%Y\%m\%d -d'1 day ago')/_settings?pretty" -d '{"index.routing.allocation.require.node_type": "warn"}' >/dev/null 2>&1

## 每天2点将7天前的日志删除
00 02 * * * curl -XDELETE "http://127.0.0.1:9200/message-logs-$(date +\%Y\%m\%d -d'7 day ago')" >/dev/null 2>&1

这样message-logs-yyyymmdd索引就实现了冷热分离。当天的索引写入hot节点,定时任务将前一天的所以转移到warn节点,超过7天的自动删除。

看看效果:


使用ilm策略管理索引生命周期

定义httpd日志的冷热策略

10min进行rollover,之后1h后的索引进入warm只读阶段,3h后的索引删除

PUT /_ilm/policy/policy_httpd_logs {
  "policy": {
    "phases": {
        "hot": {
            "actions": {
                "rollover": {
                    "max_age": "10ms"
                }
            }
        },
        "warm": {
            "min_age": "1h",
            "actions": {
                "allocate": {
                    "require": {
                        "node_type": "warm"
                    }
                },
                "readonly": {}
            }
        },
        "delete": {
            "min_age": "3h",
            "actions": {
                "delete": {}
            }
        }
    }
  }
}

配置索引模板,将策略应用到模板

PUT /_template/template_httpd_logs {
  "index_patterns": ["httpd-logs-*"],
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 0,
    "index.lifecycle.name": "policy_httpd_logs",           
    "index.lifecycle.rollover_alias": "httpd-logs-alias",  
    "routing.allocation.require.node_type": "hot"          
  }
}
  • index.lifecycle.name, 使用该模版创建的索引统一用“policy_httpd_logs”策略
  • index.lifecycle.rollover_alias, 使用该模版创建的索引统一用“httpd-logs-alias”的别名进行管理
  • index.routing.allocation.require.{attribute}, 使用该模版创建的索引统一分配在hot节点

手动创建第一个索引,并设置别名

索引创建的名称应该是以 “-00001”等可自增长的字段结尾,否则策略不生效

PUT/httpd-logs-000001 {
  "settings" : {
     "number_of_shards":3,
     "number_of_replicas":0
  },
  "aliases": { 
    "httpd-logs-alias" : {
        "is_write_index": true
    }
  }
}

看看效果:


学习参考

https://www.cnblogs.com/runnerjack/p/12758658.html
https://www.cnblogs.com/mikelaowang/p/13345318.html
https://www.cnblogs.com/small-k/p/8872423.html
https://blog.csdn.net/wwd0501/article/details/105118113/
https://blog.csdn.net/jiao_fuyou/article/details/50511255

posted @ 2021-08-19 15:06  wshenJin  阅读(1124)  评论(0编辑  收藏  举报