全部產品
Search
文件中心

Elasticsearch:手動備份與恢複

更新時間:Sep 13, 2024

通過快照備份與恢複命令,您可以實現手動備份與恢複Elasticsearch執行個體的索引資料,並將備份的資料儲存到一個共用倉庫裡。本文介紹如何手動備份與恢複資料。

背景資訊

ES資料備份與恢複依賴於elasticsearch-repository-oss外掛程式,阿里雲ES執行個體預設已安裝該外掛程式且不可卸載。關於該外掛程式的詳細資料,請參見elasticsearch-repository-oss

前提條件

  • 已開通Object Storage Service服務OSS(Object Storage Service),並建立一個標準儲存類型的Bucket(不支援Archive Storage類型),開通Bucket公用讀取許可權,且Bucket的地區需要與Elasticsearch執行個體的地區保持一致。 具體操作,請參見開通OSS服務建立儲存空間

  • RAM使用者需要具備AliyunOSSFullAccess權限原則。具體操作,請參見為RAM使用者授權

注意事項

  • 快照僅儲存索引資料,不儲存Elasticsearch執行個體自身的監控資料(例如以.monitoring.security_audit為首碼的索引)、中繼資料、Translog、執行個體配置資料、Elasticsearch軟體包、內建和自訂的外掛程式、Elasticsearch日誌等。

  • 本文中的代碼均可以在Elasticsearch執行個體的Kibana控制台上執行。詳細資料,請參見登入Kibana控制台

建立倉庫

建立一個名稱為my_backup的倉庫。

  • 雲上叢集建立倉庫。

    PUT _snapshot/my_backup/
    {
        "type": "oss",
        "settings": {
            "endpoint": "http://oss-cn-hangzhou-internal.aliyuncs.com",
            "access_key_id": "xxxx",
            "secret_access_key": "xxxxxx",
            "bucket": "xxxxxx",
            "compress": true,
            "chunk_size": "500mb",
            "base_path": "snapshot/"
        }
    }
  • 8.x版本自建叢集建立倉庫,需要安裝elasticsearch-repository-oss外掛程式。具體操作,請參見安裝elasticsearch-repository-oss外掛程式

    說明

    關於該外掛程式的詳細資料,請參見elasticsearch-repository-oss

    PUT /_snapshot/my_backup
    {
        "type": "oss",
        "settings": {
            "oss.client.endpoint": "oss-cn-shanghai.aliyuncs.com",
            "oss.client.access_key_id": "xxx",
            "oss.client.secret_access_key": "xxx",
            "oss.client.bucket": "xxxxxx",
            "oss.client.base_path":"snapshot/",
            "oss.client.compress": true
        }
    }

參數

說明

endpoint

OSS Bucket的內網訪問網域名稱。擷取方式,請參見訪問網域名稱和資料中心

access_key_id

用於標識使用者。擷取方式,請參見擷取AccessKey

secret_access_key

用於驗證使用者的密鑰。擷取方式,請參見擷取AccessKey

bucket

OSS Bucket的名稱,需要一個已經存在的Bucket。擷取方式,請參見控制台建立儲存空間

compress

開啟快照檔案的壓縮功能:

  • true:開啟壓縮功能,僅應用於中繼資料檔案(索引映射和設定)。

  • false(預設值):不開啟壓縮功能,資料檔案未壓縮。

chunk_size

當您上傳的資料非常大時,配置此參數可以限制快照過程中分塊的大小。超過這個大小,資料將會被分塊上傳到OSS中。

base_path

倉庫的起始位置,預設為根目錄。可以指定具體快照的存放目錄,例如snapshot/myindex/。

擷取倉庫資訊

擷取所有倉庫的資訊

GET _snapshot

擷取指定倉庫的資訊

GET _snapshot/my_backup

建立快照

為全部索引建立快照

PUT _snapshot/my_backup/snapshot_1

以上命令會為所有開啟的索引建立名稱為snapshot_1的快照,並儲存到my_backup倉庫中。該命令會立刻返回,並在後台執行備份任務。如果您希望任務執行完成後再返回,可通過添加wait_for_completion實現。該參數會阻塞調用直到備份完成,如果是大型快照,需要很長時間才能返回。

PUT _snapshot/my_backup/snapshot_1?wait_for_completion=true
說明
  • 一個倉庫可以包含多個快照,每個快照中可以包含所有、部分或單個索引的備份資料。

  • 第一次建立快照時,系統會備份所有的資料,後續所有的快照僅備份已存快照和新快照之間的增量資料。隨著快照的不斷進行,備份也在增量的添加和刪除。這意味著後續備份會相當快速,因為它們只傳輸很小的資料量。

為指定索引建立快照

系統預設會備份所有開啟的索引。如果您在使用Kibana,並且考慮到磁碟空間大小因素,不需要把所有診斷相關的.kibana索引都備份起來,那麼可以在建立快照時,指定需要備份的索引。

PUT _snapshot/my_backup/snapshot_2
{
    "indices": "index_1,index_2"
}

以上命令只會備份名稱為index_1index_2的索引。

查看快照資訊

查看所有快照資訊

GET _snapshot/my_backup/_all

預期結果如下:

{
  "snapshots": [
    {
      "snapshot": "snapshot_1",
      "uuid": "vIdSCkthTeGa0nSj4D****",
      "version_id": 5050399,
      "version": "5.5.3",
      "indices": [
        ".kibana"
      ],
      "state": "SUCCESS",
      "start_time": "2018-06-28T01:22:39.609Z",
      "start_time_in_millis": 1530148959609,
      "end_time": "2018-06-28T01:22:39.923Z",
      "end_time_in_millis": 1530148959923,
      "duration_in_millis": 314,
      "failures": [],
      "shards": {
        "total": 1,
        "failed": 0,
        "successful": 1
      }
    },
    {
      "snapshot": "snapshot_3",
      "uuid": "XKO_Uwz_Qu6mZrU3Am****",
      "version_id": 5050399,
      "version": "5.5.3",
      "indices": [
        ".kibana"
      ],
      "state": "SUCCESS",
      "start_time": "2018-06-28T01:25:00.764Z",
      "start_time_in_millis": 1530149100764,
      "end_time": "2018-06-28T01:25:01.482Z",
      "end_time_in_millis": 1530149101482,
      "duration_in_millis": 718,
      "failures": [],
      "shards": {
        "total": 1,
        "failed": 0,
        "successful": 1
      }
    }
  ]
}

根據快照名查看指定快照的資訊

GET _snapshot/my_backup/snapshot_3

預期結果如下:

{
  "snapshots": [
    {
      "snapshot": "snapshot_3",
      "uuid": "vIdSCkthTeGa0nSj4D****",
      "version_id": 5050399,
      "version": "5.5.3",
      "indices": [
        ".kibana"
      ],
      "state": "SUCCESS",
      "start_time": "2018-06-28T01:22:39.609Z",
      "start_time_in_millis": 1530148959609,
      "end_time": "2018-06-28T01:22:39.923Z",
      "end_time_in_millis": 1530148959923,
      "duration_in_millis": 314,
      "failures": [],
      "shards": {
        "total": 1,
        "failed": 0,
        "successful": 1
      }
    }
  ]
}

使用_status API查看指定快照的資訊

GET _snapshot/my_backup/snapshot_3/_status

_status API可以查看快照的詳細資料。不僅包括快照的總體狀況,也包括每個索引和每個分區的統計值。執行成功後,返回結果如下。

{
"snapshots": [
   {
      "snapshot": "snapshot_3",
      "repository": "my_backup",
      "state": "IN_PROGRESS", 
      "shards_stats": {
         "initializing": 0,
         "started": 1, 
         "finalizing": 0,
         "done": 4,
         "failed": 0,
         "total": 5
      },
      "stats": {
         "number_of_files": 5,
         "processed_files": 5,
         "total_size_in_bytes": 1792,
         "processed_size_in_bytes": 1792,
         "start_time_in_millis": 1409663054859,
         "time_in_millis": 64
      },
      "indices": {
         "index_3": {
            "shards_stats": {
               "initializing": 0,
               "started": 0,
               "finalizing": 0,
               "done": 5,
               "failed": 0,
               "total": 5
            },
            "stats": {
               "number_of_files": 5,
               "processed_files": 5,
               "total_size_in_bytes": 1792,
               "processed_size_in_bytes": 1792,
               "start_time_in_millis": 1409663054859,
               "time_in_millis": 64
            },
            "shards": {
               "0": {
                  "stage": "DONE",
                  "stats": {
                     "number_of_files": 1,
                     "processed_files": 1,
                     "total_size_in_bytes": 514,
                     "processed_size_in_bytes": 514,
                     "start_time_in_millis": 1409663054862,
                     "time_in_millis": 22
                }
             }
          }
        }
      }
    }
  ]
}

刪除快照

刪除指定的快照。如果該快照進行中,執行以下命令,系統會中斷快照進程並刪除倉庫中建立到一半的快照。

DELETE _snapshot/my_backup/snapshot_3
警告

刪除快照請使用DELETE API,而不能使用其他機制刪除(例如手動刪除可能會造成備份嚴重損壞)。因為快照是增量的,很多快照可能依賴於之前的備份資料。DELETE API能夠過濾出還在被其他快照使用的資料,只刪除不再被使用的備份資料。

從快照恢複

重要
  • 建議不要恢複.開頭的系統索引,此操作可能會導致Kibana訪問失敗。

  • 如果叢集中存在與待恢複索引同名的索引,需要提前刪除或者關閉該同名索引後再恢複,否則恢複失敗。

  • 如果需要跨地區恢複叢集快照,需要先將原地區OSS中的快照資料移轉到目標地區的OSS中,再恢複到目標地區的Elasticsearch叢集中。OSS間遷移的具體操作,請參見遷移實施

在目的地組群中建立OSS倉庫

在將快照恢複到目的地組群前,需要在目的地組群中建立倉庫,並映射到與快照備份相同的OSS地址中,詳細資料請參見建立倉庫

PUT _snapshot/my_backup_restore/
{
    "type": "oss",
    "settings": {
        "endpoint": "http://oss-cn-hangzhou-internal.aliyuncs.com",
        "access_key_id": "xxxx",
        "secret_access_key": "xxxxxx",
        "bucket": "xxxxxx",
        "compress": true,
        "chunk_size": "500mb",
        "base_path": "snapshot/"
    }
}

恢複指定索引

如果您需要在不替換現有資料的前提下,恢複舊版本的資料來驗證內容,或者進行其他處理,可恢複指定的索引,並重新命名該索引。

POST /_snapshot/my_backup_restore/snapshot_1/_restore
{
 "indices": "index_1", 
 "rename_pattern": "index_(.+)", 
 "rename_replacement": "restored_index_$1" 
}

參數

說明

indices

只恢複index_1索引,忽略快照中的其他索引。

rename_pattern

尋找正在恢複的索引,該索引名稱需要與提供的模板匹配。

rename_replacement

重新命名尋找到的索引。

恢複所有索引(除.開頭的系統索引)

POST _snapshot/my_backup_restore/snapshot_1/_restore 
{"indices":"*,-.monitoring*,-.security*,-.kibana*","ignore_unavailable":"true"}

恢複所有索引(包含.開頭的系統索引)

POST _snapshot/my_backup_restore/snapshot_1/_restore
  • 假設snapshot_1中包含5個索引,那麼這5個索引都會被恢複到叢集中。

  • _restore API會立刻返回,恢複進程會在後台進行。如果您希望調用阻塞直到恢複完成,可以添加wait_for_completion參數。

    POST _snapshot/my_backup_restore/snapshot_1/_restore?wait_for_completion=true

查看快照恢複資訊

您可以通過_recovery API來監控快照恢複的狀態、進度等資訊。

查看快照中指定索引的恢複狀態

GET restored_index_3/_recovery

查看叢集中的所有索引的恢複資訊

說明

擷取的恢複資訊可能包含跟您的恢複進程無關的其他分區的恢複資訊。

GET /_recovery/

預期結果如下:

{
   "restored_index_3" : {
     "shards" : [ {
       "id" : 0,
       "type" : "snapshot",
       "stage" : "index",
       "primary" : true,
       "start_time" : "2014-02-24T12:15:59.716",
       "stop_time" : 0,
       "total_time_in_millis" : 175576,
       "source" : {
         "repository" : "my_backup",
         "snapshot" : "snapshot_3",
         "index" : "restored_index_3"
       },
       "target" : {
         "id" : "ryqJ5lO5S4-lSFbGnt****",
         "hostname" : "my.fqdn",
         "ip" : "10.0.**.**",
         "name" : "my_es_node"
       },
       "index" : {
         "files" : {
           "total" : 73,
           "reused" : 0,
           "recovered" : 69,
           "percent" : "94.5%"
         },
         "bytes" : {
           "total" : 79063092,
           "reused" : 0,
           "recovered" : 68891939,
           "percent" : "87.1%"
         },
         "total_time_in_millis" : 0
       },
       "translog" : {
         "recovered" : 0,
         "total_time_in_millis" : 0
       },
       "start" : {
         "check_index_time" : 0,
         "total_time_in_millis" : 0
       }
     } ]
   }
}

輸出結果會展示所有恢複中的索引,並列出這些索引中的所有分區。同時每個分區中會展示啟動和停止時間、期間、恢複百分比、傳輸位元組數等統計值。部分參數說明如下。

參數

說明

type

恢複的類型。snapshot表示這個分區是在從一個快照恢複。

source

待恢複的快照和倉庫。

percent

恢複的進度。94.5%表示對應分區已經恢複了94.5%的資料。

刪除進行中快照恢複的索引

通過DELETE命令刪除正在恢複的索引,取消恢複操作。

DELETE /restored_index_3

如果restored_index_3正在恢複中,以上刪除命令會停止恢複,同時刪除所有已經恢複到叢集中的資料。

相關文檔