在之前的一篇文章:[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