Elasticsearch能否定期聚合数据存储至其他索引,实现登录统计数据持久化?
ES原生支持直接在内部完成聚合并持久化存储,不需要额外写crontab脚本拉取再写入,根据你使用的ES版本可以选两种方案:
方案1:使用Transform功能(ES 7.2及以上版本首选,最优解)
Transform是ES官方推出的专门做预聚合、数据降采样留存的内置功能,完全适配你的场景,不需要额外维护调度逻辑,稳定性远高于自定义crontab脚本:
- 源索引匹配
login-*全量登录明细索引,按天做日期直方图分组,分别聚合成功、失败的登录次数 - 聚合结果直接写入独立的统计索引
login_stats_daily,后续你用Curator清理原始login-*索引完全不会影响统计索引的数据 - 配置为连续运行模式后,Transform会自动做增量聚合,新的日志产生后会自动同步到统计索引,内置重试、错误检查机制
创建Transform的示例请求如下:
PUT _transform/login-daily-stats { "source": { "index": "login-*" }, "dest": { "index": "login_stats_daily" }, "pivot": { "group_by": { "date": { "date_histogram": { "field": "login_time", "calendar_interval": "day", "format": "yyyyMMdd" } } }, "aggregations": { "success": { "filter": { "term": { "login_status": "success" } } }, "fail": { "filter": { "term": { "login_status": "fail" } } } } }, "sync": { "time": { "field": "login_time", "delay": "60m" } } }
创建完成后执行启动请求即可:POST _transform/login-daily-stats/_start
方案2:Ingest Pipeline + ILM/定时任务实现(ES 7.2以下版本可选)
如果你的ES版本较低没有Transform功能,也不用自己写脚本拉取数据,直接调用ES内置的_reindex接口完成聚合写入,全链路在ES内部执行,性能远高于外部拉取再写入:
- 你现有的Curator清理原始索引的逻辑可以完全保留不用修改
- 每天定时调用一次
_reindex接口,把前一天的聚合结果写入统计索引即可,哪怕你还是用crontab调度这个请求,也比你自己解析聚合结果再写入要简单稳定很多
示例请求如下:
POST _reindex { "source": { "index": "login-*", "query": { "range": { "login_time": { "gte": "now-1d/d", "lt": "now/d" } } }, "aggs": { "daily_stats": { "date_histogram": { "field": "login_time", "calendar_interval": "day", "format": "yyyyMMdd" }, "aggs": { "success": {"filter": {"term": {"login_status": "success"}}}, "fail": {"filter": {"term": {"login_status": "fail"}}} } } }, "size": 0 }, "dest": { "index": "login_stats_daily" } }
内容的提问来源于stack exchange,提问作者shichen
相关产品推荐
相关产品推荐

