Elasticsearch snapshot 備份的使用方法

常見的數據庫都會提供備份的機制,以解決在數據庫沒法使用的狀況下,能夠開啓新的實例,而後經過備份來恢復數據減小損失。雖然 Elasticsearch 有良好的容災性,但因爲如下緣由,其依然須要備份機制。html

  1. 數據災備。在整個集羣沒法正常工做時,能夠及時從備份中恢復數據。
  2. 歸檔數據。隨着數據的積累,好比日誌類的數據,集羣的存儲壓力會愈來愈大,不論是內存仍是磁盤都要承擔數據增多帶來的壓力,此時咱們每每會選擇只保留最近一段時間的數據,好比1個月,而將1個月以前的數據刪除。若是你不想刪除這些數據,以備後續有查看的需求,那麼你就能夠將這些數據以備份的形式歸檔。
  3. 遷移數據。當你須要將數據從一個集羣遷移到另外一個集羣時,也能夠用備份的方式來實現。

Elasticsearch 作備份有兩種方式,一是將數據導出成文本文件,好比經過 elasticdumpesm 等工具將存儲在 Elasticsearch 中的數據導出到文件中。二是以備份 elasticsearch data 目錄中文件的形式來作快照,也就是 Elasticsearch 中 snapshot 接口實現的功能。第一種方式相對簡單,在數據量小的時候比較實用,當應對大數據量場景效率就大打折扣。咱們今天就着重講解下第二種備份的方式,即 snapshot api 的使用。git

備份要解決備份到哪裏、如何備份、什麼時候備份和如何恢復的問題,那麼咱們接下來一個個解決。github

1. 備份到哪裏

在 Elasticsearch 中經過 repository 定義備份存儲類型和位置,存儲類型有共享文件系統、AWS 的 S3存儲、HDFS、微軟 Azure的存儲、Google Cloud 的存儲等,固然你也能夠本身寫代碼實現國內阿里雲的存儲。咱們這裏以最簡單的共享文件系統爲例,你也能夠在本地作實驗。數據庫

首先,你要在 elasticsearch.yml 的配置文件中註明能夠用做備份路徑 path.repo ,以下所示:json

path.repo: ["/mount/backups", "/mount/longterm_backups"]

配置好後,就可使用 snapshot api 來建立一個 repository 了,以下咱們建立一個名爲 my_backup 的 repository。api

PUT /_snapshot/my_backup
{
  "type": "fs",
  "settings": {
    "location": "/mount/backups/my_backup"
  }
}

以後咱們就能夠在這個 repository 中來備份數據了。微信

2. 如何備份

有了 repostiroy 後,咱們就能夠作備份了,也叫快照,也就是記錄當下數據的狀態。以下所示咱們建立一個名爲 snapshot_1 的快照。網絡

PUT /_snapshot/my_backup/snapshot_1?wait_for_completion=true

wait_for_completion 爲 true 是指該 api 在備份執行完畢後再返回結果,不然默認是異步執行的,咱們這裏爲了馬上看到效果,因此設置了該參數,線上執行時不用設置該參數,讓其在後臺異步執行便可。異步

執行成功後會返回以下結果,用於說明備份的狀況:elasticsearch

{
  "snapshots": [
    {
      "snapshot": "snapshot_1",
      "uuid": "52Lr4aFuQYGjMEv5ZFeFEg",
      "version_id": 6030099,
      "version": "6.3.0",
      "indices": [
        ".monitoring-kibana-6-2018.05.30",
        ".monitoring-es-6-2018.05.28",
        ".watcher-history-7-2018.05.30",
        ".monitoring-beats-6-2018.05.29",
        "metricbeat-6.2.4-2018.05.28",
        ".monitoring-alerts-6",
        "metricbeat-6.2.4-2018.05.30"
      ],
      "include_global_state": true,
      "state": "SUCCESS",
      "start_time": "2018-05-31T12:45:57.492Z",
      "start_time_in_millis": 1527770757492,
      "end_time": "2018-05-31T12:46:15.214Z",
      "end_time_in_millis": 1527770775214,
      "duration_in_millis": 17722,
      "failures": [],
      "shards": {
        "total": 28,
        "failed": 0,
        "successful": 28
      }
    }
  ]
}

返回結果的參數意義都是比較直觀的,好比 indices 指明這次備份涉及到的索引名稱,因爲咱們沒有指定須要備份的索引,這裏備份了全部索引;state 指明狀態;duration_in_millis 指明備份任務執行時長等。

咱們能夠經過 GET _snapshot/my_backup/snapshot_1獲取 snapshot_1 的執行狀態。

此時若是去 /mount/backups/my_backup 查看,會發現裏面多了不少文件,這些文件其實都是基於 elasticsearch data 目錄中的文件生成的壓縮存儲的備份文件。你們能夠經過 du -sh . 命令看一下該目錄的大小,方便後續作對比。

3. 什麼時候備份

經過上面的步驟咱們成功建立了一個備份,但隨着數據的新增,咱們須要對新增的數據也作備份,那麼咱們如何作呢?方法很簡單,只要再建立一個快照 snapshot_2 就能夠了。

PUT /_snapshot/my_backup/snapshot_2?wait_for_completion=true

當執行完畢後,你會發現 /mount/backups/my_backup 體積變大了。這說明新數據備份進來了。要說明的一點是,當你在同一個 repository 中作屢次 snapshot 時,elasticsearch 會檢查要備份的數據 segment 文件是否有變化,若是沒有變化則不處理,不然只會把發生變化的 segment file 備份下來。這其實就實現了增量備份。

elasticsearch 的資深用戶應該瞭解 force merge 功能,便可以強行將一個索引的 segment file 合併成指定數目,這裏要注意的是若是你主動調用 force merge api,那麼 snapshot 功能的增量備份功能就失效了,由於 api 調用完畢後,數據目錄中的全部 segment file 都發生變化了。

另外一個就是備份時機的問題,雖然 snapshot 不會佔用太多的 cpu、磁盤和網絡資源,但仍是建議你們儘可能在閒時作備份。

4. 如何恢復

所謂「養兵千日,用兵一時」,咱們該演練下備份的成果,將其恢復出來。經過調用以下 api 便可快速實現恢復功能。

POST /_snapshot/my_backup/snapshot_1/_restore?wait_for_completion=true
{
  "indices": "index_1",
  "rename_replacement": "restored_index_1"
}

經過上面的 api,咱們能夠將 index_1 索引恢復到 restored_index_1 中。這個恢復過程徹底是基於文件的,所以效率會比較高。

雖然咱們這裏演示的是在同一個集羣作備份與恢復,你也能夠在另外一個集羣上鍊接該 repository 作恢復。咱們這裏就不作說明了。

5. 其餘

因爲 Elasticsearch 版本更新比較快,所以你們在作備份與恢復的時候,要注意版本問題,同一個大版本之間的備份與恢復是沒有問題的,好比都是 5.1 和 5.6 之間能夠互相備份恢復。但你不能把一個高版本的備份在低版本恢復,好比將 6.x 的備份在 5.x 中恢復。而低版本備份在高版本恢復有必定要求:

1) 5.x 能夠在 6.x 恢復

2) 2.x 能夠在 5.x 恢復

3) 1.x 能夠在 2.x 恢復

其餘跨大版本的升級都是不可用的,好比1.x 的沒法在 5.x 恢復。這裏主要緣由仍是 Lucene 版本問題致使的,每一次 ES 的大版本升級都會伴隨 Lucene 的大版本,而 Lucene 的版本是儘可能保證向前兼容,即新版能夠讀舊版的文件,但版本跨越太多,沒法實現兼容的狀況也在所不免了。

6. 繼續學習

本文只是簡單對 snapshot 功能作了一個演示,但願這足夠引發你的興趣。若是你想進一步深刻的瞭解該功能,好比備份的時候如何指定部分索引、如何查詢備份和還原的進度、如何跨集羣恢復數據、如何備份到 HDFS 等,能夠詳細閱讀官方手冊https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html,若是在使用的過程當中遇到了問題,歡迎留言或者加我微信(rockybean)討論。

相關文章
相關標籤/搜索