ES的索引扩增操作指南
导言
众所周知,在Elasticsearch中,一旦索引的分片数(shard count)在创建索引时设定,就不能直接修改。这是因为ES的设计原则之一是不可变性:一旦数据被写入,就不能修改其结构。
但需求总是真切存在的,要想增加更多的存储空间或提高性能,有以下三种通融方案:扩容、重索引、拆分片。今天介绍最为快捷的方案三:索引分片扩增。
分片扩增手把手教学
需要注意的是这三种方案只有集群扩容是原索引和原业务无感知的操作,其余的方案本质都是生成新的索引而已。
索引分片拆分的完整操作步骤,已多次在实际环境中测验通过:
-
打开ES的索引分配和自动均衡(执行过一次之后,后续不需要执行)
httpPUT _cluster/settings { "persistent": { "cluster": { "routing": { "allocation.enable": "all", "allocation.cluster_concurrent_rebalance": 4, "allocation.node_concurrent_recoveries": 4, "allocation.allow_rebalance": "indices_primaries_active", "rebalance.enable": "all" } }, "indices": { "recovery": { "max_bytes_per_sec": "500m" } } } }
直接在Kibana中执行上述命令,无需修改。这里
500m
是一个速度控制。 -
停止业务写入后,使用命令关闭指定索引的写入开关,如这里是关闭test01。
httpPUT test01/_settings { "settings": { "index.blocks.write": true } }
test01
需要换成要扩增的索引的名字,不是新索引的名。 -
进行索引的分片扩增操作,如原来是10个可以改为80或者160,如原来是1个则一般可以改为20或者40。
httpPOST test01/_split/test99 { "settings":{ "index.number_of_shards":80 } }
test99
是新索引的名称,需要自己指定。 -
观察新索引是否创建
httpGET /_cat/indices/test99?v
-
打开新索引的写入开关
httpPUT test99/_settings { "settings": { "index.blocks.write": null } }
警告!这一步一定要执行,否则新索引后续无法写入。
-
观察新索引是否恢复完毕
httpGET /_cat/indices/test99?v
health
变为green
就是恢复完成了。 -
观察集群是否恢复green
httpGET /_cluster/health
恢复为
green
即可。
以上步骤中,只有2、3、5是必须执行的,第一步执行一次后无需再执行,其他操作均为观察情况。
完成之后,老的索引就可以删除了(空间会稍后释放):
http
DELETE test01
注意事项
待扩增生成的ES新索引的分片数并不能任意指定:
示例的分片扩增(Split)遵循以下两个条件约束(首先要大于原分片数):
- 第一,是旧索引分片的整数倍
- 第二,是640的因数
否则分别报错如下:
例如,10改22,会报错说the number of source shards [10] must be a factor of [22]
又比如,10改30看着挺好已取整,但又报错说the number of routing shards [640] must be a multiple of the target shards [30]
分片扩增成功的示例:也就是10改40或者80是没有问题的。
另外,如果索引没有设置为只读,会报错:
index test99 must be read-only to resize index. use "index.blocks.write=true"
只需按照步骤2设置一下就可以了,务必先通知业务侧停止写入数据!
More
喜欢我们的文章?那就关注公众号[1024点线面]吧!更多精彩,不容错过。