大量數據場景下,elasticsearch 跨集羣數據遷移

方案:採用 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章