ElasticSearch必知必會-Reindex重建索引

語言: CN / TW / HK

作者: 京東物流 康睿

1.重建索引需求背景

1.1 叢集版本升級

ES版本相容性

  1. 同一大版本範圍內升級,索引讀寫相容
  2. 不同大版本升級,索引讀寫不相容,需要重建索引

1.2 叢集遷移

叢集索引遷移

  1. 叢集遷移,索引服務不停機,資料提前遷移

1.3 索引分片數量調整

分片數量變更

  1. 原有分片數量太少,重建變多
  2. 原有分片數量太多,重建變少
  3. ES索引分片,一旦建立,原索引是不能修改分片數量的

1.4 索引文件結構變更

文件結構變更

  1. 欄位型別變更,已有索引欄位型別是不可以修改的
  2. 欄位屬性變更,歷史資料的欄位屬性是不會重新整理的
  3. 文件物件結構變更

2.常用重建索引方式

2.1 Reindex初識

索引重建說明

  1. 重建是建立新索引,原有索引保留
  2. 原有索引_source必須開啟,否則找不到原始資料
  3. 索引重建建議,嚴格業務場景,目標索引mapping結構建議先建立好,不使用es動態推測欄位型別的方式。
POST_reindex
{
  "source": {
    "index": "原始索引"
  },
  "dest": {
    "index": "新目標索引"
  }
}


2.2 Url引數解讀

URL引數

  1. refresh,目標索引是否立即重新整理
  2. waif_for_active_shards, 重建索引分片響應設定
  3. Scroll, 快照查詢時間
  4. slicing, 重建並行任務切片
  5. Max_docs , 單次最大資料量,條數
  6. requests_per_second . 單次執行的重建文件資料量

2.3 Request body引數解讀

請求引數

  1. confilicts, 索引資料衝突如何解決,直接覆蓋還是中斷
  2. source: 原索引配置資訊
  3. dest,新索引配置資訊
  4. script,指令碼處理,修改原索引資訊後再寫入新索引

2.4 Response 引數解讀

響應引數

  1. 成功數
  2. 更新數
  3. 新增數
  4. 失敗數

2.5 重建索引任務管控

任務管控必要性

  1. 重建索引是一個非同步任務,由ES後臺程序完成排程執行,叢集可能有並行其他非同步任務,有時需要中斷停止或檢視進度

任務管控API

  1. _tasks,服務端API

3.高階索引重建方式

3.1 單秒資料量閾值控制

單秒資料量控制

  1. requests_per_second
  2. 預設1000,設定-1則不限制
  3. 生產重建時,建議控制範圍500-1000左右
  4. 控制重建速度,防止叢集瞬間IO過大

3.2人工切片

資料切片應用

  1. 人為指定切片數量,並行任務
  2. 用於降低索引redinx速度
POST_reindex
{
  "source": {
    "index": "my-index-000001",
    "slice": {
      "id": 0,  // 執行下標,從0開始,即0切第一批資料做遷移,1切第二批資料做遷移
      "max": 2  // 切分分片數
    }
  },
  "dest": {
    "index": "my-new-index-000001"
  }
}


3.3 自動切片

自動切片

  1. 僅需指定自動切片大小即可,後續的排程由es完成
POST_reindex?slices=5&refresh
{
  "source": {
    "index": "my-index-000001"
  },
  "dest": {
    "index": "my-new-index-000001"
  }
}


3.4 限制reindex重建資料的範圍

3.4.1 query

限制查詢條件

  1. 基於DEL語言規則編寫,可以任意複雜,限制資料範圍
POST_reindex
{
  "source": {
    "index": "my-index-000001",
    "query": {
      "term": {
        "user.id": "kimchy"
      }
    }
  },
  "dest": {
    "index": "my-new-index-000001"
  }
}


3.4.2 max docs

限制資料條數

  1. 限制重建資料總條數,預設全部
POST_reindex
{
  "max_docs": 1,
  "source": {
    "index": "my-index-000001"
  },
  "dest": {
    "index": "my-new-index-000001"
  }
}


3.5 多索引重建

多索引重建

  1. ES也支援將多個索引資料合併到一個索引裡面去
  2. 若多個索引資料ID相同,則會相互覆蓋
POST_reindex
{
  "source": {
    "index": ["my-index-000001", "my-index-000002"]
  },
  "dest": {
    "index": "my-new-index-000002"
  }
}


3.6 限制重建索引資料欄位

限制重建索引資料欄位

  1. source filter
  2. 原有資料欄位過多,需要限制篩選部分進行重建
POST_reindex
{
  "source": {
    "index": "my-index-000001",
    "_source": ["user.id", "_doc"]
  },
  "dest": {
    "index": "my-new-index-000001"
  }
}


3.7 欄位重新命名

欄位名重新命名

  1. 原有的資料欄位名稱不合理,重新按照新欄位命名
  2. 基於指令碼機制修改
  3. ES欄位名稱原始是不允許修改的,但通過指令碼可以操作

3.8 修改原始文件資料

修改原始文件資料

  1. 基於指令碼

4.跨叢集索引重建

跨叢集操作

  1. 基於叢集通訊,類同遠端機制
  2. 需設定跨叢集白名單,配置在dist叢集

5.索引重建注意事項

5.1 資料量閾值控制

控制好索引重建速率,防止過快

5.2 索引訪問交叉影響

建議先新建好dist索引