定时删除创建的空索引避免引起集群负载过高

发布于:2024-12-18 ⋅ 阅读:(11) ⋅ 点赞:(0)

   在之前的一篇文章:[Elastic 运维脚本整理] 快速平衡 Elastic 集群节点分片自动化运维脚本-CSDN博客  中曾给大家介绍了当 ES 集群出现异常,导致集群各节点索引分片不平衡,通过创建空索引来快速平衡。

当填充了空索引后,因为大量空索引的存在可能会导致下次再出现异常因为索引过多,恢复速度慢,需要将之前创建的空索引删除,但通过 Kibana 一次性删除过多会导致集群负载高,可能引起异常,针对此情况优化了删除脚本,通过此脚本可以更安全的删除索引。

#!/bin/bash

# 此脚本用来删除创建的前缀为 test-null-index 的空索引
# Elasticsearch 地址及端口
ES_HOST="http://192.168.xxx.xxx:9200"

# 用户认证
ES_USER="elastic"
ES_PASS="xxxx"

# 索引前缀
INDEX_PREFIX="test-null-index-"

# 日志文件
LOG_FILE="/home/esuser/log/delete_indices.log"

# 检查并删除空索引的函数
delete_empty_indices() {
    echo "开始检查并删除空索引前缀为 ${INDEX_PREFIX} 的索引..." | tee -a "$LOG_FILE"

    while true; do
        # 获取空索引列表
        empty_indices=$(curl -s -u "${ES_USER}:${ES_PASS}" -X GET "${ES_HOST}/_cat/indices/${INDEX_PREFIX}*?h=index,docs.count" | awk '$2==0 {print $1}')
        
        # 如果没有空索引,则退出循环
        if [[ -z "$empty_indices" ]]; then
            echo "所有前缀为 ${INDEX_PREFIX} 的空索引已删除完毕。" | tee -a "$LOG_FILE"
            break
        fi
        
        # 删除第一个空索引
        first_empty_index=$(echo "$empty_indices" | head -n 1)
        echo "$(date '+%Y-%m-%d %H:%M:%S') - 删除空索引:${first_empty_index}" | tee -a "$LOG_FILE"
        curl -s -u "${ES_USER}:${ES_PASS}" -X DELETE "${ES_HOST}/${first_empty_index}" -o /dev/null
        
        # 删除后等待60秒
        sleep 60
    done
}

# 执行函数
delete_empty_indices