在Elasticsearch集群中創建索引時,如果您無法評估實際數據量,可能導致設置的主分數很大,但實際業務的數據量并不多,此時您需要減少主分片數,防止因主分片數太多導致集群資源消耗過大或影響查詢寫入速率等。本文為您介紹如何通過_shrink
API快速減少主分片數。
背景信息
使用Elasticsearch需要密切關注集群分片總數及索引分片數設置。集群分片總數越多,對應分片會占用大量的文件句柄耗用大量的集群資源。同樣,索引分片數設置不合理,會對查詢和寫入均造成潛在的影響。
在創建索引時,如果您無法評估實際數據量,可能導致設置的索引主分數很大,但實際業務數據量并不多。通過reindex減少主分片數耗時太久,elastic提供了_shrink
API可快速減少索引主分片數。shrink操作不會在原索引上直接縮小分片,基本流程如下:
創建一個和原索引配置相同的新索引,新索引主分片比原索引少,所有分片需匯集在一個節點,該節點預留的磁盤空間需要大于原索引主分片上的數據大小。
從原索引到新索引創建segments硬鏈接。
對新索引執行恢復操作,類似關閉的索引執行打開操作。
reindex與_shrink
API的性能測試信息如下:
測試環境:
數據節點:數量為5個,規格為8核16 GB。
索引數據:數據量為182 GB。
分片數:原主分片數為30,目標分片數為5,副本數為0。
測試結果
方式
耗時
資源占用
reindex
3小時22分鐘
集群中有大量的寫QPS,索引所占節點資源高。
_shrink
API15分鐘
shrink節點計算資源較高。
前提條件
Elasticsearch集群狀態健康,且負載處于正常水位。
根據集群數據節點個數、集群磁盤容量等因素,合理評估索引可減少的分片數。詳細信息請參見評估Shard。
原索引必須處于green狀態。
原索引的文檔總數不能超過2,147,483,519。
Elasticsearch集群中沒有新索引的同名索引。
操作步驟
- 登錄目標阿里云Elasticsearch實例的Kibana控制臺,根據頁面提示進入Kibana主頁。登錄Kibana控制臺的具體操作,請參見登錄Kibana控制臺。說明 本文以阿里云Elasticsearch 7.10.0版本為例,其他版本操作可能略有差別,請以實際界面為準。
- 單擊右上角的Dev tools。
在Console中,執行如下命令,將原索引設置為禁止寫狀態,副本置為0,且將分片匯集到集群中的一個節點上。
以下示例以原索引shrink5為例,使用時需要替換為您的業務索引名。
PUT shrink5/_settings { "index.routing.allocation.require._name": "es-cn-zvp25yhyy000y****-1ab7****-0001", "index.blocks.write": true, "index.number_of_replicas": 0 }
參數
說明
index.routing.allocation.require._name
設置分片匯集的目標節點name。節點name可通過
GET _cat/nodes?v
命令獲取。說明在通過
_shrink
API減少主分片數之前,原索引的每個分片必須匯集到集群中的一個節點上。index.blocks.write
是否禁用對索引的寫操作,必須為true,即禁止寫操作。
說明在通過
_shrink
API減少主分片數之前,必須設置原索引為禁止寫狀態。index.number_of_replicas
索引的副本分片數。
通過
_shrink
API減少主分片數。以下示例以將原索引shrink5的主分片數從30減少到5,并生成新索引shrink_hk5e_cn。使用時請替換索引名。
POST shrink5/_shrink/shrink_hk5e_cn { "settings": { "index.blocks.write": null, "index.number_of_shards": 5, "index.number_of_replicas": 0, "index.routing.allocation.require._name": null } }
參數
說明
index.blocks.write
是否禁用對索引的寫操作。在通過
_shrink
API減少主分片數后,需要將新索引的index.blocks.write置為null,即清除從原索引復制的配置。index.number_of_shards
新索引的主分片數。
重要觸發shrink后,shrink_node節點CPU使用率和load_1m將比較高,建議在業務低峰期操作。
原索引的主分片數一定要大于新索引,新索引的主分片數必須可被原索引的主分片數整除。例如,原索引的主分片數為8,則可以減少到4、2、1;原索引的主分片數為15,則可以減少到5、3、1。如果原索引的主分片數是質數,則只能減少到1。
index.number_of_replicas
新索引的副本分片數。
index.routing.allocation.require._name
設置將分片匯集的目標節點。在通過
_shrink
API減少主分片數后,需要將新索引的index.routing.allocation.require._name置為null清除從原索引復制的配置,或者刪除原索引。查看結果。
通過
_cat recovery
API查看shrink進度,當無shrink相關的recovey,且集群狀態健康,則shrink完成。查看shrink進度
GET _cat/recovery?v&active_only
當返回結果的index列沒有等待shrink的索引時,說明無shrink相關的recovey。
查看集群健康狀態
GET _cluster/health
當返回結果中包含
"status" : "green"
時,說明集群狀態健康。
常見問題
Q:為什么要使用硬鏈接,而不使用軟鏈接?
A:通過軟鏈接創建索引,待數據寫入,將原索引刪除后,目標索引數據也會被刪除,而硬鏈接會保證索引的獨立性。