自动清理 ES 历史数据

news/2024/10/31 5:34:48/

一、 背景

        随着业务的增长和时间的变化,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-indeicesname: elastic-get-indeices
spec:concurrencyPolicy: ForbidfailedJobsHistoryLimit: 5schedule: "0 0 * * *"jobTemplate:metadata:labels:app: elastic-get-indeicesspec:activeDeadlineSeconds: 360backoffLimit: 3completions: 1parallelism: 1template:metadata:annotations:kubesphere.io/imagepullsecrets: '{}'spec:containers:- command:- /bin/sh- -c- curl -XGET -u ${esuser}:${espass} ${esurl}/_cat/indices | sort -k 3env:- name: esuservalue: "elastic"  # ES 用户,使用默认用户即可- name: espassvalue: "ES密码"    # 替换成 ES 真实的 密码- name: esurlvalue: "http://eshost:9200"  # 替换成 ES 真实 url 地址image: centos:7.9.2009  ## 使用任何一个带有 curl 命令的基础镜像都可以imagePullPolicy: IfNotPresentname: conjobresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilevolumeMounts:- mountPath: /etc/localtimename: host-timereadOnly: truednsPolicy: ClusterFirstrestartPolicy: NeverschedulerName: default-schedulersecurityContext: {}serviceAccount: defaultserviceAccountName: defaultterminationGracePeriodSeconds: 30volumes:- hostPath:path: /etc/localtimetype: ""name: host-timestartingDeadlineSeconds: 30successfulJobsHistoryLimit: 5suspend: 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-dataname: elastic-delete-data
spec:concurrencyPolicy: ForbidfailedJobsHistoryLimit: 5schedule: "0 1 * * *"    # 每天凌晨 1 点 自动动清理 ES 30天前的历史数据jobTemplate:metadata:labels:app: elastic-delete-dataspec:activeDeadlineSeconds: 360backoffLimit: 3completions: 1parallelism: 1template: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: esuservalue: "elastic"  # ES 用户,使用默认用户即可- name: espassvalue: "ES密码"    # 替换成 ES 真实的 密码- name: esurlvalue: "http://eshost:9200"  # 替换成 ES 真实 url 地址image: centos:7.9.2009  # 使用任何一个带有 curl 命令的基础镜像都可以imagePullPolicy: IfNotPresentname: conjobresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilevolumeMounts:- mountPath: /etc/localtimename: host-timereadOnly: truednsPolicy: ClusterFirstrestartPolicy: NeverschedulerName: default-schedulersecurityContext: {}serviceAccount: defaultserviceAccountName: defaultterminationGracePeriodSeconds: 30volumes:- hostPath:path: /etc/localtimetype: ""name: host-timestartingDeadlineSeconds: 30successfulJobsHistoryLimit: 5suspend: 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.ppmy.cn/news/92211.html

相关文章

ChatGpt都这么火了,它使用的 BPE 分词算法要不要了解一下?

Byte Pair Encoding(BPE)是一种文本压缩算法,它通常用于自然语言处理领域中的分词、词汇表构建等任务。BPE 算法的核心思想是通过不断地合并字符或子词来生成词汇表。 在这里,我们将对 BPE 算法进行全面、详细的讲解,…

自动化测试-基础知识—Bash基础

Bash 在 Bash 中,美元符号 $ 可以用于引用变量或者表达式的值。Bash 中的变量并不需要事先声明,而是在第一次赋值时自动创建。基于这个特性,我们可以通过给变量名加上 $ 的方式来引用它的值,比如 $var 表示引用变量 var 的值。 …

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; …

Kotlin介绍,开发环境搭建,语法,高级特性,编程技巧

Kotlin是一种基于JVM的静态类型编程语言,由JetBrains开发。它可以编译成Java字节码,也可以编译成JavaScript源代码。Kotlin旨在通过更简洁、更安全、更易于维护的代码来提高开发效率。本文将介绍Kotlin的开发环境搭建、语法、高级特性和编程技巧。 一、…

公司来了个00后,真是卷死了呀,辞职信已经写好了·····

人们都说00后躺平了,但是有一说一,该卷的还是卷。这不,三月份春招我们公司来了个00后,工作没两年,跳槽到我们公司起薪20K,都快接近我了。 后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡…

springcloud高频面试题

springcloud的组件有哪些 注册中心:euraka、nacos、zookeeper 注册中心及配置中心:nacos 远程调用:feign、dubbo 负载均衡:ribbon 服务熔断:hystrix、sentinel 网关:zuul、gateway eureka注册中心的作用 …

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

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

django 任务队列

1.安装celery 首先,确保你已经安装了Celery。在你的命令行中运行: pip install celery2.配置celery 在你的Django项目目录下(与settings.py同一级目录)创建一个celery.py文件。然后,添加以下内容: from…