Elasticsearch索引備份與清理

1、背景

1.咱們ES節點個數有限,而環境中日誌量又很是龐大,長此以往ES的性能便會降低,因此要對之前的索引作定時清理。
2.ES副本提供了高可靠性,它們讓你能夠容忍零星的節點丟失而不會中斷服務。可是,副本並不提供對災難性故障的保護。對這種狀況,咱們須要的是對集羣真正的備份。html

2、API

使用 snapshot API對集羣作備份,通常有兩種方案:
1.增量備份:是默認的備份方案,即作快照時不指定索引,第一個快照會是一個數據的完整拷貝,後續的快照會保留的是已存快照和新數據之間的差別。
2.備份指定索引:某些日誌並不須要長期保存,因此只對咱們感興趣的索引作快照,必定程度上也能節省磁盤空間。json

3、使用方法

本案例是針對指定索引進行備份bash

1.建立倉庫

(1) 掛載NFS共享存儲

$ df -hT
文件系統 類型 容量 已用 可用 已用% 掛載點
172.16.244.245:/logs/bjbpe01-es nfs 2.0T 1.3G 2.0T 1% /data/backupapp

注意:共享文件系統路徑必須確保集羣全部節點均可以訪問到。因此咱們三個節點都掛載同一個目錄。curl

(2) ES配置

集羣每一個節點elasticsearch.yml配置文件中添加以下配置,而後重啓服務。
path.repo: /data/backupelasticsearch

(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方式提交,例如咱們要將限流都改成每秒60mbide

$ 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

4、附錄

其餘的經常使用命令性能

#列出倉庫
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

這裏提供一個簡單的腳本,用於備份昨天的數據並清理一個月前的數據ui

#!/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`"

參考:官方文檔url

相關文章
相關標籤/搜索