備份和還原Elasticsearch索引數據

Facebook

Pinterest WhatsApp

    在此博客文章中,您將學習如何備份和還原Elasticsearch Index數據。嗯,進行數據備份有多種原因。主要原因之一是保護主數據不受系統硬件/軟件故障導致的任何不可預見的損害。如果是Elasticsearch,則出於其他原因,您可能希望將數據遷移到新的Elastic集群。

    備份和還原Elasticsearch索引數據

    那麼,如何備份和還原Elasticsearch索引數據呢?

    在ELK / Elastic堆棧中,Elasticsearch備份稱為 snapshot。可以為整個運行中的Elasticsearch集群(包括其所有數據流和索引)拍攝快照,具體而言 數據流 或特定的Elasticsearch索引。

    在本教程中,我們將使用單節點Elasticsearch集群。

    註冊快照存儲庫

    在對Elasticsearch索引/集群進行快照之前,必須首先註冊一個存儲庫。 Elasticsearch存儲庫有不同類型。

    在此設置中,我們將使用共享文件系統存儲庫。

    註冊快照存儲庫

    要註冊文件系統存儲庫,您需要在所有主節點/數據節點Elasticsearch配置文件上定義文件系統位置。這是您要存儲備份/快照的路徑/位置。

    在我們的設置中,我們已將備份磁盤安裝在 /mnt/es_backup

    df -hT -P /mnt/es_backup/
    Filesystem     Type  Size  Used Avail Use% Mounted on
    /dev/sdb1      ext4  3.9G   16M  3.7G   1% /mnt/es_backup

    要在Elasticsearch配置文件上定義備份位置的路徑位置,請使用選項, path.repo

    path.repo: ["/mnt/es_backup"]

    您只需將此行回顯到配置文件即可;

    echo 'path.repo: ["/mnt/es_backup"]' >> /etc/elasticsearch/elasticsearch.yml

    將存儲庫路徑的所有權設置為 elasticsearch 用戶。

    chown -R elasticsearch: /mnt/es_backup/

    如果您有多節點群集,請在所有主節點和數據節點上設置相同的配置。

    完成後,重新啟動elasticsearch。

    systemctl restart elasticsearch

    定義備份/快照位置後,現在可以通過運行以下命令進行註冊。請記住,在此設置中,我們正在使用文件系統存儲庫。

    curl -X PUT "192.168.57.20:9200/_snapshot/es_backup?pretty" -H 'Content-Type: application/json' -d'
    {
      "type": "fs",
      "settings": {
        "location": "/mnt/es_backup"
      }
    }
    '

    運行命令時,應該得到輸出;

    {
      "acknowledged" : true
    }

    獲取有關快照存儲庫的信息

    要檢索有關已註冊存儲庫的信息,請運行以下命令;

    curl -X GET "192.168.57.20:9200/_snapshot/es_backup?pretty"

    樣品輸出;

    {
      "es_backup" : {
        "type" : "fs",
        "settings" : {
          "location" : "/mnt/es_backup"
        }
      }
    }

    查看所有存儲庫;

    curl -X GET "192.168.57.20:9200/_snapshot/_all?pretty"

    創建Elasticsearch快照/備份

    創建整個Elasticsearch集群的快照

    註冊快照存儲庫後,現在可以創建快照,如下所示。 “一個存儲庫可以包含同一集群的多個快照。 快照由群集中的唯一名稱標識。”

    以創建快照為例 es_backup_202104192200,您將運行這樣的命令;

    curl -X PUT "192.168.57.20:9200/_snapshot/es_backup/es_backup_202104192200?pretty"
    {
      "accepted" : true
    }

    默認情況下,快照會備份群集中的所有數據流和打開的索引。

    命令完成運行後,請查看backup / snapshot目錄的樣本內容;

    ls -1 /mnt/es_backup/
    index-0
    index.latest
    indices
    meta-T0tfilSMSbCfVvJqpffPxA.dat
    snap-T0tfilSMSbCfVvJqpffPxA.dat

    就目前而言,我只有一些用於演示的索引;

    curl 192.168.57.20:9200/_cat/indices?pretty
    yellow open filebeat-7.10.1-2021.04.16-000001 XWQ7QQ_9Tpar_rPE5dn0Sw 1 1    24  0  146kb  146kb
    yellow open filebeat-7.12.0-2021.04.19-000001 0sQCK1OTRWiosULRHKQMpw 1 1 66423  0 15.5mb 15.5mb
    ...

    創建特定Elasticsearch索引的快照

    假設我要備份一個特定的索引, filebeat-7.12.0-2021.04.19-000001;

    curl -X PUT "192.168.57.20:9200/_snapshot/es_backup/filebeat_202104192200?pretty" -H 'Content-Type: application/json' -d'
    {
      "indices": "filebeat-7.12.0-2021.04.19-000001",
      "ignore_unavailable": true,
      "include_global_state": false
    }
    '

    拍攝快照時,可以包括其他選項,例如;

    • ignore_unavailable:選擇 true 或者 false
      • 設置為true時,它將導致在拍攝快照時忽略不存在的索引/數據流。
      • 如果未定義,則在進行快照時如果數據流或索引丟失,則快照將失敗。
    • include_global_state:可以設置為 truefalse
      • 如果設置為 true,它將導致快照將當前群集狀態保存為快照的一部分。
      • 如果設置為 false,它可以防止將群集全局狀態存儲為快照的一部分。
    • partial
      • 如果設置為false(默認值),則如果快照中的一個或多個索引沒有所有可用的主分片,則快照將失敗。
      • 如果設置為true,則即使快照中的一個或多個索引沒有所有可用的主分片,快照也將發生。
    • expand_wildcards
      • 用於控制是否 hiddenclosed 索引將包含在快照中,默認為 all
    • metadata
      • 添加信息,例如誰拍攝了快照,為什麼拍攝快照或其他可能對快照有用的數據。

    參見下面的例子;

    curl -X PUT "192.168.57.20:9200/_snapshot/es_backup/filebeat_202104192200?pretty" -H 'Content-Type: application/json' -d'
    {
      "indices": "filebeat-7.12.0-2021.04.19-000001",
      "ignore_unavailable": true,
      "include_global_state": false,
      "metadata": {
        "taken_by": "kifarunix",
        "taken_because": "test backup"
      }
    }
    '

    查看快照信息

    要查看有關在特定存儲庫中創建的快照的信息,請運行以下示例命令。

    例如,要查看有關 es_backup_202104192200 快照

    curl -X GET "192.168.57.20:9200/_snapshot/es_backup/es_backup_202104192200?pretty"
    {
      "snapshots" : [
        {
          "snapshot" : "es_backup_202104192200",
          "uuid" : "T0tfilSMSbCfVvJqpffPxA",
          "version_id" : 7100099,
          "version" : "7.10.0",
          "indices" : [
            ".kibana_task_manager_1",
            "filebeat-7.12.0-2021.04.19-000001",
            "filebeat-7.10.1-2021.04.16-000001",
            ".kibana-event-log-7.10.0-000001",
            ".async-search",
            ".apm-agent-configuration",
            "ilm-history-3-000001",
            ".kibana_1",
            ".apm-custom-link"
          ],
          "data_streams" : [ ],
          "include_global_state" : true,
          "state" : "SUCCESS",
          "start_time" : "2021-04-19T19:57:08.912Z",
          "start_time_in_millis" : 1618862228912,
          "end_time" : "2021-04-19T19:57:56.691Z",
          "end_time_in_millis" : 1618862276691,
          "duration_in_millis" : 47779,
          "failures" : [ ],
          "shards" : {
            "total" : 9,
            "failed" : 0,
            "successful" : 9
          }
        }
      ]
    }

    您可以在備份快照中看到索引和數據流。

    查看存儲庫中的所有快照;

    curl -X GET "192.168.57.20:9200/_snapshot/es_backup/_all?pretty"

    恢復Elasticsearch快照/備份

    現在,假設您不小心刪除了一個已經為其備份的索引。這樣就很容易還原Elasticsearch快照。

    根據 Elasticsearch快照還原;

    • 您無法將快照從更高版本的Elasticsearch還原到運行早期版本的Elasticsearch的集群中。例如,您不能將7.6.0中創建的快照還原到運行7.5.0的群集。
    • 您無法將索引還原到運行Elasticsearch版本的集群中,該版本比用於快照索引的Elasticsearch版本多一個主要版本。例如,您不能將索引從5.0中創建的快照還原到運行7.0的群集。

    下表總結了群集版本之間的快照兼容性。

    集群版本
    快照版本2.x5.x6.x7.x8.x
    1.x不不不不
    2.x是的是的不不不
    5.x不是的是的不不
    6.x不不是的是的不
    7.x不不不是的是的

    在上面,我們學習了如何為整個集群以及單個Elasticsearch索引拍攝快照。

    因此,出於演示目的,讓我們刪除當前Elasticsearch上的索引;

    curl -X DELETE "192.168.57.20:9200/_all?pretty"
    {
      "acknowledged" : true
    }

    如果您嘗試列出可用的索引,則會發現其中一個Kibana索引已自動創建;

    curl 192.168.57.20:9200/_cat/indices?pretty
    yellow open .kibana -CjWP5YlSdi5eqt1VpLXng 1 1 1 0 5kb 5kb

    接下來,要嘗試還原我們的常規/整個集群快照, es_backup_202104192200,則可以運行以下命令;

    curl -X POST "192.168.57.20:9200/_snapshot/es_backup/es_backup_202104192200/_restore?pretty"

    如果某些索引已經存在並在集群中打開,並且與快照中可用的某些索引匹配,則可以 關閉或刪除現有索引,或者通過提供重命名模式和替換名稱以其他名稱還原索引

    樣本錯誤;

    {
      "error" : {
        "root_cause" : [
          {
            "type" : "snapshot_restore_exception",
            "reason" : "[es_backup:es_backup_202104192200/T0tfilSMSbCfVvJqpffPxA] cannot restore index [ilm-history-3-000001] because an open index with same name already exists in the cluster. Either close or delete the existing index or restore the index under a different name by providing a rename pattern and replacement name"
          }
        ],
        "type" : "snapshot_restore_exception",
        "reason" : "[es_backup:es_backup_202104192200/T0tfilSMSbCfVvJqpffPxA] cannot restore index [ilm-history-3-000001] because an open index with same name already exists in the cluster. Either close or delete the existing index or restore the index under a different name by providing a rename pattern and replacement name"
      },
      "status" : 500
    }

    因此,讓我們關閉抱怨指數

    curl -X POST "192.168.57.20:9200/ilm-history-3-000001/_close?pretty"
    {
      "acknowledged" : true,
      "shards_acknowledged" : true,
      "indices" : {
        "ilm-history-3-000001" : {
          "closed" : true
        }
      }
    }

    如果出現這樣的錯誤;

    {
      "error" : {
        "root_cause" : [
          {
            "type" : "illegal_state_exception",
            "reason" : "index, alias, and data stream names need to be unique, but the following duplicates were found [.kibana (alias of [.kibana_1/vSrhd_CyTva5oI1ggwnCuQ]) conflicts with index]"
          }
        ],
        "type" : "illegal_state_exception",
        "reason" : "index, alias, and data stream names need to be unique, but the following duplicates were found [.kibana (alias of [.kibana_1/vSrhd_CyTva5oI1ggwnCuQ]) conflicts with index]"
      },
      "status" : 500
    }

    再次刪除索引;

    curl -X DELETE "192.168.57.20:9200/_all?pretty"

    並在自動創建.kibana索引之前立即運行快照還原。

    現在,當您運行快照還原時;

    curl -X POST "192.168.57.20:9200/_snapshot/es_backup/es_backup_202104192200/_restore?pretty"

    你應該得到;

    {
      "accepted" : true
    }

    現在再次列出索引應該與以前相同;

    curl 192.168.57.20:9200/_cat/indices?pretty
    yellow open filebeat-7.10.1-2021.04.16-000001 QImIEVM9SOKvtDnO1WUyNw 1 1    24 0   146kb   146kb
    yellow open filebeat-7.12.0-2021.04.19-000001 -rYD-nUNR9m10x2W21uAAg 1 1 66423 0  15.5mb  15.5mb
    green  open .apm-custom-link                  b6b_dTNPQHOLatvVyw6fUg 1 0     0 0    208b    208b
    green  open .kibana_task_manager_1            f2Eg4u8yRvSEk47QU-wwbg 1 0     5 3 132.9kb 132.9kb
    green  open .apm-agent-configuration          kMWsZ9kBTW6xeYoe3J4sIA 1 0     0 0    208b    208b
    green  open .kibana-event-log-7.10.0-000001   -ZTzLi9zTuOnjcsm2wOhAw 1 0     2 0    11kb    11kb
    green  open .async-search                     la4iO9BFTd6qSUzrw7JKNw 1 0     2 2 924.5kb 924.5kb
    green  open .kibana_1                         gK9b55LTRCiuwm9sFRTuaQ 1 0  1558 7  10.7mb  10.7mb

    這就是備份和還原Elasticsearch索引數據的容易程度。

    這標誌着本教程有關如何備份和還原Elasticsearch Index數據的結尾。

    在我們的下一個指南中,我們將學習如何將Elasticsearch索引數據備份和還原到其他Elasticsearch集群。

    參考

    Elasticsearch快照和還原

    其他教程

    在CentOS 8上設置Kibana Elasticsearch和Fluentd

    在Fedora 30 / Fedora 29 / CentOS 7上設置多節點Elasticsearch 7.x集群

    更新/更改Kibana可視化索引模式

    Sidebar