1. 背景
由于项目初期设计问题,采集到es的业务日志只使用了一个索引(index),随着线上日志量的增长,es很快飙升到磁盘警戒线,网上找了一圈,很多文章版本都比较老旧,最终直接啃官方文档,没有copy别人博客,如果你中途不走神,本文总共15min。version 适用于es 6.0+
本文前提保障:
- 文档中有时间字段,方便按日期切割
- index的
mapping
配置中,_source
需为true
(默认),以保证es存入了源文档,而不仅仅是docId,便于执行reindex!
curl -XGET "localhost:9200/your_index_name/_mapping"
# 如果没有显示 _source, 代表"_source": false
2. 删文档(不建议)
这第一个想到的方法,将最老旧的日志删掉,如只保留近3个月的,采用 delete_by_query
接口
curl -X POST "localhost:9200/twitter/_delete_by_query" -H 'Content-Type: application/json' -d'
{
"query": {
"range" : {
"day" : {
"lt" : "2018-12-01"
}
}
}
}
'
但是,es的delete,并不是真正的物理删,磁盘使用率(utilization)并不会下降。删除的文档仅仅被标记,es将文档存入一个个segment file中,其file数量随着文档的写入不断增加,es因此会有合并segment file的操作,将多个小的segment合并成一个大的segment file,当segment合并的时候,标记的文档才会真正的物理删除。
这种方案,只适合在 项目早期、文档量少、且机器负载不高 情况下进行,因为批量读写会导致cpu utilization的飙升,造成系统负载加重,可以在晚上业务量不高的时候进行
3. 磁盘扩容 (短期有效)
那如果标记删除不能立即解决问题,那就对磁盘扩容吧!1T 到 2T,2T 到 4T,由于升级磁盘需要重启机器,所以,如何做到优雅滚动关停es至关重要!
3.1 停止es集群服务
常见就是ps
看一下es的进程,然后kill
,先等一下!在此之前,需对集群进行配置,方便更加快速的服务重启
3.1.1 停止分片分配
由于es中的index是分布式存储,所以一个index分成了多个shard,分布在各个节点node上,每个shard都可以单独