es对日志数据进行索引生命周期管理

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: es对日志数据进行索引生命周期管理

前言


在采用ELK分布式日志采集平台的时候,一般都会采用ES来存储采集的日志信息。日志信息一般都是持续增长的,是典型的时序数据。

如果不对采集的日志数据做生命周期管理,很容易导致单个索引体积持续增长、查询速度越来越慢、过期的日志信息浪费空间等问题。


本节主要介绍如果通过ES中的索引生命周期管理机制ILM来实现对日志数据的管理。


一、说明


es可以用来存储日志,一般日志存储只是短期保存,超过一定时间日志要是能自动删除最好,这样保证索引文档不会过多,查询时效性也能得到保证。


索引的生命周期分为四个阶段:HOT->WARM->COLD->Frozen->DELETE。


上面除了HOT为必须的阶段外,其他为非必须阶段,可以任意选择配置。


因为日志索引只要满足自己删除功能,所以下文只配置了HOT与DELETE阶段。


三步实现完成es生命周期管理:

配置策略(policy)->索引模版(template)->索引(index)


二、实战


1.配置策略

说明:

创建策略log_policy,包含2个阶段hot和delete。

hot阶段:数据写入首先进入hot阶段,包含一个回滚的动作,当记录条数达到3时滚动一次,创建一个新的后备索引。

delete阶段:滚动发送后30s,执行删除动作。

PUT _ilm/policy/log_policy
{
  "policy": {
    "phases": {
      "hot": {                                
        "actions": {
          "rollover": {
            "max_docs":3
          }
        }
      },
      "delete": {
       "min_age": "30s",                     
        "actions": {
          "delete": {}                        
        }
      }
    }
  }
}


2.创建索引模板

PUT _index_template/log_template
{
  "index_patterns": ["log"],                   
  "data_stream": { },
  "template": {
    "settings": {
      "number_of_shards": 1,
      "number_of_replicas": 1,
      "index.lifecycle.name": "log_policy"     
    }
  }
}


参数说明:

index_patterns 索引匹配模式

data_stream 声明是一个数据流

template 配置模板的settings和mappings属性

index.lifecycle.name 生命周期策略名称,最核心的属性,要和上文定义的生命周期名称保持一致。


3.创建索引模板

方式一:创建并添加数据

创建数据流timeseries,同时向数据流中写入一条数据。数据中必须包含@timestamp字段信息


POST log/_doc
{
  "message": "logged the request",
  "@timestamp": "1633677855467"
}

方式二:仅创建数据流


PUT _data_stream/log


注意⚠️:

1、数据流名称必须和索引模板中的index_patterns匹配。

2、写入的数据中必须包含@timestamp字段信息


4.获取数据流信息

GET _data_stream/log


结果:

generation 第一代,说明还没有执行滚动

template 采用的索引模板为log_template

ilm_policy 采用的生命周期管理策略为log_policy

{
  "data_streams" : [
    {
      "name" : "log",
      "timestamp_field" : {
        "name" : "@timestamp"
      },
      "indices" : [
        {
          "index_name" : ".ds-log-000001",
          "index_uuid" : "kRMp8y_2SYyw0mh1Sm713A"
        }
      ],
      "generation" : 1,
      "status" : "YELLOW",
      "template" : "log_template",
      "ilm_policy" : "log_policy"
    }
  ]
}

5.生命周期信息拉取频率

集群参数indices.lifecycle.poll_interval 用来控制索引生命周期管理检查符合策略标准的索引的频率,默认为10m。

所以在索引生命周期策略中配置的动作和条件,并不是即使触发的,而且定期检查触发。

打个比方:

尽管在策略中设置了hot阶段索引中数据记录大于3条就进行滚动,但其实并不是超过3条就立刻进行滚动。而且ES集群定期检查,当发现索引满足滚动条件后才进行滚动操作。


这里为了方便验证,将检查频率改为10s。

PUT /_cluster/settings
{
  "transient": {
    "indices.lifecycle.poll_interval": "10s" 
  }
}


6.验证

向数据流中写入4条记录,查看数据流生命周期的变化情况。


GET .ds-log-*/_ilm/explain


结果:

{
  "indices" : {
    ".ds-log-000001" : {
      "index" : ".ds-log-000001",
      "managed" : true,
      "policy" : "log_policy",
      "lifecycle_date_millis" : 1633763085182,
      "age" : "4.06m",
      "phase" : "hot",
      "phase_time_millis" : 1633763085834,
      "action" : "rollover",
      "action_time_millis" : 1633763096800,
      "step" : "check-rollover-ready",
      "step_time_millis" : 1633763096800,
      "phase_execution" : {
        "policy" : "log_policy",
        "phase_definition" : {
          "min_age" : "0ms",
          "actions" : {
            "rollover" : {
              "max_docs" : 3
            }
          }
        },
        "version" : 1,
        "modified_date_in_millis" : 1633762512190
      }
    }
  }
}


添加数据:

PUT log/_bulk?refresh
{ "create":{ } }
{"message": "logged the request1","@timestamp": "1633677862467"}
{ "create":{ } }
{"message": "logged the request2","@timestamp": "1633677872468"}
{ "create":{ } }
{"message": "logged the request3","@timestamp": "1633682619628"}
{ "create":{ } }
{"message": "logged the request4","@timestamp": "1633682619628"}


再次查看索引生命周期情况:


GET .ds-log-*/_ilm/explain


执行结果:

{
  "indices" : {
    ".ds-log-000001" : {
      "index" : ".ds-log-000001",
      "managed" : true,
      "policy" : "log_policy",
      "lifecycle_date_millis" : 1633763525979,
      "age" : "11.91s",
      "phase" : "hot",
      "phase_time_millis" : 1633763085834,
      "action" : "complete",
      "action_time_millis" : 1633763528120,
      "step" : "complete",
      "step_time_millis" : 1633763528120,
      "phase_execution" : {
        "policy" : "log_policy",
        "phase_definition" : {
          "min_age" : "0ms",
          "actions" : {
            "rollover" : {
              "max_docs" : 3
            }
          }
        },
        "version" : 1,
        "modified_date_in_millis" : 1633762512190
      }
    },
    ".ds-log-000002" : {
      "index" : ".ds-log-000002",
      "managed" : true,
      "policy" : "log_policy",
      "lifecycle_date_millis" : 1633763525996,
      "age" : "11.89s",
      "phase" : "delete",
      "phase_time_millis" : 1633763527252,
      "action" : "rollover",
      "action_time_millis" : 1633763536853,
      "step" : "check-rollover-ready",
      "step_time_millis" : 1633763536853,
      "phase_execution" : {
        "policy" : "log_policy",
        "phase_definition" : {
          "min_age" : "0ms",
          "actions" : {
            "rollover" : {
              "max_docs" : 3
            }
          }
        },
        "version" : 1,
        "modified_date_in_millis" : 1633762512190
      }
    }
  }
}


过段时间再次查看,发现只有ds-log-000002。ds-log-000001已经被删除。


{
  "indices" : {
    ".ds-log-000002" : {
      "index" : ".ds-log-000002",
      "managed" : true,
      "policy" : "log_policy",
      "lifecycle_date_millis" : 1633763696125,
      "age" : "1.45m",
      "phase" : "hot",
      "phase_time_millis" : 1633763697292,
      "action" : "rollover",
      "action_time_millis" : 1633763706877,
      "step" : "check-rollover-ready",
      "step_time_millis" : 1633763706877,
      "phase_execution" : {
        "policy" : "log_policy",
        "phase_definition" : {
          "min_age" : "0ms",
          "actions" : {
            "rollover" : {
              "max_docs" : 3
            }
          }
        },
        "version" : 1,
        "modified_date_in_millis" : 1633762512190
      }
    }
  }
}

说明:

执行结果说明,随着日志数据的写入,log索引能够自动滚动生存新的索引,滚动操作后超过30s的索引数据会被删除。


注意⚠️:

索引生命周期管理,控制的粒度是索引级别,而不是索引记录级别。


所以采用_bulk指令批量写入数据时,都是向当前的最新的写索引写入数据。不会出现写了3条数据就自动触发滚动然后向新的索引写入第4条的情况。

查询的时候也会发现所有的数据都是在索引ds-log-000001中。

当触发delete阶段的删除操作后,会直接删除满足条件的整个ds-log-000001。不会说只删除3条,还有一条保留在ds-log-000002中的情况。


总结


本文主要介绍了通过索引生命周期管理ILM机制实现对日志数据的生命周期的自动化管理。

1、索引生命周期管理的控制粒度是索引级别,而不是索引记录级别。

2、索引生命周期的触发并不是实时的,而是定时周期触发检查机制,检查频率大小由indices.lifecycle.poll_interval控制。

3、日志数据满足时序数据、连续不断持续增长,只读属性的特点,适合采用数据流保存。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
4月前
|
存储 数据采集 JavaScript
深入理解数仓开发(一)数据技术篇之日志采集
深入理解数仓开发(一)数据技术篇之日志采集
|
3月前
|
SQL 运维 监控
SLS 数据加工全面升级,集成 SPL 语法
在系统开发、运维过程中,日志是最重要的信息之一,其最大的优点是简单直接。SLS 数据加工功能旨在解决非结构化的日志数据处理,当前全面升级,集成 SPL 语言、更强的数据处理性能、更优的使用成本。
18107 136
|
2月前
|
存储 消息中间件 人工智能
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
早期 MiniMax 基于 Grafana Loki 构建了日志系统,在资源消耗、写入性能及系统稳定性上都面临巨大的挑战。为此 MiniMax 开始寻找全新的日志系统方案,并基于阿里云数据库 SelectDB 版内核 Apache Doris 升级了日志系统,新系统已接入 MiniMax 内部所有业务线日志数据,数据规模为 PB 级, 整体可用性达到 99.9% 以上,10 亿级日志数据的检索速度可实现秒级响应。
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
|
2月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
28天前
|
SQL 人工智能 运维
在阿里云日志服务轻松落地您的AI模型服务——让您的数据更容易产生洞见和实现价值
您有大量的数据,数据的存储和管理消耗您大量的成本,您知道这些数据隐藏着巨大的价值,但是您总觉得还没有把数据的价值变现出来,对吗?来吧,我们用一系列的案例帮您轻松落地AI模型服务,实现数据价值的变现......
128 3
|
2月前
|
存储 监控 网络协议
在Linux中,如何使用 tcpdump 监听主机为 192.168.1.1,tcp 端⼝为 80 的数据,并将将输出结果保存输出到tcpdump.log?
在Linux中,如何使用 tcpdump 监听主机为 192.168.1.1,tcp 端⼝为 80 的数据,并将将输出结果保存输出到tcpdump.log?
|
2月前
|
数据库 Java 监控
Struts 2 日志管理化身神秘魔法师,洞察应用运行乾坤,演绎奇幻篇章!
【8月更文挑战第31天】在软件开发中,了解应用运行状况至关重要。日志管理作为 Struts 2 应用的关键组件,记录着每个动作和决策,如同监控摄像头,帮助我们迅速定位问题、分析性能和使用情况,为优化提供依据。Struts 2 支持多种日志框架(如 Log4j、Logback),便于配置日志级别、格式和输出位置。通过在 Action 类中添加日志记录,我们能在开发过程中获取详细信息,及时发现并解决问题。合理配置日志不仅有助于调试,还能分析用户行为,提升应用性能和稳定性。
38 0
|
2月前
|
开发者 前端开发 编解码
Vaadin解锁移动适配新境界:一招制胜,让你的应用征服所有屏幕!
【8月更文挑战第31天】在移动互联网时代,跨平台应用开发备受青睐。作为一款基于Java的Web应用框架,Vaadin凭借其组件化设计和强大的服务器端渲染能力,助力开发者轻松构建多设备适应的Web应用。本文探讨Vaadin与移动设备的适配策略,包括响应式布局、CSS媒体查询、TouchKit插件及服务器端优化,帮助开发者打造美观且实用的移动端体验。通过这些工具和策略的应用,可有效应对屏幕尺寸、分辨率及操作系统的多样性挑战,满足广大移动用户的使用需求。
35 0
|
2月前
|
存储 运维 监控
Entity Framework Core 实现审计日志记录超棒!多种方法助你跟踪数据变化、监控操作,超实用!
【8月更文挑战第31天】在软件开发中,审计日志记录对于跟踪数据变化、监控用户操作及故障排查至关重要。Entity Framework Core (EF Core) 作为强大的对象关系映射框架,提供了多种实现审计日志记录的方法。例如,可以使用 EF Core 的拦截器在数据库操作前后执行自定义逻辑,记录操作类型、时间和执行用户等信息。此外,也可通过在实体类中添加审计属性(如 `CreatedBy`、`CreatedDate` 等),并在保存实体时更新这些属性来记录审计信息。这两种方法都能有效帮助我们追踪数据变更并满足合规性和安全性需求。
22 0
|
2月前
|
SQL 安全 测试技术
【数据守护者必备】SQL数据备份与恢复策略全解析:从全量到日志备份,手把手教你确保企业信息万无一失的实战技巧!
【8月更文挑战第31天】数据库是企业核心业务数据的基石,为防止硬件故障、软件错误或人为失误导致的数据丢失,制定可靠的备份与恢复策略至关重要。本文通过一个在线购物平台的案例,详细介绍了使用 SQL Server 进行全量备份、差异备份及事务日志备份的方法,并演示了如何利用 SQL Server Agent 实现自动化备份任务。此外,还提供了数据恢复的具体步骤和测试建议,确保数据安全与业务连续性。
47 0
下一篇
无影云桌面