天天看點

【Elasticsearch系列之五】通過snapshot遷移ES資料1、Snapshot

1、Snapshot

1.1、适合場景

1) 遷移速度快,适用資料量大的場景;

2) 需占用源叢集磁盤空間,或者借助于對象存儲,實作友商ES到騰訊雲ES,或自建ES到騰訊雲ES的資料遷移。

1.2、快照注意事項

  • 1)快照是從正在運作的Elasticsearch叢集中擷取的備份。
  • 2)您可以建立單個索引或整個群集的快照,支援本地檔案存儲,以及遠端第三方存儲庫存儲(包括:S3,HDFS,Azure,Google Cloud Storage等)。
  • 3)快照是

    增量

    建立的。這意味着,當建立索引快照時,Elasticsearch避免複制任何已存儲在存儲庫中的資料作為同一索引的早期快照的一部分。是以,可以

    非常頻繁

    地為叢集建立快照。
  • 4)如果您的叢集啟用了Elasticsearch安全功能,則在備份資料時,必須授權快照API調用。
  • 5)在更新之前備份資料時,請記住,如果快照中包含與更新版本不相容的版本中建立的索引,則可能導緻更新後将無法還原快照。
  • 6)相容清單如下:在1.x中建立的索引快照可以恢複到2.x。在2.x中建立的索引快照可以恢複到5.x。 在5.x中建立的索引快照可以恢複到6.x。在6.x中建立的索引快照可以恢複到7.x。反例:無法将在1.x中建立的索引快照還原到5.x或6.x,無法将在2.x中建立的索引快照還原到6.x或7.x,以及無法将在5.X建立的索引快照還原到7.x。
  • 7)要保證還原的叢集有足夠的存儲容量。

1.3、騰訊雲ES備份到COS使用方式

snapshot api 是 Elasticsearch用于對資料進行備份和恢複的一組 api 接口,可以通過 snapshot api 進行跨叢集的資料遷移,原理就是從源 ES 叢集建立資料快照,然後在目标 ES 叢集中進行恢複。Snapshot備份方式不需要在目标ES叢集提前建立索引mapping和setting等資訊。

1.4、具體步驟

1) 源 ES 叢集中建立 repository

建立快照前必須先建立 repository 倉庫,一個 repository 倉庫可以包含多份快照檔案,repository 主要有以下幾種類型:

Ø fs:共享檔案系統,将快照檔案存放于檔案系統中。

Ø url:指定檔案系統的 URL 路徑,支援協定:http、https、ftp、file、jar。

s3:AWS S3 對象存儲,快照存放于 S3 中,以插件形式支援,安裝插件 repository-s3(https://www.elastic.co/guide/en/elasticsearch/plugins/current/repository-s3.html)。

hdfs:快照存放于 hdfs 中,以插件形式支援,安裝插件 repository-hdfs(https://www.elastic.co/guide/en/elasticsearch/plugins/current/repository-hdfs.html)。

cos:快照存放于騰訊雲 COS 對象存儲中,以插件形式支援,安裝插件 elasticsearch-repository-cos(https://github.com/tencentyun/elasticsearch-repository-cos)。

從自建 ES 叢集遷移至騰訊雲 ES 叢集,可直接使用 fs 類型倉庫,但需要在 ES 配置檔案 elasticsearch.yml 中設定倉庫路徑。

path.repo: ["/usr/local/services/test"]           

複制

然後調用 snapshot api 建立 repository,具體如下:

curl -XPUT http://172.16.0.39:9200/_snapshot/my_backup -H 'Content-Type: application/json' -d '
{
   "type": "fs",
   "settings": {
        "location": "/usr/local/services/test" 
        "compress": true
   }
}'           

複制

從其它雲廠商的 ES 叢集遷移至騰訊雲 ES 叢集,或騰訊雲内部的 ES 叢集遷移,可使用對應雲廠商提供的倉庫類型,例如 AWS 的 S3、阿裡雲的 OSS 和騰訊雲的 COS 等。

curl -XPUT http://172.16.0.39:9200/_snapshot/my_s3_repository
{
  "type": "s3",
 "settings": {
   "bucket": "my_bucket_name",
   "region": "us-west"
 }
}           

複制

2) 源 ES 叢集中建立 snapshot

調用 snapshot api 在建立好的倉庫中建立快照。建立快照可以指定索引,也可以指定快照中包含的内容,具體的 api 接口參數可以查閱官方文檔:https://www.elastic.co/guide/en/elasticsearch/reference/6.4/modules-snapshots.html

Ø 備份所有索引

将 ES 叢集内所有索引備份到my_backup倉庫下,并命名為snapshot_1,這個指令會立刻傳回,并在背景異步執行直到結束。如果希望建立快照指令阻塞執行,可以添加wait_for_completion參數。指令執行的時間與索引大小相關。

curl -XPUT http://172.16.0.39:9200/_snapshot/my_backup/snapshot_1?wait_for_completion=true           

複制

Ø 備份指定索引

可以在建立快照的時候指定要備份的索引。參數 indices 的值為多個索引的時候,需要用,隔開且不能有空格。

注意:在實際生産環境中,建議手動指定索引進行備份,因為源ES叢集可能存在預設同名的索引,在執行索引恢複的時候會報錯。

curl -XPUT http://172.16.0.39:9200/_snapshot/my_cos_backup/snapshot_2
{
"indices": "index_1,index_2"
}           

複制

3) 目标 ES 叢集中建立 repository

目标 ES 叢集中建立倉庫和在源 ES 叢集中建立倉庫類似,使用者可在騰訊雲上建立 COS 對象 bucket,把倉庫建在 COS 的某個 bucket 下。

4) 移動源 ES 叢集 snapshot 至目标 ES 叢集的倉庫

把源 ES 叢集建立好的 snapshot 上傳至目标 ES 叢集建立好的倉庫中。

5) 從快照恢複

curl -XPUT http://172.16.0.20:9200/_snapshot/my_backup/snapshot_1/_restore           

複制

執行快照恢複指令會把把這個快照裡的備份的所有索引都恢複到ES叢集中。如果 snapshot_1 包括五個索引,這五個都會被恢複到我們叢集裡。

可以用附加的選項用來重命名索引。這個選項允許您通過模式比對索引名稱,然後通過恢複程序提供一個新名稱。如果您想在不替換現有資料的前提下,恢複老資料來驗證内容,或者做其他處理,這個選項很有用。讓我們從快照裡恢複單個索引并提供一個替換的名稱:

curl -XPOST http://172.16.0.20:9200/_snapshot/my_cos_backup/snapshot_1/_restore
{
    "indices": "index_1",
    "rename_pattern": "index_(.+)",
    "rename_replacement": "restored_index_1"
}           

複制

Ø 隻恢複 index_1 索引,忽略快照中存在的其餘索引;

Ø 查找所提供的模式能比對上的正在恢複的索引;

Ø 然後把它們重命名成替代的模式。

6) 檢視快照恢複狀态

通過執行_recovery指令,可以檢視快照恢複的狀态,監控快照恢複的進度。

這個 API 可以為您在恢複的指定索引單獨調用:

curl -XGET http://172.16.0.20:9200/index_1/_recovery           

複制

這個指令會傳回指定索引各分片的恢複狀況:

{
    "sonested": {
        "shards": [
            {
                "id": 1,
                "type": "SNAPSHOT",
                "stage": "INDEX",
                "primary": true,
                "start_time_in_millis": 1525766148333,
                "total_time_in_millis": 8718,
                "source": {
                    "repository": "my_backup2",
                    "snapshot": "snapshot",
                    "version": "5.6.4",
                    "index": "sonested"
                },
                "target": {
                    "id": "TlzmxJHwSqyv4rhyQfRkow",
                    "host": "10.0.0.6",
                    "transport_address": "10.0.0.6:9300",
                    "ip": "10.0.0.6",
                    "name": "node-1"
                },
                "index": {
                    "size": {
                        "total_in_bytes": 1374967573,
                        "reused_in_bytes": 0,
                        "recovered_in_bytes": 160467084,
                        "percent": "11.7%"
                    },
                    "files": {
                        "total": 132,
                        "reused": 0,
                        "recovered": 20,
                        "percent": "15.2%"
                    },
                    "total_time_in_millis": 8716,
                    "source_throttle_time_in_millis": 0,
                    "target_throttle_time_in_millis": 0
                },
                "translog": {
                    "recovered": 0,
                    "total": 0,
                    "percent": "100.0%",
                    "total_on_start": 0,
                    "total_time_in_millis": 0
                },
                "verify_index": {
                    "check_index_time_in_millis": 0,
                    "total_time_in_millis": 0
                }
            },
            {
                "id": 0,
                "type": "SNAPSHOT",
                "stage": "INDEX",
                "primary": true,
                "start_time_in_millis": 1525766148296,
                "total_time_in_millis": 8748,
                "source": {
                    "repository": "my_backup2",
                    "snapshot": "snapshot",
                    "version": "5.6.4",
                    "index": "sonested"
                },
                "target": {
                    "id": "rOupcFi7Rn-kc2PzEoRMMQ",
                    "host": "10.0.0.15",
                    "transport_address": "10.0.0.15:9300",
                    "ip": "10.0.0.15",
                    "name": "node-3"
                },
                "index": {
                    "size": {
                        "total_in_bytes": 1362775831,
                        "reused_in_bytes": 0,
                        "recovered_in_bytes": 155162131,
                        "percent": "11.4%"
                    },
                    "files": {
                        "total": 125,
                        "reused": 0,
                        "recovered": 27,
                        "percent": "21.6%"
                    },
                    "total_time_in_millis": 8736,
                    "source_throttle_time_in_millis": 0,
                    "target_throttle_time_in_millis": 0
                },
                "translog": {
                    "recovered": 0,
                    "total": 0,
                    "percent": "100.0%",
                    "total_on_start": 0,
                    "total_time_in_millis": 0
                },
                "verify_index": {
                    "check_index_time_in_millis": 0,
                    "total_time_in_millis": 0
                }
            }
        ]
    }
}           

複制

Ø type 字段告訴您這個分片是在從一個快照恢複;

Ø source 描述了作為恢複來源的特定快照和倉庫;

Ø percent 字段顯示恢複的狀态。

輸出會列出所有目前正在經曆恢複的索引,然後列出這些索引裡的所有分片。每個分片裡會有啟動/停止時間、持續時間、恢複百分比、傳輸位元組數等統計值。

7) 取消快照恢複

如果要停止對索引restored_index_3的快照恢複,可以執行以下指令(這個删除指令會停止恢複,同時删除所有已經恢複到叢集裡的資料):

DELETE /restored_index_3           

複制