Bash中如何对比Elasticsearch待备份索引与快照实际备份索引
Elasticsearch 快照索引备份校验Bash实现方案
推荐使用轻量JSON处理工具jq实现该需求,处理JSON结构更稳定,避免因格式变动导致校验逻辑失效,先提前安装jq:
- CentOS/RHEL系统执行:
yum install -y jq - Debian/Ubuntu系统执行:
apt install -y jq
完整校验逻辑
_DATE=$(date '+%Y.%m.%d') # 你的原有获取待备份索引逻辑 _UZBEKISTAN_INDICES=$(curl -s -X GET "localhost:9200/_cat/indices?v" | grep 'tashkent-'$_DATE'\|fergana-'$_DATE'' | awk '{ print $3 }') # 1. 前置校验:先判断快照本身是否执行成功 SNAPSHOT_STATE=$(curl -s -XGET "localhost:9200/_snapshot/uzbekistan-${_DATE}/uzbekistan-${_DATE}/" | jq -r '.snapshots[0].state') if [ "${SNAPSHOT_STATE}" != "SUCCESS" ]; then echo "错误:快照备份失败,当前状态为 ${SNAPSHOT_STATE}" exit 1 fi # 2. 提取快照中已备份的索引列表,排序后存储 BACKED_INDICES=$(curl -s -XGET "localhost:9200/_snapshot/uzbekistan-${_DATE}/uzbekistan-${_DATE}/" | jq -r '.snapshots[0].indices[]' | sort) # 3. 把待备份索引从空格分隔格式转为每行一个,排序后存储 EXPECTED_INDICES=$(echo "${_UZBEKISTAN_INDICES}" | xargs -n1 | sort) # 4. 对比两个索引列表 if [ "${BACKED_INDICES}" = "${EXPECTED_INDICES}" ]; then echo "校验通过:所有待备份索引均已成功备份,列表为 ${_UZBEKISTAN_INDICES}" exit 0 else echo "校验失败:存在未备份的索引" echo "---------- 待备份索引列表 ----------" echo "${EXPECTED_INDICES}" echo "---------- 实际已备份索引列表 ----------" echo "${BACKED_INDICES}" # 输出缺失的索引 MISSING_INDICES=$(comm -23 <(echo "${EXPECTED_INDICES}") <(echo "${BACKED_INDICES}")) echo "---------- 缺失的备份索引 ----------" echo "${MISSING_INDICES}" exit 1 fi
逻辑说明
- 先校验快照整体状态,避免快照执行失败时仅校验索引列表导致误判
- 对两份索引列表都做排序处理,避免因为索引顺序不同导致的对比误判
comm -23命令仅输出第一个列表存在、第二个列表不存在的内容,可直接定位缺失的备份索引
无jq备用方案(不推荐,稳定性差)
如果无法安装jq,可以用grep+awk硬解析JSON,仅适用于返回格式固定的场景:
# 替换原有提取BACKED_INDICES的逻辑即可 BACKED_INDICES=$(curl -s -XGET "localhost:9200/_snapshot/uzbekistan-${_DATE}/uzbekistan-${_DATE}/" | grep -A 10 '"indices"' | grep '^[[:space:]]*"' | grep -v '"indices"' | awk -F '"' '{print $2}' | sort)
内容的提问来源于stack exchange,提问作者noze_potato
相关产品推荐
相关产品推荐

