一、背景
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`"