跨集群數據遷移
用戶在騰訊雲上自建的ES集群或者在其它雲廠商購買的ES集群,如果要遷移至騰訊雲ES,用戶可以根據自己的業務需要選擇適合自己的遷移方案。如果業務可以停服或者可以暫停寫操作,可以參考離線遷移的四種方案。
離線遷移
離線遷移需要先停止老集群的寫操作,將數據遷移完畢后在新集群上進行讀寫操作。適合於業務可以停服的場景。
離線遷移大概有以下幾種方式:
- elasticsearch-dump
- snapshot
- reindex
- logstash
elasticsearch-dump
適用場景
適合數據量不大,遷移索引個數不多的場景
使用方式
elasticsearch-dump是一款開源的ES數據遷移工具,github地址: https://github.com/taskrabbit/elasticsearch-dump
1 . 安裝elasticsearch-dump
elasticsearch-dump使用node.js開發,可使用npm包管理工具直接安裝:
npm install elasticdump -g
2 . 主要參數說明
--input: 源地址,可為ES集群URL、文件或stdin,可指定索引,格式為:{protocol}://{host}:{port}/{index} --input-index: 源ES集群中的索引 --output: 目標地址,可為ES集群地址URL、文件或stdout,可指定索引,格式為:{protocol}://{host}:{port}/{index} --output-index: 目標ES集群的索引 --type: 遷移類型,默認為data,表明只遷移數據,可選settings, analyzer, data, mapping, alias --limit:每次向目標ES集群寫入數據的條數,不可設置的過大,以免bulk隊列寫滿
3 . 遷移單個索引
以下操作通過elasticdump命令將集群172.16.0.39中的companydatabase索引遷移至集群172.16.0.20。注意第一條命令先將索引的settings先遷移,如果直接遷移mapping或者data將失去原有集群中索引的配置信息如分片數量和副本數量等,當然也可以直接在目標集群中將索引創建完畢后再同步mapping與data
elasticdump --input=http://172.16.0.39:9200/companydatabase --output=http://172.16.0.20:9200/companydatabase --type=settings elasticdump --input=http://172.16.0.39:9200/companydatabase --output=http://172.16.0.20:9200/companydatabase --type=mapping elasticdump --input=http://172.16.0.39:9200/companydatabase --output=http://172.16.0.20:9200/companydatabase --type=data
4 . 遷移所有索引:以下操作通過elasticdump命令將將集群172.16.0.39中的所有索引遷移至集群172.16.0.20。 注意此操作並不能遷移索引的配置如分片數量和副本數量,必須對每個索引單獨進行配置的遷移,或者直接在目標集群中將索引創建完畢后再遷移數據
elasticdump --input=http://172.16.0.39:9200 --output=http://172.16.0.20:9200
snapshot
適用場景
適用數據量大的場景
使用方式
snapshot api是Elasticsearch用於對數據進行備份和恢復的一組api接口,可以通過snapshot api進行跨集群的數據遷移,原理就是從源ES集群創建數據快照,然后在目標ES集群中進行恢復。需要注意ES的版本問題:
目標ES集群的主版本號(如5.6.4中的5為主版本號)要大於等於源ES集群的主版本號; 1.x版本的集群創建的快照不能在5.x版本中恢復;
- 源ES集群中創建repository
創建快照前必須先創建repository倉庫,一個repository倉庫可以包含多份快照文件,repository主要有一下幾種類型
fs: 共享文件系統,將快照文件存放於文件系統中
url: 指定文件系統的URL路徑,支持協議:http,https,ftp,file,jar s3: AWS S3對象存儲,快照存放於S3中,以插件形式支持 hdfs: 快照存放於hdfs中,以插件形式支持 cos: 快照存放於騰訊雲COS對象存儲中,以插件形式支持
如果需要從自建ES集群遷移至騰訊雲的ES集群,可以直接使用fs類型倉庫,注意需要在Elasticsearch配置文件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在創建好的倉庫中創建快照
curl -XPUT http://172.16.0.39:9200/_snapshot/my_backup/snapshot_1?wait_for_completion=true
創建快照可以指定索引,也可以指定快照中包含哪些內容,具體的api接口參數可以查閱官方文檔
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
6 . 查看快照恢復狀態
curl http://172.16.0.20:9200/_snapshot/_status
reindex
reindex是Elasticsearch提供的一個api接口,可以把數據從源ES集群導入到當前的ES集群,同樣實現了數據的遷移,限於騰訊雲ES的實現方式,當前版本不支持reindex操作。簡單介紹一下reindex接口的使用方式。
1 . 配置reindex.remote.whitelist參數
需要在目標ES集群中配置該參數,指明能夠reindex的遠程集群的白名單
2 . 調用reindex api
以下操作表示從源ES集群中查詢名為test1的索引,查詢條件為title字段為elasticsearch,將結果寫入當前集群的test2索引
POST _reindex
{
"source": { "remote": { "host": "http://172.16.0.39:9200" }, "index": "test1", "query": { "match": { "title": "elasticsearch" } } }, "dest": { "index": "test2" } }
logstash
logstash支持從一個ES集群中讀取數據然后寫入到另一個ES集群,因此可以使用logstash進行數據遷移,具體的配置文件如下:
input {
elasticsearch { hosts => ["http://172.16.0.39:9200"] index => "*" docinfo => true } } output { elasticsearch { hosts => ["http://172.16.0.20:9200"] index => "%{[@metadata][_index]}" } }
上述配置文件將源ES集群的所有索引同步到目標集群中,當然可以設置只同步指定的索引,logstash的更多功能可查閱logstash官方文檔
example:
input {
elasticsearch {
#action => "index" #動作 固定值不需要修改
hosts => "10.98.8.151:9200" #ElasticSearch主機
index => "*" #索引名稱
user => "elastic" #用戶名
password =>"xxxxx" #密碼
size => 5000
scroll => "50m"
docinfo => true
#會提取ES文檔的元信息metadata
}
}
filter {
#Only matched data are send to output.
}
output {
#stdout {
# codec => rubydebug
#}
elasticsearch {
#action => "index" #動作 固定值不需要修改
hosts => "10.88.8.5:9200" #ElasticSearch主機
index => "%{[@metadata][_index]}" #索引名稱
document_type => "%{[@metadata][_type]}"
document_id => "%{[@metadata][_id]}"
user => "elastic" #用戶名
password => "elastic" #密碼
}
}
總結
- elasticsearch-dump和logstash做跨集群數據遷移時,都要求用於執行遷移任務的機器可以同時訪問到兩個集群,不然網絡無法連通的情況下就無法實現遷移。而使用snapshot的方式沒有這個限制,因為snapshot方式是完全離線的。因此elasticsearch-dump和logstash遷移方式更適合於源ES集群和目標ES集群處於同一網絡的情況下進行遷移,而需要跨雲廠商的遷移,比如從阿里雲ES集群遷移至騰訊雲ES集群,可以選擇使用snapshot的方式進行遷移,當然也可以通過打通網絡實現集群互通,但是成本較高。
- elasticsearchdump工具和mysql數據庫用於做數據備份的工具mysqldump工具類似,都是邏輯備份,需要將數據一條一條導出后再執行導入,所以適合數據量小的場景下進行遷移;
- snapshot的方式適合數據量大的場景下進行遷移。
