EleasticSearch 线上大索引按日期分割

1. 背景

由于项目初期设计问题,采集到es的业务日志只使用了一个索引(index),随着线上日志量的增长,es很快飙升到磁盘警戒线,网上找了一圈,很多文章版本都比较老旧,最终直接啃官方文档,没有copy别人博客,如果你中途不走神,本文总共15min。version 适用于es 6.0+

本文前提保障:

  1. 文档中有时间字段,方便按日期切割
  2. 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都可以单独

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值