全部產品
Search
文件中心

Elasticsearch:基於reindex實現低版本多type資料移轉

更新時間:Jun 30, 2024

本文介紹基於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資料移轉至阿里雲

操作流程

  1. 準備工作

    準備Elasticsearch和Logstash執行個體,確保兩者在同一專用網路下。

    • Elasticsearch執行個體:儲存索引資料。

    • 阿里雲Logstash執行個體:通過管道配置功能,遷移處理後的資料。

  2. 步驟一:轉換索引類型

    通過reindex,將Elasticsearch 5.x執行個體中的多type索引轉換為單type索引。您可以通過以下兩種方式來實現:

    • 合并type方式:將Elasticsearch 5.x執行個體中的單索引多type資料,通過reindex script方式合并成一個單索引單type資料。

    • 拆分type方式:將Elasticsearch 5.x執行個體中的單索引多type資料,按照不同的type,通過reindex拆分成多個單索引單type資料的方式。

  3. 步驟二:通過Logstash遷移資料

    使用阿里雲Logstash,將處理後的索引資料移轉至高版本Elasticsearch 6.x執行個體中。

  4. 步驟三:查看資料移轉結果

    在Kibana中查看遷移成功的索引。

準備工作

  1. 準備低版本(5.5.3)和高版本(6.7.0)的Elasticsearch執行個體,並準備待遷移的多type資料。

    建立執行個體的具體操作,請參見建立Elasticsearch執行個體

  2. 建立阿里雲Logstash執行個體,要求與Elasticsearch執行個體處於同一專用網路下。

步驟一:轉換索引類型

以下步驟介紹通過合并type方式,將單索引多type資料合併成一個單索引單type資料。

  1. 開啟Elasticsearch執行個體的自動建立索引功能。

    1. 登入Elasticsearch控制台

    2. 在左側導覽列,單擊Elasticsearch執行個體

    3. 在頂部功能表列處,選擇資源群組和地區。

    4. 在執行個體列表中,單擊低版本的執行個體ID。

    5. 在左側導覽列,單擊ES叢集配置

    6. 單擊YML檔案配置右側的修改配置

    7. YML檔案配置頁面,設定自動建立索引允許自動建立索引允許自動建立索引

      警告

      修改自動建立索引方式會觸發執行個體重啟,請確認後再操作。

    8. 勾選該操作會重啟執行個體,請確認後操作,單擊確定

  2. 登入低版本Elasticsearch執行個體的Kibana控制台。

    具體操作,請參見登入Kibana控制台

  3. 在左側導覽列,單擊Dev Tools(開發工具)。

  4. 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.typenew1索引中添加type欄位,將其設定為原始_type的值。並且new1索引的_id_type-_id組成,防止存在不同類型的文檔具有相同的ID而發生衝突的情況。

  5. 執行GET new1/_mapping命令,查看合并後的Mapping結構。

  6. 執行以下命令,查看合并後的索引資料。

    GET new1/_search
    {
       "query":{
         "match_all":{
          }
      }
    }

以下步驟介紹通過拆分type方式,將單索引多type資料,按照不同的type,通過reindex拆分成多個單索引單type資料。

  1. 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_tweettwitter_user索引。

  2. 執行以下命令,查看拆分後的索引資料。

    GET twitter_tweet/_search
    {
       "query":{
         "match_all":{
    
          }
      }
    }
    GET twitter_user/_search
    {
       "query":{
         "match_all":{
    
          }
      }
    }

步驟二:通過Logstash遷移資料

  1. 進入Elasticsearch控制台的Logstash頁面
  2. 進入目標執行個體。
    1. 在頂部功能表列處,選擇地區。
    2. Logstash執行個體中單擊目標執行個體ID。
  3. 在左側導覽列,單擊管道管理

  4. 單擊建立管道

  5. 建立管道任務頁面,輸入管道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設定檔說明

  6. 單擊下一步,配置管道參數。

    管道參數配置

    參數

    說明

    管道背景工作執行緒

    並存執行管道的Filter和Output的背景工作執行緒數量。當事件出現積壓或CPU未飽和時,請考慮增大線程數,更好地使用CPU處理能力。預設值:執行個體的CPU核心數。

    管道批大小

    單個背景工作執行緒在嘗試執行Filter和Output前,可以從Input收集的最大事件數目。較大的管道批大小可能會帶來較大的記憶體開銷。您可以設定LS_HEAP_SIZE變數,來增大JVM堆大小,從而有效使用該值。預設值:125。

    管道批延遲

    建立管道事件批時,將過小的批指派給管道背景工作執行緒之前,要等候每個事件的時間長度,單位為毫秒。預設值:50ms。

    隊列類型

    用於事件緩衝的內部排隊模型。可選值:

    • MEMORY:預設值。基於記憶體的傳統隊列。

    • PERSISTED:基於磁碟的ACKed隊列(持久隊列)。

    隊列最大位元組數

    請確保該值小於您的磁碟總容量。預設值:1024 MB。

    隊列檢查點寫入數

    啟用持久性隊列時,在強制執行檢查點之前已寫入事件的最大數目。設定為0,表示無限制。預設值:1024。

    警告

    配置完成後,需要儲存並部署才會生效。儲存並部署操作會觸發執行個體重啟,請在不影響業務的前提下,繼續執行以下步驟。

  7. 單擊儲存或者儲存並部署

    • 儲存:將管道資訊儲存在Logstash裡並觸發執行個體變更,配置不會生效。儲存後,系統會返回管道管理頁面。可在管道列表地區,單擊操作列下的立即部署,觸發執行個體重啟,使配置生效。

    • 儲存並部署:儲存並且部署後,會觸發執行個體重啟,使配置生效。

步驟三:查看資料移轉結果

  1. 登入高版本Elasticsearch執行個體的Kibana控制台。

    具體操作,請參見登入Kibana控制台

  2. 在左側導覽列,單擊Dev Tools

  3. Console中,執行以下命令,查看遷移成功的索引。

    GET _cat/indices?v