在實際工作中,我們經常會遇到需要將自建的 Elasticsearch 遷移上云,或者遷移到其他 ES 集群的情況。這時,選擇合適的數據遷移方案就顯得尤為重要啦。今天就來給大家介紹三種常用的遷移方案,分別是 COS 快照、logstash 和 elasticsearch - dump,小伙伴們可以根據自己的業務需求挑選哦~
如果業務可以停服或者暫停寫操作,那這幾種方式都可以考慮:
- COS 快照(Cloud Object Storage)
- logstash
- elasticsearch - dump
一、COS 快照數據備份
基于 COS 快照的遷移方式是借助 ES 的 snapshot api 接口來實現的。簡單來說,就是先從源 ES 集群創建索引快照,然后在目標 ES 集群中進行恢復。不過,用這種方式遷移時,有個特別需要注意的點就是 ES 的版本問題:目標 ES 集群的主版本號(比如 5.6.4 中的 5 就是主版本號)要大于等于源 ES 集群的主版本號。而且 1.x 版本的集群創建的快照不能在 5.x 版本中恢復哦??。
創建 repository 倉庫
創建快照之前,必須先創建 repository 倉庫,一個倉庫可以包含多份快照文件。repository 主要有以下幾種類型:
- fs:共享文件系統,快照文件就存放在文件系統里。
- url:指定文件系統的 URL 路徑,支持 http、https、ftp、file、jar 這些協議。
- s3:AWS S3 對象存儲,快照存放在 S3 中,需要以插件形式支持,安裝插件可以參考相關文檔。
- hdfs:快照存放在 hdfs 中,也是以插件形式支持,安裝插件可參考對應文檔。
- cos:快照存放在騰訊云 COS 對象存儲中,同樣以插件形式支持,安裝插件后要重啟集群才能用哦,安裝方法可以參考相關文檔。
如果是從自建 ES 集群遷移到騰訊云的 ES 集群,直接用 COS 類型倉庫就很方便。但得先在自建 ES 集群上安裝 cos - repository 插件,之后把自建 ES 集群的數據備份到 COS,再在騰訊云的 ES 集群中恢復就行啦。
要是自建 ES 集群不方便安裝 cos - repository 插件,但已經安裝了 repository - s3 或者 repository - hdfs 插件,那可以先把數據備份到 S3 或者 HDFS 中,再把備份好的文件上傳到騰訊云 COS,最后在騰訊云的集群中恢復。
創建 COS 倉庫可以用下面這個命令:
PUT _snapshot/my_cos_backup{"type": "cos","settings": {"app_id": "xxxxxxx","access_key_id": "xxxxxx","access_key_secret": "xxxxxxx","bucket": "xxxxxx","region": "ap-guangzhou","compress": true,"chunk_size": "500mb","base_path": "/"}}
這里面的參數意思分別是:
- app_id:騰訊云賬號 APPID。
- access_key_id:騰訊云 API 密鑰 SecretId。
- access_key_secret:騰訊云 API 密鑰 SecretKey。
- bucket:COS Bucket 名字,是不帶 appId 后綴的哦。
- region:COS Bucket 地域,一定要和 ES 集群在同一個地域。
- base_path:備份目錄。
在源 ES 集群中創建 snapshot
調用 snapshot api 就能創建快照來備份索引數據,創建的時候可以指定備份部分索引,也可以備份所有索引,具體的參數可以去看官方文檔。
備份所有索引:把源 ES 集群中的所有索引備份到 my_cos_backup 倉庫下,命名為 snapshot_1,用這個命令:
PUT _snapshot/my_cos_backup/snapshot_1
這個命令會立刻返回,然后在后臺異步執行。要是想讓命令阻塞執行,加上 wait_for_completion 參數就行:
PUT _snapshot/my_cos_backup/snapshot_1?wait_for_completion=true
命令執行時間和索引大小有關哦。
備份指定索引:創建快照時可以指定要備份的索引,像這樣:
PUT _snapshot/my_cos_backup/snapshot_2{"indices": "index_1,index_2"}
這里要注意,indices 的值有多個索引時,要用逗號隔開,而且不能有空格。
查看快照狀態
想知道快照有沒有備份完成,用下面這個命令,返回結果中 state 字段是 SUCCESS 就說明備份成功啦:
GET _snapshot/my_cos_backup/snapshot_1
在目標 ES 集群中創建 repository
在目標 ES 集群中創建倉庫的方法和在源 ES 集群中是一樣的哦。
從快照恢復
把快照中備份的所有索引恢復到 ES 集群,用這個命令:
POST _snapshot/my_cos_backup/snapshot_1/_restore
如果 snapshot_1 里有 5 個索引,那這 5 個都會被恢復。還可以用附加選項對索引重命名,比如想恢復單個索引并換個名字:
POST /_snapshot/my_cos_backup/snapshot_1/_restore{"indices": "index_1","rename_pattern": "index_(.+)","rename_replacement": "restored_index_$1"}
這里的 indices 是說只恢復 index_1 索引,rename_pattern 是查找能匹配上的正在恢復的索引,rename_replacement 是把匹配的索引重命名成新的模式。
查看索引恢復狀態
可以調用 _recovery API 查看指定索引的恢復進度:
GET index_1/_recovery
也可以用這個 API 查看指定索引的狀態,status 是 green 就說明完全恢復啦:
GET _cluster/health/index_1
二、logstash工具
logstash 可以從一個 ES 集群讀取數據再寫入到另一個 ES 集群,所以也能用來做數據遷移。不過用它遷移前,有幾點要注意:
- 要在和騰訊云 ES 集群相同的 VPC 下創建 CVM,部署 logstash,而且這個 CVM 得能訪問到源 ES 集群。
- 部署 logstash 的 CVM 配置最好高一點,比如 16 核 CPU、32GB 內存。
- logstash 應該和目標 ES 集群的主版本號相同,比如目標是 6.8.2 版本,logstash 也得用 6.8 版本。
- 要特別注意索引 type 的問題,不同版本的 ES 對索引 type 的約束不一樣,跨大版本遷移可能會因為這個導致寫入失敗,具體可以參考相關插件的說明。
給大家一個常用的 logstash 跨集群數據遷移的配置文件示例:
input {elasticsearch {hosts => "1.1.1.1:9200"index => "*"docinfo => truesize => 5000scroll => "5m"}}output {elasticsearch {hosts => ["http://2.2.2.2:9200"]user => "elastic"password => "your_password"index => "%{[@metadata][_index]}"document_type => "%{[@metadata][_type]}"document_id => "%{[@metadata][_id]}"}}
這個配置文件是把源 ES 集群的所有索引同步到目標集群,也可以設置只同步指定索引,更多功能可以去查閱相關文檔。
三、elasticsearch - dump工具
elasticsearch - dump 是一款開源的 ES 數據遷移工具,github 上有它的地址
安裝 elasticsearch - dump
它是用 node.js 開發的,可以用 npm 包管理工具直接安裝:
npm install elasticdump -g
主要參數說明
- --input:源地址,可以是 ES 集群 URL、文件或 stdin,還能指定索引,格式是 {protocol}://{host}:{port}/{index}
- --input - index:源 ES 集群中的索引
- --output:目標地址,可以是 ES 集群 URL、文件或 stdout,也能指定索引,格式和 input 類似
- --output - index:目標 ES 集群的索引
- --type:遷移類型,默認是 data,只遷移數據,還可以選 settings、analyzer、mapping、alias
如果集群有安全認證,在對應的 http 后面加上 user:password@ 就行,比如:
elasticsearch - dump --input=http://192.168.1.2:9200/my_index --output=http://user:password@192.168.1.2:9200/my_index --type=data
遷移單個索引
下面這個操作是把集群 172.16.0.39 中的 companydatabase 索引遷移到集群 172.16.0.20。首先要遷移索引的 settings,不然直接遷移 mapping 或者 data 會丟失原有配置,當然也可以在目標集群先創建好索引再同步:
elasticdump --input=http://172.16.0.39:9200/companydatabase --output=http://172.16.0.20:9200/companydatabase --type=settingselasticdump --input=http://172.16.0.39:9200/companydatabase --output=http://172.16.0.20:9200/companydatabase --type=mappingelasticdump --input=http://172.16.0.39:9200/companydatabase --output=http://172.16.0.20:9200/companydatabase --type=data
遷移所有索引
這個操作是把集群 172.16.0.39 中的所有索引遷移到集群 172.16.0.20,但不能遷移索引配置,得單獨對每個索引遷移配置,或者在目標集群先創建好索引:
elasticdump --input=http://172.16.0.39:9200 --output=http://172.16.0.20:9200
四、總結
- elasticsearch - dump 和 logstash 做跨集群數據遷移時,要求執行遷移任務的機器能同時訪問兩個集群,所以更適合源和目標 ES 集群在同一網絡的情況。而 snapshot 方式是完全離線的,沒有這個限制,適合跨云廠商遷移,比如從阿里云 ES 集群遷移到騰訊云 ES 集群,當然也可以打通網絡實現互通,但成本較高。
- elasticsearch - dump 類似 MySQL 的 mysqldump,是邏輯備份,需要一條條導出再導入,適合數據量小的場景;
- snapshot 方式則適合數據量大的場景;