自动清理 ES 历史数据

news2024/11/25 16:40:37

一、 背景

        随着业务的增长和时间的变化,ES 数据库的存储空间越来越大,存储数据多数为系统监控日志,保存的数据不需要长期保留,多数情况只需要保留几个月ES数据即可,既可以减轻ES服务器的负载和资源使用率,还可以节约更多的存储空间。

二、解决方案

      由于我的环境是k8s集群,ES 主要是为k8s集群内部应用服务,没有映射外部访问端口,所以不能直接使用Linux自带的crontab定时ES数据清理脚本。需要创建一个容器定时任务来定时清理ES历史数据。

        k8s定时任务,会根据你设置的时间,定时启动pod实例来执行任务,pod完成执行任务后,pod的状态会由 running 状态变成 Completed 状态。查看定时任务脚本执行日志,可通过查看pod日志实现。

       创建两个定时任务,一个定时任务在删除ES索引前执行,用于核对和审计定时任务删除的索引;另一个是关键的定时任务,用于删除ES历史数据。第一个定时任务可以根据实际情况选择性决定是否要创建。

三、实现操作

1、获取ES索引信息 

        获取ES索引定时任务编排文件:  elastic-get-indeices.yaml

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  annotations: 
    description: "先获取一次索引信息,然后再删除索引;以便核对每次删除的索引"
  labels:
    app: elastic-get-indeices
  name: elastic-get-indeices
spec:
  concurrencyPolicy: Forbid
  failedJobsHistoryLimit: 5
  schedule: "0 0 * * *"
  jobTemplate:
    metadata:
      labels:
        app: elastic-get-indeices
    spec:
      activeDeadlineSeconds: 360
      backoffLimit: 3
      completions: 1
      parallelism: 1
      template:
        metadata:
          annotations:
            kubesphere.io/imagepullsecrets: '{}'
        spec:
          containers:
          - command:
            - /bin/sh
            - -c
            - curl -XGET -u ${esuser}:${espass} ${esurl}/_cat/indices | sort -k 3
            env:
            - name: esuser
              value: "elastic"  # ES 用户,使用默认用户即可
            - name: espass
              value: "ES密码"    # 替换成 ES 真实的 密码
            - name: esurl
              value: "http://eshost:9200"  # 替换成 ES 真实 url 地址

            image: centos:7.9.2009  ## 使用任何一个带有 curl 命令的基础镜像都可以
            imagePullPolicy: IfNotPresent
            name: conjob
            resources: {}
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
            volumeMounts:
            - mountPath: /etc/localtime
              name: host-time
              readOnly: true
          dnsPolicy: ClusterFirst
          restartPolicy: Never
          schedulerName: default-scheduler
          securityContext: {}
          serviceAccount: default
          serviceAccountName: default
          terminationGracePeriodSeconds: 30
          volumes:
          - hostPath:
              path: /etc/localtime
              type: ""
            name: host-time
  startingDeadlineSeconds: 30
  successfulJobsHistoryLimit: 5
  suspend: false

创建获取ES索引信息的定时任务:

# 创建 获取 ES 索引 信息定时任务
kubectl apply -f elastic-get-indeices.yaml

 2、删除 ES 30天之前的历史数据

        删除ES历史数据编排文件: elastic-delete-data.yaml

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  annotations: 
    description: "定时删除 ES 历史数据;保留30天的历史数据"
  labels:
    app: elastic-delete-data
  name: elastic-delete-data
spec:
  concurrencyPolicy: Forbid
  failedJobsHistoryLimit: 5
  schedule: "0 1 * * *"    # 每天凌晨 1 点 自动动清理 ES 30天前的历史数据
  jobTemplate:
    metadata:
      labels:
        app: elastic-delete-data
    spec:
      activeDeadlineSeconds: 360
      backoffLimit: 3
      completions: 1
      parallelism: 1
      template:
        metadata:
          annotations:
            kubesphere.io/imagepullsecrets: '{}'
        spec:
          containers:
          - command:
            - /bin/sh
            - -c
            - curl -XDELETE -u ${esuser}:${espass} ${esurl}/*$(date +%Y%m%d -d "30 days ago")*
            env:
            - name: esuser
              value: "elastic"  # ES 用户,使用默认用户即可
            - name: espass
              value: "ES密码"    # 替换成 ES 真实的 密码
            - name: esurl
              value: "http://eshost:9200"  # 替换成 ES 真实 url 地址

            image: centos:7.9.2009  # 使用任何一个带有 curl 命令的基础镜像都可以
            imagePullPolicy: IfNotPresent
            name: conjob
            resources: {}
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
            volumeMounts:
            - mountPath: /etc/localtime
              name: host-time
              readOnly: true
          dnsPolicy: ClusterFirst
          restartPolicy: Never
          schedulerName: default-scheduler
          securityContext: {}
          serviceAccount: default
          serviceAccountName: default
          terminationGracePeriodSeconds: 30
          volumes:
          - hostPath:
              path: /etc/localtime
              type: ""
            name: host-time
  startingDeadlineSeconds: 30
  successfulJobsHistoryLimit: 5
  suspend: false
# 创建 定时删除 ES 历史数据任务
 kubectl apply -f elastic-delete-data.yaml

3、查看创建好的定时任务

# 注意命名空间,若不是当前默认命名空间 记得 指定命名空间
kubectl get cronjobs.batch

 4、已成功完成的定时任务

 5、通过删除前和删除后的索引情况来核对删除了那些索引

说明: 

        curl -X DELETE 删除ES索引是没有详细日志的,所以需要在删除前执行 curl -X GET 获取删除前索引信息,一旦出现异常就可以更好判断当次定时任务实际删除了那些内容,实际上是否成功按照保留天数执行了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/574413.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql进阶之索引优化

Mysql进阶之索引优化 一. 索引介绍 1.1 什么是Mysql索引 MySQL官方对于索引的定义:索引是帮助MySQL高效获取数据的数据结构。MySQL在存储数据之外,数据库系统中还维护着满足特定查找算法的数据结构,这些数据结构以某种引用(指向)表中的数据…

考研C语言第四章

4.1 关系表达式与逻辑表达式 ps&#xff1a; 算术运算符&#xff1a;加减乘除等 关系运算符&#xff1a;比大小的 逻辑与逻辑或 非&#xff01;的运算级别&#xff08;应该&#xff09;最高 4.2 if-else #include <stdio.h> //上课这个写while的原因是方便一次一次…

怎么导入别人的android项目

到期末了好多同学都问我怎么把别人的安卓项目导进自己电脑里面&#xff0c;今天我来统一解答一下&#xff0c;希望有所帮助。 1.删除项目中原有的自动构建的文件 去到要导入项目的目录下把 .idea .gradle与build 三个文件夹&#xff0c;*.iml&#xff0c;local.properties删除…

JavaScript数组和函数

1. 数组 1.1 init <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice…

肉豆蔻酰五肽-8/Myristoyl Pentapeptide-8/sympeptide222

作用机理----肉豆蔻酰五肽-8 随着年龄增大&#xff0c;皮肤逐渐丧失弹性&#xff0c;肌肉功能弱化&#xff0c;而使眼睛周围皮肤松弛形成眼袋。眼睑部位水分的过度积累即眼睑水肿。肉豆蔻酰五肽-8抑制血管紧张素转换酶&#xff0c;增强眼部淋巴循环&#xff0c;促进水分排出 …

vue面试题汇总

vue面试题汇总 1. 谈谈你对MVVM开发模式的理解&#xff1f;2. v-if 和 v-show 有什么区别&#xff1f;3. r o u t e 和 route和 route和router区别4.vue自定义指令5.vue项目优化6.vue模板如何编译7.vue2响应式原理8.vue3响应式原理9.刷新浏览器后&#xff0c;Vuex的数据是否存在…

Go语言的学习【3】常量

目录 注意事项常量常量还可以用作枚举&#xff1a;iota 报错及解决经验和教训 注意事项 如果在相同的代码块中&#xff0c;我们不可以再次对于相同名称的变量使用初始化声明&#xff0c;例如&#xff1a;a : 20 就是不被允许的&#xff0c;编译器会提示错误 no new variables …

【Linux】死锁

文章目录 死锁关于阻塞的理解死锁的四个必要条件避免死锁的方法 死锁 死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所占用不会释放的资源而处于的一种永久等待状态 单执行流可能导致死锁问题吗? 可能&#xff01;例如:某一个执行流连续申请了…

类型转换(2)

类型转换 知识回顾static_castconst_castreinterpret_cast 类型转换dynamic_cast动态转换和静态转换区别动态转换的使用 知识回顾 static_cast 静态转换应用范围&#xff1a; 基本数据类型的转换&#xff0c;但不能实现基本数据类型指针的转化&#xff0c;但是可以将无类型转…

Linux 下进行权限修改

查看权限 ls -l 文件名该命令可以查看文件的详细属性&#xff0c;包括文件的权限 权限含义 -rwxrwxrwx在文件系统中&#xff0c;user、group、others的权限是分开的&#xff0c;第一个rwx代表user的权限、第二个rwx代表group的文件、第三个rwx代表others的权限 字符含义值…

真无线蓝牙耳机什么品牌比较好?五大高性价比真无线耳机推荐

与有线耳机相比&#xff0c;无线蓝牙耳机重量轻&#xff0c;便于携带。最重要的是避免了耳机线的麻烦&#xff0c;所以很受当代人的欢迎。什么牌子的蓝牙耳机好&#xff1f;哪个好用&#xff1f;本文中整理了五款市场上高性价比的无线蓝牙耳机&#xff0c;为您提供参考。 第一…

每天一个面试题之final在java中有什么作用?

final在java中有什么作用&#xff1f; final关键字表示最终的含义 当它用来修饰一个引用时&#xff1a; <1>:如果引用为基本数据类型&#xff0c;则该引用为常量&#xff0c;该值无法被修改。<2>:如果引用为引用数据类型&#xff0c;例如&#xff0c;对象/数组等…

使用Nodejs搭建简单的HTTP服务器 - 内网穿透公网远程访问

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 转载自cpolar内网穿透的文章&#xff1a;使用Nodejs搭建HTTP服务&#xff0c;并实现公网远程访问「内网穿透」 前言 Node.…

SSM 如何使用 Saga 机制实现分布式事务?

SSM 如何使用 Saga 机制实现分布式事务&#xff1f; 在分布式系统中&#xff0c;事务管理一直是一个复杂的问题。传统的 ACID 事务只适用于单体应用&#xff0c;随着微服务架构的兴起&#xff0c;分布式事务成为了必须解决的问题。Saga 是一种解决分布式事务问题的机制&#x…

聊聊API 安全

API 安全的现状 随着互联网的高速发展和技术的日趋成熟&#xff0c;人们在享受技术所带来的便利之时&#xff0c;也开始关注技术层面的安全问题。 近年来&#xff0c;应用市场成为各大互联网平台企业的最爱&#xff0c;Facebook、Twitter、新浪微博、微信公众号、抖音等均使用了…

5月面试太难,吃透这份软件测试面试笔记后,成功跳槽涨薪30K

5月开始&#xff0c;生活工作渐渐步入正轨&#xff0c;但金三银四却没有往年顺利。昨天跟一位高级架构师的前辈聊天时&#xff0c;聊到今年的面试。有两个感受&#xff0c;一个是今年面邀的次数比往年要低不少&#xff0c;再一个就是很多面试者准备明显不足。不少候选人能力其实…

ThreadLocal的应用

1. ThreadLocal 是什么 JDK 对ThreadLocal的描述为&#xff1a; 此类提供线程局部变量。这些变量与普通变量的不同之处在于&#xff0c;每个访问一个变量的线程&#xff08;通过其get或set方法&#xff09;都有自己的、独立初始化的变量副本。ThreadLocal 实例通常是类中的私有…

ReentrantLock 和 synchronized 关键字有什么区别?

ReentrantLock 和 synchronized 关键字有什么区别&#xff1f; 在 Java 中&#xff0c;有两种常用的锁机制&#xff1a;ReentrantLock 和 synchronized 关键字。它们都可以用来实现线程同步&#xff0c;但在具体的使用上有一些区别。本文将介绍 ReentrantLock 和 synchronized…

如何用Thanos 和 Prometheus 打造一个高可用的K8S监控系统

概 述 对于弹性伸缩和高可用的系统来说&#xff0c;一般有大量的指标数据需要收集和存储&#xff0c;如何为这样的系统打造一个监控方案呢&#xff1f;本文介绍了如何使用 ThanosPrometheusGrafana 构建监控系统。 集群容量概览 用户故事 直到今年 1 月&#xff0c;我一直在…

C#小项目之记事本

C#小项目之记事本 子窗体设计 frmChild.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; …