一般在使用ELK对日志进行收集时,为了避免单个索引文件过大,通常按日期来对日志做切割,根据日期对产生的日志生成相应的索引。
索引名称通常如下方所示:
nginx_log-2022.01.01
nginx_log-2022.01.02
nginx_log-2022.01.03
nginx_log-2022.01.04
nginx_log-2022.01.05
上方是从nginx采集过来的数据以天为单位来生成索引文件,从而避免索引过大影响查询效率。
该方案虽然解决了单个索引文件过大的问题,但是对于日志文件在ES中只需保留15到30天,时间再长的数据也没有多大的应用价值,同时创建大量的索引也会严重影响ES的查询效率。
所以能够定时清理已经没有价值的数据已经成为了管理ES必要之举。
本篇将通过创建随日期而变动的索引和ILM(生命周期管理)策略进行结合使用来达到有效管理ES索引的效果。
如果对Elasticsearch索引生命周期管理不是太熟悉的可以查看以下文章:
Elasticsearch索引生命周期管理
Elasticsearch | logstash | Kibana | |
---|---|---|---|
192.168.159.128 | √ | √ | √ |
192.168.159.135 | √ | × | × |
说明
通过logstash采集日志数据,输出到Elasticsearch集群,要求如下:
(1)创建索引,设置索引别名为nginx_log
# 删除索引名称为nginx_log开头的索引信息
DELETE nginx_log*
# 创建索引
PUT /%3Cnginx_log-%7Bnow%2Fd%7D-000001%3E
{
"aliases": {
"nginx_log":{
"is_write_index": true
}
}
}
日期数学字符的百分比编码(用于日期舍入的特殊字符必须按如下方式进行URI编码)
< | %3C |
---|---|
> | %3E |
/ | %2F |
{ | %7B |
} | %7D |
| | %7C |
+ | %2B |
: | %3A |
, | %2C |
(2)创建索引策略
# 索引策略名称为nginx_log_ilm_policy
PUT /_ilm/policy/nginx_log_ilm_policy
{
"policy": {
"phases": {
"hot": {
"actions": {}
},
"warm": {
"min_age": "3d",
"actions": {
"allocate": {
"number_of_replicas": 0
}
}
},
"delete": {
"min_age": "12d",
"actions": {
"delete": {}
}
}
}
}
}
说明
也可以直接操作Kibana界面来创建索引策略
(3)创建对应模板,将新的index自动添加到创建的索引策略中
# 创建索引模版名称为nginx_log_ilm_template
PUT _template/nginx_log_ilm_template
{
"index_patterns": ["nginx_log-*"],
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1,
"index.lifecycle.name":"nginx_log_ilm_policy",
"index.lifecycle.rollover_alias": "nginx_log"
}
}
说明
参数 | 说明 |
---|---|
index_patterns | 模版匹配的索引名以,支持模糊匹配 |
number_of_shards | 主分片数量 |
number_of_replicas | 副本分片数量 |
index.lifecycle.name | 通过索引策略名称指定模版所匹配的索引策略 |
index.lifecycle.rollover_alias | 索引别名 |
(4)修改logstash配置文件,使其随日期变动向Elasticsearch相应索引中写入数据
input {
#beats {
# port => 5044
#}
file{
path => "/home/es/datas/nginx_log.txt"
}
}
output {
elasticsearch{
hosts => ["http://localhost:9200"]
ilm_enabled => true
ilm_rollover_alias => "nginx_log"
ilm_pattern => "nginx_log-{now/d}-000001"
ilm_policy => "nginx_log_ilm_policy"
}
}
说明
字段 | 参数类型 | 说明 |
---|---|---|
hosts | uri | 设置远程实例的主机 |
ilm_enabled | string, one of [“true”, “false”, “auto”] | auto如果Elasticsearch为7.0.0以上版本,且启用了ILM功能则默认设置为会自动启用索引生命周期管理功能,否则将其禁用。 |
ilm_rollover_alias | string | 过渡别名 |
ilm_pattern | string | 模式中指定的值将附加到写别名,并在ILM创建新索 |
ilm_policy | string | 修改此设置以使用自定义的索引生命周期管理策略,而不是默认策略。 |
template | a valid filesystem path | 可以在此处将路径设置为自己的模板 |
template_name | string | 定义如何在Elasticsearch中命名模板 |
template_overwrite | boolean | 选项总是会用Elasticsearch中指定的模板或包含的模板覆盖指定的模板 |
timeout | number | 发送到Elasticsearch的请求的超时限制 |
本次使用logstash来监听nginx_log.txt文件来实现数据的写入操作,在生产环境中可以换成监听beats端口。
(5)查看索引策略是否生效
GET nginx_log-*/_ilm/explain
输出结果
{
"indices" : {
"nginx_log-2021.12.28-000001" : {
"index" : "nginx_log-2021.12.28-000001",
"managed" : true,
"policy" : "nginx_log_ilm_policy",
"lifecycle_date_millis" : 1640677049077,
"phase" : "hot",
"phase_time_millis" : 1640677053712,
"action" : "complete",
"action_time_millis" : 1640677053627,
"step" : "complete",
"step_time_millis" : 1640677053712,
"phase_execution" : {
"policy" : "nginx_log_ilm_policy",
"phase_definition" : {
"min_age" : "0ms",
"actions" : { }
},
"version" : 1,
"modified_date_in_millis" : 1640677053489
}
}
}
}
通过:操作->查看链接到策略的索引,查看具体生效的索引策略