ES如何修改shard数量

问题

ES中的shard数量在创建索引之后是无法修改的。当索引数据量不大时并没有什么影响,但是随着系统的运行,索引的数量会越来越多,为了横向扩展此时因为shard无法动态修改,所以索引需要重建。

你能想到最简单的办法可能是创建一个新的索引,新索引的结构与老索引结构一样,不一样的地方再shard的数量。当然这样是可行的,但是这样的效率太低,其实ES提供了更简单的方案。

split

该方案的ES版本为7.1,可能不同版本存在稍许不同。具体请参考对应版本的文档。

split过程

split的操作的整个过程大致如下:

  • 创建一个新的目标索引,其定义与源index相同,不同的点在于有更多的primary shard。

  • 将segment从源index硬链接到目标index。

  • 创建低级文件后,再次对所有文档进行哈希处理,删除属于不同shard的文档。

  • 恢复目标索引,就像它是刚刚重新打开的封闭索引一样。

split前提条件

并不是任何情况下都能进行split操作,该操作有以下的限制:

  • 目标索引不能存在。也就是说我们新创建的那个索引不能存在。

  • 源索引必须比目标索引的primary shard小。

  • 目标索引中primary shard数量必须是源索引中primary shard的数量的倍数。

  • 处理拆分过程的节点必须具有足够的可用磁盘以容纳现有索引的第二个副本。

操作实例

下面示例是对源索引order_v1进行split的过程,源索引大小和数量如下:

curl -XGET "http://127.0.0.1:9200/_cat/indices?v"

health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open order_v1 h6i4mseLQg-Nk09yfVNNBQ 1 1 6294460 0 15.1gb 7.5gb

curl -XGET "http://127.0.0.1:9200/order_v1/_count"

{
"count" : 6294460,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
}
}
  • 查看源索引的设置信息
curl -XGET "http://127.0.0.1:9200/order_v1/_settings?pretty"

{
"order_v1" : {
"settings" : {
"index" : {
"number_of_shards" : "1",
"blocks" : {
"write" : "true"
},
"provided_name" : "order_v1",
"creation_date" : "1667477917592",
"number_of_replicas" : "1",
"uuid" : "h6i4mseLQg-Nk09yfVNNBQ",
"version" : {
"created" : "7010199"
}
}
}
}
}

从上面的信息可以看出我们源索引的primary shard数量为1,replica shard数量也是为1。

  • 对源索引进行锁写操作,进行该操作后将无法对源索引进行写入操作,但是可以正常的查询。
curl -XPUT "http://127.0.0.1:9200/user/_settings" -H 'Content-Type: application/json' -d'
{
"settings":{
"index.blocks.write":false
}
}'

锁写成功之后你可以尝试向该索引写入数据,如果写入数据出错说明锁写成功了。

  • 进行split操作。我们这里将源索引(order_v1)split到目标索引(order_v3),并将primary shard数量设置为3,replica shard设置为2。
curl -XPOST "http://127.0.0.1:9200/order_v1/_split/order_v3" -H 'Content-Type: application/json' -d'
{
"settings":{
"index.number_of_shards": 3,
"index.number_of_replicas":2
}
}'

{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "order_v3"
}

该操作在我的电脑上耗时大概在30S内完成,这个操作可比重建索引再写入的方案快多了。

  • 查看新索引的信息。
curl -XGET "http://127.0.0.1:9200/order_v3/_count"

{
"count" : 6294460,
"_shards" : {
"total" : 3,
"successful" : 3,
"skipped" : 0,
"failed" : 0
}
}

curl -XGET "http://127.0.0.1:9200/order_v3/_settings"

{
"order_v3" : {
"settings" : {
"index" : {
"number_of_shards" : "3",
"routing_partition_size" : "1",
"blocks" : {
"write" : "true"
},
"provided_name" : "order_v3",
"resize" : {
"source" : {
"name" : "order_v1",
"uuid" : "h6i4mseLQg-Nk09yfVNNBQ"
}
},
"creation_date" : "1667536799729",
"number_of_replicas" : "2",
"uuid" : "fUF6v2rgQUmmRVOVdJ7BLw",
"version" : {
"created" : "7010199",
"upgraded" : "7010199"
}
}
}
}
}

从结果我们可以看到达到了我们预想中的效果。

文档

关于该操作官方文档地址如下:

https://www.elastic.co/guide/en/elasticsearch/reference/7.1/indices-split-index.html


原文始发于微信公众号(一只菜鸟程序员):ES如何修改shard数量

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/72861.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!