一、背景

1.我们ES节点个数有限,而环境中日志量又非常庞大,久而久之ES的性能便会下降,所以要对以前的索引做定时清理。
2.ES副本提供了高可靠性,它们让你可以容忍零星的节点丢失而不会中断服务。但是,副本并不提供对灾难性故障的保护。对这种情况,我们需要的是对集群真正的备份。

二、API

使用 snapshot API对集群做备份,一般有两种方案:
1.增量备份:是默认的备份方案,即做快照时不指定索引,第一个快照会是一个数据的完整拷贝,后续的快照会保留的是已存快照和新数据之间的差异。
2.备份指定索引:某些日志并不需要长期保存,所以只对我们感兴趣的索引做快照,一定程度上也能节省磁盘空间。

三、使用方法

本案例是针对指定索引进行备份

1.创建仓库

(1) 挂载NFS共享存储

$ df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
172.16.244.245:/logs/bjbpe01-es nfs 2.0T 1.3G 2.0T 1% /data/backup

注意:共享文件系统路径必须确保集群所有节点都可以访问到。所以我们三个节点都挂载同一个目录。

(2) ES配置

集群每个节点elasticsearch.yml配置文件中添加如下配置,然后重启服务。
path.repo: /data/backup

(3) 部署共享文件系统仓库

#创建仓库目录
$ mkdir /data/backup/2019-02-28
#创建仓库
$ curl -H "Content-Type: application/json" -XPUT http://127.0.0.1:9200/_snapshot/2019-03-08 -d '
{
    "type": "fs",
    "settings": {
        "location": "/data/backup/2019-03-08",
        "max_snapshot_bytes_per_sec": "50mb",
        "max_restore_bytes_per_sec": "50mb"
    }
}'
#2019-03-08 共享仓库名称
#“type”:”fs”    指定仓库类型是一个共享文件系统
#“location”: “/data/backup” 指定挂载目录
#“max_snapshot_bytes_per_sec" : "50mb"  控制快照存到仓库时的限流情况,默认每秒20mb
#"max_restore_bytes_per_sec" : "50mb"   控制从仓库恢复数据时的限流情况,默认每秒20mb

注意:如果需要更新已有仓库设置,请使用POST方式提交,例如我们要将限流都改为每秒60mb

$ curl -H "Content-Type: application/json" -XPOST http://127.0.0.1:9200/_snapshot/2019-03-08 -d '
{
    "type": "fs",
    "settings": {
        "location": "/data/backup/2019-03-08",
        "max_snapshot_bytes_per_sec": "60mb",
        "max_restore_bytes_per_sec": "60mb"
    }
}'

2.备份指定索引

$ curl -H "Content-Type: application/json" -XPUT http://127.0.0.1:9200/_snapshot/2019-03-08/logstash-audit_log-2019-03-08?wait_for_completion=true -d '
{
    "indices": "logstash-audit_log-2019-03-08"
}'
#logstash-audit_log-2019-03-08快照名称
#wait_for_completion    默认快照时会进入后台执行,添加该标记可以阻止进入后台执行,常在脚本中使用。
#"indices"  指定要做快照的索引

3.删除指定索引

curl -XDELETE http://127.0.0.1:9200/ logstash-audit_log-2019-02-08

四、附录

其他的常用命令

#列出仓库
curl -XGET http://127.0.0.1:9200/_snapshot/*
#删除仓库
curl -XDELETE http://127.0.0.1:9200/_snapshot/2019-03-08
#列出快照
curl -XGET http://127.0.0.1:9200/_snapshot/2019-03-08/*
#删除快照
curl -XDELETE http://127.0.0.1:9200/_snapshot/2019-03-08/logstash-audit_log-2019-03-08

这里提供一个简单的脚本,用于备份昨天的数据并清理一个月前的数据

#!/bin/bash
#共享存储目录
NFS_DIR=/data/backup
#获取昨天日期(备份使用)
DATE_YESTERDAY=`date -d "-1 day" +%Y-%m-%d`
#获取一个月前日期(索引删除使用)
DATE_MONTH_AGO=`date -d "1 month ago" +%Y-%m-%d`
#要做快照的索引名称
INDEX=(index1 index2 index3)

echo "开始时间:`date +%Y-%m-%d_%H:%m:%S`"
#--------------创建仓库--------------
if [[ ! -d ${NFS_DIR}/${DATE_YESTERDAY} ]];then
  mkdir -p ${NFS_DIR}/${DATE_YESTERDAY}
fi
curl -H "Content-Type: application/json" -XPUT http://127.0.0.1:9200/_snapshot/${DATE_YESTERDAY} -d '
{
    "type": "fs",
    "settings": {
        "location": "'${NFS_DIR}'/'${DATE_YESTERDAY}'",
        "max_snapshot_bytes_per_sec": "50mb",
        "max_restore_bytes_per_sec": "50mb"
    }
}'
if [[ $? == 0 ]];then
  echo "${DATE_YESTERDAY}仓库创建成功!"
fi
#--------------数据处理--------------
for i in ${INDEX[@]}
do
#创建快照,备份昨天的数据
curl -H "Content-Type: application/json" -XPUT http://127.0.0.1:9200/_snapshot/${DATE_YESTERDAY}/${i}-${DATE_YESTERDAY}?wait_for_completion=true -d '
{
    "indices": "'${i}'-'${DATE_YESTERDAY}'"
}'
if [[ $? == 0 ]];then
  echo "${i}-${DATE_YESTERDAY}快照创建成功!"
fi
#删除一个月前数据
curl -XGET "http://127.0.0.1:9200/_cat/indices/?v"|grep ${i}-${DATE_MONTH_AGO}
if [ $? == 0 ];then
  curl -XDELETE "http://127.0.0.1:9200/${i}-${DATE_MONTH_AGO}"
  echo "${i}-${DATE_MONTH_AGO}索引删除成功!"
else
  echo "${i}-${DATE_MONTH_AGO}索引不存在!"
fi
done
#--------------快照数据做压缩处理--------------
cd ${NFS_DIR}
tar czvf ${DATE_YESTERDAY}.tgz ${DATE_YESTERDAY}
rm -rf ${DATE_YESTERDAY}
cd -
echo "结束时间:`date +%Y-%m-%d_%H:%m:%S`"

参考:官方文档