elasticsearch關於索引切分的實現
【背景信息】
ES一直以來對於已經創建好的索引的分片是不可以進行分割的,簡單的說,當你創建了一個索引,並指定了number_of_shards為2,當隨著數據量的不斷增大,是無法將索引的shard擴充為4個或者8個的,當然,你可以通過重新創建索引,這個的前提是你的數據關聯性並不大,業務上允許出現多個索引存在的場景。
在ES6.1版本之後,支持了索引shard的切分,與其說是支持了切分,不如說是提供了一個接口,將原有的數據可以快速復制到新的索引下,並保持數據結構的不變,僅僅是增加了索引分片。
【使用前提】
- 使用該功能的前提是ES版本必須升級至6.1之後的版本。
- 集群狀態為green。
- 磁盤空間允許復制一份新的索引數據。
- 在使用前,索引配置中必須配置number_of_routing_shards。
- 重新分片後的索引是不存在的
- 重新分配後的shard數必須是number_of_routing_shards的因數,同時是number_of_shards的倍數,簡單說,如果指定了number_of_routing_shards為10,number_of_shards為2,則你的增加shard的情況就有了
2
→10
(split by 5)
【功能驗證】
首先,創建索引test_split_index,並指定number_of_shards為2,number_of_routing_shards為10,由於單節點集群,因此指定number_of_replicas為0,保證集群狀態為green。
curl -XPUT localhost:9200/test_split_index -H ‘Content-Type: application/json‘ -d ‘ { "settings": { "index.number_of_shards" : 2, "index.number_of_routing_shards" : 10, "index.number_of_replicas": 0 } } ‘
插入數據
curl -XPOST localhost:9200/test_split_index/split_index/_bulk?pretty -H ‘Content-Type: application/json‘ -d ‘{ "index": {}} { "user":"zhangsan", "age":"12"} { "index": {}} { "user":"lisi", "age":"25"} { "index": {}} { "user":"wangwu", "age":"21"} { "index": {}} { "user":"zhaoliu", "age":"16"} { "index": {}} { "user":"sunjiu", "age":"40"} ‘
由於在切分過程中,避免有數據寫入,因此,需要先關閉寫數據的寫入。
關閉索引
curl -XPOST localhost:9200/test_split_index/_close
防止在切分過程中有數據寫入
curl -XPUT ‘localhost:9200/test_split_index/_settings?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
"settings": {
"index.blocks.write": true
}
}
‘
打開索引
curl -XPOST localhost:9200/test_split_index/_open
進行數據的shard的切分。
curl -XPOST ‘localhost:9200/test_split_index/_split/split_index_target?pretty‘ -H ‘Content-Type: application/json‘ -d‘ { "settings": { "index.number_of_shards": 10 } } ‘
你就會發現在數據目錄下,多出了一個新的索引,通過查詢數據,和原索引下的數據是一致的。
參考鏈接:
https://www.elastic.co/guide/en/elasticsearch/reference/6.x/indices-split-index.html
elasticsearch關於索引切分的實現