全部產品
Search
文件中心

Elasticsearch:通過Reindex API遷移資料

更新時間:Feb 28, 2026

Reindex API用於將全量資料或者滿足特定條件的資料從一個索引複製到另一個索引,這個過程可以發生在同一個叢集內,也可以跨叢集。本文向您介紹如何通過Reindex API將資料從一個叢集遷移到另一個叢集。

使用限制

  • 兩個叢集在相同地區和可用性區域下。

  • 部署管控模式:支援將v2管控模式下的叢集資料移轉到v3、v2叢集之間遷移資料、v3叢集之間遷移資料。

    叢集有兩種管控部署模式,分別為雲原生新管控(v3)、基礎管控(v2)。

    image

  • 叢集版本:支援同一個大版本之間(將低版本中的資料移轉至高版本)遷移資料(如將8.15.1的資料移轉到8.15.1),不建議跨大版本之間遷移資料(如將7.7.1中的資料移轉到8.15.1)。

準備工作

本文樣本中ES_1、ES_2兩個叢集均為8.15.1向量增強版,目標是將ES_2中的資料通過Reindex API遷移到ES_1中,遷移之前需完成以下準備工作。

準備測試資料

  • 在ES_2中建立索引並插入測試資料:

    PUT /product_info
    {
      "settings": {
        "number_of_shards": 5,
        "number_of_replicas": 1
      },
      "mappings": {
          "properties": {
            "productName": {
              "type": "text",
              "analyzer": "ik_smart"
            },
            "annual_rate":{
              "type":"keyword"
            },
            "describe": {
              "type": "text",
              "analyzer": "ik_smart"
            }
        }
      }
    }

    以上樣本建立了一個名稱為product_info的索引,包含productNameannual_ratedescribe欄位。建立成功將返回以下結果。

    {
      "acknowledged" : true,
      "shards_acknowledged" : true,
      "index" : "product_info"
    }

    插入6條測試資料:

    POST /product_info/_bulk
    {"index":{}}
    {"productName":"理財產品A","annual_rate":"3.2200%","describe":"180天定期理財,最低20000起投,收益穩定,可以自助選擇訊息推送"}
    {"index":{}}
    {"productName":"理財產品B","annual_rate":"3.1100%","describe":"90天定投產品,最低10000起投,每天收益到賬訊息推送"}
    {"index":{}}
    {"productName":"理財產品C","annual_rate":"3.3500%","describe":"270天定投產品,最低40000起投,每天收益立即到賬訊息推送"}
    {"index":{}}
    {"productName":"理財產品D","annual_rate":"3.1200%","describe":"90天定投產品,最低12000起投,每天收益到賬訊息推送"}
    {"index":{}}
    {"productName":"理財產品E","annual_rate":"3.0100%","describe":"30天定投產品推薦,最低8000起投,每天收益會訊息推送"}
    {"index":{}}
    {"productName":"理財產品F","annual_rate":"2.7500%","describe":"熱門短期產品,3天短期,無須任何手續約用,最低500起投,通過簡訊通知擷取收益訊息"}
  • 在ES_1中建立索引,用於儲存從ES_2中遷移過來的資料:

    PUT dest
    {
      "settings": {
        "number_of_shards": 5,
        "number_of_replicas": 1
      }
    }

通過NLB和PrivateLink實現叢集間私網串連

為增強叢集的安全性,同一個VPC或者兩個不同VPC下的叢集間網路隔離,需要通過NLB和PrivateLink實現叢集間私網(VPC)串連。

如下圖所示,兩個ES叢集部署在同一個VPC下,藉助使用者VPC建立終端節點服務,然後通過在ES_1中配置叢集間私網串連得到終端節點,最後將終端節點與終端節點服務相關聯,實現兩個叢集間私網串連。

終端節點服務:終端節點服務是可以被其他VPC通過建立終端節點建立私網已連線的服務,需要您手動建立相關的服務資源。
終端節點:終端節點與終端節點服務相關聯,可以建立通過VPC私網訪問外部服務的網路連接,阿里雲ES配置執行個體私網串連將自動在ES所處的網路環境下建立終端節點。
image

配置步驟請參考通過NLB和PrivateLink實現阿里雲ES叢集間私網互連,必須完成步驟一、步驟二和步驟三。

配置成功後介面如下:

image

配置Reindex API白名單

為確保跨叢集資料移轉的安全性,需將ES_2叢集的私網串連地址和通訊連接埠號加入ES_1的Reindex API白名單。

  1. 進入ES_1的安全配置頁面,點擊配置執行個體私網串連後的修改。在配置執行個體私網串連側邊欄,單擊目標終端節點ID

    image

  2. 在Virtual Private Cloud控制台的終端節點串連頁簽,單擊終端節點ID的展開符表徵圖,查看終端節點對應的網域名稱。

    重要

    需要從網域名稱中去掉可用性區域資訊後,再配置Reindex API白名單。

    如完整網域名稱為“ep-bp1****************-cn-hangzhou-i.epsrv-bp1****************.cn-hangzhou.privatelink.aliyuncs.com”,需去掉可用性區域資訊,即去掉“-cn-hangzhou-i”,得到最終網域名稱“ep-bp1bp1****************.epsrv-bp1****************.cn-hangzhou.privatelink.aliyuncs.com”。

    image

  3. 在ES_1的YML檔案中配置Reindex API白名單,白名單為終端節點的網域名稱和通訊連接埠。

    reindex:
      remote:
        whitelist: >-
          ep-bp1bp1****************.epsrv-bp1****************.cn-hangzhou.privatelink.aliyuncs.com:9200

    image

調用Reindex API遷移資料

  1. 在ES_1中登入Kibana控制台

  2. Dev Tools>Console中調用Reindex API遷移資料。

    POST _reindex
    {
      "source": {
        "remote": {
          "host": "http://ep-bp1bp1****************.epsrv-bp1****************.cn-hangzhou.privatelink.aliyuncs.com:9200",
          "username": "elastic",
          "password": "xxx-xxxx123!"
        },
        "index": "product_info",
        "query": {
          "match": {
            "productName": "理財產品"
          }
        }
      },
      "dest": {
        "index": "dest"
      }
    }

    類別

    參數

    說明

    source

    remote

    表示遠程叢集,本樣本為ES_2。

    host

    ES_2叢集的訪問地址,包含:

    • 訪問協議:在叢集基本資料頁查看當前使用的訪問協議。

      重要

      為確保安全性,請使用HTTPS協議,避免串連叢集時以文本形式傳輸password。請參考HTTPS協議文檔,啟用HTTPS協議。

    • 網域名稱:ES_2叢集的私網串連地址,與配置到Reindex白名單中的網域名稱一致。

    • 通訊連接埠:固定為9200。

    username

    叢集的預設使用者名為elastic。

    password

    使用者名稱對應的密碼。

    密碼在建立叢集時設定,如密碼已遺忘,可重設密碼

    index

    遠程叢集中的源索引。

    query

    通過查詢文法指定待遷移的資料。

    本樣本中將ES_2叢集索引中productName中帶有“理財產品”的資料移轉到ES_1叢集。

    dest

    index

    目的地組群中用於儲存遷移資料的索引。

    執行成功後,預期結果:

    {
      "took": 211,
      "timed_out": false,
      "total": 6,
      "updated": 6,
      "created": 0,
      "deleted": 0,
      "batches": 1,
      "version_conflicts": 0,
      "noops": 0,
      "retries": {
        "bulk": 0,
        "search": 0
      },
      "throttled_millis": 0,
      "requests_per_second": -1,
      "throttled_until_millis": 0,
      "failures": []
    }
  3. 調用_search API看遷移結果。

    GET dest/_search

    預期結果:

    {
      "took": 6,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": {
          "value": 6,
          "relation": "eq"
        },
        "max_score": 1,
        "hits": [
          {
            "_index": "dest",
            "_id": "n9kyqpcBCRuDZhswJCpH",
            "_score": 1,
            "_source": {
              "productName": "理財產品D",
              "annual_rate": "3.1200%",
              "describe": "90天定投產品,最低12000起投,每天收益到賬訊息推送"
            }
          },
          {
            "_index": "dest",
            "_id": "nNkyqpcBCRuDZhswJCpG",
            "_score": 1,
            "_source": {
              "productName": "理財產品A",
              "annual_rate": "3.2200%",
              "describe": "180天定期理財,最低20000起投,收益穩定,可以自助選擇訊息推送"
            }
          },
          {
            "_index": "dest",
            "_id": "ndkyqpcBCRuDZhswJCpG",
            "_score": 1,
            "_source": {
              "productName": "理財產品B",
              "annual_rate": "3.1100%",
              "describe": "90天定投產品,最低10000起投,每天收益到賬訊息推送"
            }
          },
          {
            "_index": "dest",
            "_id": "ntkyqpcBCRuDZhswJCpH",
            "_score": 1,
            "_source": {
              "productName": "理財產品C",
              "annual_rate": "3.3500%",
              "describe": "270天定投產品,最低40000起投,每天收益立即到賬訊息推送"
            }
          },
          {
            "_index": "dest",
            "_id": "oNkyqpcBCRuDZhswJCpH",
            "_score": 1,
            "_source": {
              "productName": "理財產品E",
              "annual_rate": "3.0100%",
              "describe": "30天定投產品推薦,最低8000起投,每天收益會訊息推送"
            }
          },
          {
            "_index": "dest",
            "_id": "odkyqpcBCRuDZhswJCpH",
            "_score": 1,
            "_source": {
              "productName": "理財產品F",
              "annual_rate": "2.7500%",
              "describe": "熱門短期產品,3天短期,無須任何手續約用,最低500起投,通過簡訊通知擷取收益訊息"
            }
          }
        ]
      }
    }

常見問題

Q: 在調用Reindex API時,如何根據待遷移文檔大小調整單次文檔讀取上限和逾時時間?

  • 調整單次文檔讀取上限

    系統預設單次讀取文檔的最大值為100 MB,如果索引中包含大文檔,可調適當調小該值。

    以下樣本中,通過size設定批量值為10,單位MB。

    POST _reindex
    {
      "source": {
        "remote": {
          "host": "http://otherhost:9200"
        },
        "index": "source",
        "size": 10,
        "query": {
          "match": {
            "test": "data"
          }
        }
      },
      "dest": {
        "index": "dest"
      }
    }
  • 調整逾時時間

    socket_timeout用於設定socket讀取逾時時間,預設為30秒;connect_timeout用於設定叢集連線逾時時間,預設為1秒。

    以下樣本中,設定socket讀取逾時時間為1分鐘,連線逾時時間為10秒。

    POST _reindex
    {
      "source": {
        "remote": {
          "host": "http://otherhost:9200",
          "socket_timeout": "1m",
          "connect_timeout": "10s"
        },
        "index": "source",
        "query": {
          "match": {
            "test": "data"
          }
        }
      },
      "dest": {
        "index": "dest"
      }
    }