1. 程式人生 > >elasticsearch關於索引切分的實現

elasticsearch關於索引切分的實現

locks guide rep https ngs IT elastics settings 保持數據

【背景信息】

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的情況就有了210 (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關於索引切分的實現