自建ES集群遷移上云全攻略
業務上云過程中,勢必會涉及到企業內部自建中間件等服務的遷移上云的需求,本文介紹下自建ES服務遷移上云的一些遷移方案以及如何根據業務場景選取適合的遷移方案
遷移方案
1、OSS快照
原理:以OSS為中轉存儲介質,使用elasticsearch-repository-oss插件關聯兩個集群,源集群備份數據,目標集群恢復數據(云廠商的托管ES集群默認都安裝了oss插件),因為是快照模式,數據一致性得到保證,數據恢復速度也快
OSS遷移原理
遷移步驟拆解
源集群
- 創建OSS Bucket、設置ak、sk等信息
- 在自建集群安裝安裝elasticsearch-repository-oss插件,插件版本保證和集群版本一致
- 為需要遷移的索引創建快照,并將快照備份到已創建的倉庫中
目標集群
- 使用snapshot API創建一個與自建Elasticsearch集群相同的快照備份倉庫
- 將倉庫中已備份的快照恢復到目標集群,完成數據遷移
- 快照恢復后,查看恢復的索引和索引數據
注意事項
- 這個方案的需要對原集群安裝同步插件,插件有跨度過大版本兼容性問題,版本兼容性可以看插件說明文檔
- 原集群備份是支持增量的,速度比較快;目標集群恢復是全量恢復,不支持增量,即目標集群每次恢復是先創建索引,在恢復數據(目標集群不能出現同名索引,否則恢復任務會失敗)
- OSS備份的是主分區的數據,恢復過程也是主分區數據,副本分片的數據恢復是集群內部恢復邏輯。即:恢復任務完成時,是不包括副本數據恢復時間的。如果索引配置了寫一致性,需要等副本也恢復完成才能寫入成功
2、logstash
原理:logstash通俗的講:就是一個管道,連接兩端不同數據源。它的工作原理就是讀取源端數據(input),經過處理(filter)發送到目標端(output),可以使用它的這個特性連接兩個集群,遷移數據
logstash工作原理
遷移步驟拆解
- 安裝部署logstash
- 配置并運行logstash管道,核心配置如下
input {
elasticsearch {
hosts => ["http://<自建Elasticsearch Master節點的IP地址>:9200"]
user => "elastic"
index => "*,-.monitoring*,-.security*,-.kibana*"
password => "your_password"
docinfo => true
schedule => "*/30 * * * *" #每30分鐘同步一次
}
}
filter {
}
output {
elasticsearch {
hosts => ["http:<云資源暴露的endpoint地址>//:9200"]
user => "elastic"
password => "your_password"
index => "%{[@metadata][_index]}"
document_type => "%{[@metadata][_type]}"
document_id => "%{[@metadata][_id]}"
}
}
注意事項
logstash不能感知對索引的delete操作,即原集群中文檔數據被刪除了,目標集群不會跟著刪除,update操作是支持同步的
對實時性要求不高的場景比較適用。
使用技巧:
- 確保源端數據的ID和目標端ID一致的增量同步需求的話,可以在logstash中配置schedule定時任務。
- index字段支持正則表達式和取反匹配,可以通過這個特性控制遷移的索引。
3、elasticsearch-dump
原理:這是一個索引遷移工具,比較輕量化,基本原理也是定義input和output,從原集群查詢數據寫入到目標集群,類型于logstash,但是不支持數據過濾功能
遷移步驟拆解
elasticdump --input 原集群es地址/索引 --output 目標集群es地址/索引
# type:指定遷移的類型,支持mapping、、analyzer、data
elasticdump \
--input=http://production.es.com:9200/my_index \
--output=http://staging.es.com:9200/my_index \
--type=data
注意事項
- 適合數據量不大,遷移索引個數不多的場景,如果目標集群索引不存在,需要遷移analyzer/mapping/data等索引屬性信息和數據
- 不支持增量遷移,每次都需要停機遷移,而且同步效率不高,操作步驟繁瑣
4、跨集群在線融合
原理:通過將自建集群和云上集群這兩個本身獨立的集群融合為一個大集群,并結合ES集群自帶的分片分配、遷移特性 來完成數據的遷移工作
在線融合遷移方案
遷移步驟拆解
- 融合:首先我們需要在騰訊云ES控制臺上申請一套和自建ES集群同等規模的空集群,即上圖2中的目標集群,然后將云上的集群全量重啟后加入到自建的ES集群中,使得兩個集群融合成一個大集群。
- 遷移:融合完成后,通過對ES集群cluster/settings設置exclude屬性來進行分片的遷移,當執行了如下API后,ES集群就會自動將自建集群節點上的分片逐步驅逐到云上的節點上來。從而完成分片的搬遷和集群數據的遷移工作。
- 下線:當自建集群節點上的分片都已經全部遷移完成后,再將自建集群節點全部停機下線,這樣便完成了整個集群的遷移上云過程。我們可以通過如下API來查看自建節點上的分片數是否為0。
注意事項
- 受云廠商是否支持限制(騰訊云支持、阿里云不支持)
- 自建ES集群版本不能大于目標集群版本。主要原因是云上低版本的集群節點無法加入高版本的自建集群中。另外對于版本號,最好是兩個集群大版本號一致
- 自建ES集群的插件需要和云ES集群插件保持一致,因為融合到同一個集群,需保證插件兼容
- 自建ES集群不能開啟security認證,帶有認證會導致融合失敗
5、reindex
原理:reindex是ES提供的一個api接口,可以把數據從一個集群遷移到另外一個集群,reindex的核心做跨索引、跨集群的數據遷移,比如我們的某個索引分片過大,我們就可以創建新索引,在使用reindex API遷移數據。
遷移步驟拆解
目標集群設置whilelist白名單。
reindex.remote.whitelist: ["10.0.xx.xx:9200","10.15.xx.xx:9200","10.15.xx.xx:9200","10.15.xx.xx:9200"]
目標集群調用reindex api配置遷移任務。
POST _reindex
{
"source": {
"remote": {
"host": "http://x.x.x.1:9200"
},
"index": "test1"
},
"dest": {
"index": "test2"
}
}
注意事項
- Reindex 不會嘗試設置目標索引。 它不會復制源索引的設置。 您應該在運行 _reindex 操作之前設置目標索引,包括設置映射、分片計數、副本等。
- 源端數據量較小,且對遷移速度要求不高的場景。
6、跨集群復制CCR
原理:跨集群復制 (CCR) 功能支持將特定索引從一個 ElasticSearch 集群復制到一個或多個 ElasticSearch 集群。除了跨數據中心復制之外,CCR 還有許多其他用例,包括數據本地化,或者將數據從 Elasticsearch 集群復制到中央報告集群。
備注:6.7及以后的版本支持,CCR 是一項白金級功能(付費功能)。
遷移方案如何選?
在上面我們介紹了可用的跨集群遷移方案,還有兩種方式也是經常被提及的,方案那么多,我們怎么去選取適合自己業務場景的遷移方案,是一個值得我們去思考的問題,我整理了一個表格供大家參考:
ES集群業界常用遷移方案