1.縮小索引是指將原索引分片數縮小到一定數量。但縮小的數量必須為原數量的因子(即原分片數量是新分片倍數),例如8個分片可以縮小到4、2、1個分片。如果原分片數量為素數則只能縮小到一個分片。在縮小開始時,每個分片的復制都必須在同一節點(node)存在。
2.過程如下:
- 首先,以相同配置創建目標索引,但是主分片數量減少。
- 然后硬鏈接( hard-linking ) 各部分自原索引到目標索引。(如果系統不支持硬鏈接,那么索引的所有部分都將復制遷移到新索引,將會花費大量時間)
- 最終,將會恢復目標索引,因為目標索引剛被重新打開就會被關閉
3.為了縮小索引,索引必須被標記為只讀,所有分片都會復制到一個相同的節點並且節點健康為綠色。
這兩個條件可以通過下列請求實現:
PUT /my_source_index/_settings { "settings": { "index.routing.allocation.require._name": "shrink_node_name", "index.blocks.write": true } }
4.從原索引遷移將會花費一定時間。進度信息可以在所有分片都遷移完成前通過 _cat recoveryAPI 或者 cluster health API 使用 wait_for_no_relocating_shards 參數獲得。
5.縮小索引 my_source_index 到 新的索引 my_target_index ,可以用下列請求:
POST my_source_index/_shrink/my_target_index
6.索引縮小的必要條件
- 目標索引存在
- 原索引主分片數量比目標索引多
- 原索引主分片數量是目標索引倍數
- 索引中的所有文檔在目標索引將會被縮小到一個分片的數量不會超過
2,147,483,519,因為這是一個分片的承受的最大文檔數量。 - 執行縮小進程的節點必須要有足夠的空閑磁盤空間滿足原索引的分片能夠全部復制遷徙到該節點。
7.縮小索引API和創建索引 (create index) API 相似,並且對於目標索引接受 settings 和 aliases 參數
POST my_source_index/_shrink/my_target_index { "settings": { "index.number_of_replicas": 1, "index.number_of_shards": 1, "index.codec": "best_compression" }, "aliases": { "my_search_indices": {} } }
8.監控
縮小進度可以被 _cat recovery API 或者 cluster health API 所監控。通過設置 wait_for_status 為 yellow ,可以等到所有的主分片都已經分配。
縮小API會在目標索引被創建時馬上返回,這發生在所有分片被分配之前。這點說明這時所有分片都處於 unassigned 狀態,如果出於任何原因目標索引分片無法分配到執行縮小的節點上,那么主分片狀態會一直停留在 unassigned ,直到分片被分配。
一旦主節點分配成功,會轉化狀態會 initializing ,縮小進程就開始執行。當縮小操作結束的時候,這些分片會被激活。在這之后,Elasticsearch將試圖分配副本,甚至可能決定主分片遷至另一個節點。
例如,當沒有碎片從一個節點傳輸到另一個節點時,集群的恢復狀態可能是這樣的:
GET _cat/recovery?v
index shard time type stage source_host source_node target_host target_node repository snapshot files files_recovered files_percent files_total bytes bytes_recovered bytes_percent bytes_total translog_ops translog_ops_recovered translog_ops_percent twitter 0 13ms store done n/a n/a 127.0.0.1 node-0 n/a n/a 0 0 100% 13 0 0 100% 9928 0 0 100.0%
通過增加索引的副本數量並讓另一個節點在線承載副本,我們可以看到實時碎片恢復是什么樣子的。
GET _cat/recovery?v&h=i,s,t,ty,st,shost,thost,f,fp,b,bp i s t ty st shost thost f fp b bp twitter 0 1252ms peer done 192.168.1.1 192.168.1.2 0 100.0% 0 100.0%
最后,讓我們看看快照恢復是什么樣子的。假設我之前備份了索引,那么我可以使用快照和還原API恢復索引。
GET _cat/recovery?v&h=i,s,t,ty,st,rep,snap,f,fp,b,bp i s t ty st rep snap f fp b bp twitter 0 1978ms snapshot done twitter snap_1 79 8.0% 12086 9.0%
9.因為縮小操作會創建新的索引,所以 wait for active shards 設置依然有效。
參考資料:
http://cwiki.apachecn.org/pages/viewpage.action?pageId=4882799
