本文介紹基於reindex將Elasticsearch 5.x執行個體中的多type資料,遷移到高版本Elasticsearch 6.x執行個體的單type索引中。
注意事項
2020年10月阿里雲ES進行了網路架構調整,新網路架構下的叢集跨叢集reindex需依賴Privatelink打通阿里雲ES叢集私網。您可以參見下表,依據您的業務情境選擇解決方案進行處理。
2020年10月之前建立的ES叢集屬於舊網路架構,2020年10月及之後建立的ES叢集屬於新網路架構。
使用情境 | ES叢集所處網路架構 | 解決方案 |
阿里雲ES叢集間的資料移轉 | 兩個ES叢集均建立於舊網路架構下。 | reindex方式:阿里雲ES間跨叢集reindex。 |
其中一個ES叢集建立於新網路架構下。 說明 另一個ES叢集可以建立於新網路架構,也可以建立於舊網路架構。 |
| |
將ECS上自建的ES叢集中的資料移轉至阿里雲ES叢集中 | 阿里雲ES叢集建立於舊網路架構下。 | reindex方式:通過reindex將自建ES資料移轉至阿里雲。 |
阿里雲ES叢集建立於新網路架構下。 | reindex方式:通過執行個體私網打通將自建Elasticsearch資料移轉至阿里雲。 |
操作流程
準備Elasticsearch和Logstash執行個體,確保兩者在同一專用網路下。
Elasticsearch執行個體:儲存索引資料。
阿里雲Logstash執行個體:通過管道配置功能,遷移處理後的資料。
通過reindex,將Elasticsearch 5.x執行個體中的多type索引轉換為單type索引。您可以通過以下兩種方式來實現:
合并type方式:將Elasticsearch 5.x執行個體中的單索引多type資料,通過reindex script方式合并成一個單索引單type資料。
拆分type方式:將Elasticsearch 5.x執行個體中的單索引多type資料,按照不同的type,通過reindex拆分成多個單索引單type資料的方式。
使用阿里雲Logstash,將處理後的索引資料移轉至高版本Elasticsearch 6.x執行個體中。
在Kibana中查看遷移成功的索引。
準備工作
準備低版本(5.5.3)和高版本(6.7.0)的Elasticsearch執行個體,並準備待遷移的多type資料。
建立執行個體的具體操作,請參見建立Elasticsearch執行個體。
建立阿里雲Logstash執行個體,要求與Elasticsearch執行個體處於同一專用網路下。
具體操作,請參見步驟二:建立阿里雲Logstash執行個體。
步驟一:轉換索引類型
以下步驟介紹通過合并type方式,將單索引多type資料合併成一個單索引單type資料。
開啟Elasticsearch執行個體的自動建立索引功能。
在左側導覽列,單擊Elasticsearch執行個體。
在頂部功能表列處,選擇資源群組和地區。
在執行個體列表中,單擊低版本的執行個體ID。
在左側導覽列,單擊ES叢集配置。
單擊YML檔案配置右側的修改配置。
在YML檔案配置頁面,設定自動建立索引為允許自動建立索引。
警告修改自動建立索引方式會觸發執行個體重啟,請確認後再操作。
勾選該操作會重啟執行個體,請確認後操作,單擊確定。
登入低版本Elasticsearch執行個體的Kibana控制台。
具體操作,請參見登入Kibana控制台。
在左側導覽列,單擊Dev Tools(開發工具)。
在Console中,執行以下命令,將單索引多type資料合併成單索引單type資料。
POST _reindex { "source": { "index": "twitter" }, "dest": { "index": "new1" }, "script": { "inline": """ ctx._id = ctx._type + "-" + ctx._id; ctx._source.type = ctx._type; ctx._type = "doc"; """, "lang": "painless" } }
以上樣本通過自訂type的方式,指定ctx._source.type在new1索引中添加type欄位,將其設定為原始_type的值。並且new1索引的_id由_type-_id組成,防止存在不同類型的文檔具有相同的ID而發生衝突的情況。
執行
GET new1/_mapping
命令,查看合并後的Mapping結構。執行以下命令,查看合并後的索引資料。
GET new1/_search { "query":{ "match_all":{ } } }
以下步驟介紹通過拆分type方式,將單索引多type資料,按照不同的type,通過reindex拆分成多個單索引單type資料。
在Console中,執行以下命令,將單索引多type拆分單索引單type。
POST _reindex { "source": { "index": "twitter", "type": "tweet", "size": 10000 }, "dest": { "index": "twitter_tweet" } } POST _reindex { "source": { "index": "twitter", "type": "user", "size": 10000 }, "dest": { "index": "twitter_user" } }
以上樣本將twitter索引按照不同type,分別拆分成twitter_tweet和twitter_user索引。
執行以下命令,查看拆分後的索引資料。
GET twitter_tweet/_search { "query":{ "match_all":{ } } }
GET twitter_user/_search { "query":{ "match_all":{ } } }
步驟二:通過Logstash遷移資料
- 進入Elasticsearch控制台的Logstash頁面。
- 進入目標執行個體。
- 在頂部功能表列處,選擇地區。
- 在Logstash執行個體中單擊目標執行個體ID。
在左側導覽列,單擊管道管理。
單擊建立管道。
在建立管道任務頁面,輸入管道ID並配置管道。
本文使用的管道配置如下。
input { elasticsearch { hosts => ["http://es-cn-0pp1f1y5g000h****.elasticsearch.aliyuncs.com:9200"] user => "elastic" index => "*" password => "your_password" docinfo => true } } filter { } output { elasticsearch { hosts => ["http://es-cn-mp91cbxsm000c****.elasticsearch.aliyuncs.com:9200"] user => "elastic" password => "your_password" index => "test" } }
管道配置參數詳情,請參見Logstash設定檔說明。
單擊下一步,配置管道參數。
參數
說明
管道背景工作執行緒
並存執行管道的Filter和Output的背景工作執行緒數量。當事件出現積壓或CPU未飽和時,請考慮增大線程數,更好地使用CPU處理能力。預設值:執行個體的CPU核心數。
管道批大小
單個背景工作執行緒在嘗試執行Filter和Output前,可以從Input收集的最大事件數目。較大的管道批大小可能會帶來較大的記憶體開銷。您可以設定LS_HEAP_SIZE變數,來增大JVM堆大小,從而有效使用該值。預設值:125。
管道批延遲
建立管道事件批時,將過小的批指派給管道背景工作執行緒之前,要等候每個事件的時間長度,單位為毫秒。預設值:50ms。
隊列類型
用於事件緩衝的內部排隊模型。可選值:
MEMORY:預設值。基於記憶體的傳統隊列。
PERSISTED:基於磁碟的ACKed隊列(持久隊列)。
隊列最大位元組數
請確保該值小於您的磁碟總容量。預設值:1024 MB。
隊列檢查點寫入數
啟用持久性隊列時,在強制執行檢查點之前已寫入事件的最大數目。設定為0,表示無限制。預設值:1024。
警告配置完成後,需要儲存並部署才會生效。儲存並部署操作會觸發執行個體重啟,請在不影響業務的前提下,繼續執行以下步驟。
單擊儲存或者儲存並部署。
儲存:將管道資訊儲存在Logstash裡並觸發執行個體變更,配置不會生效。儲存後,系統會返回管道管理頁面。可在管道列表地區,單擊操作列下的立即部署,觸發執行個體重啟,使配置生效。
儲存並部署:儲存並且部署後,會觸發執行個體重啟,使配置生效。
步驟三:查看資料移轉結果
登入高版本Elasticsearch執行個體的Kibana控制台。
具體操作,請參見登入Kibana控制台。
在左側導覽列,單擊Dev Tools。
在Console中,執行以下命令,查看遷移成功的索引。
GET _cat/indices?v