说明
本文描述问题及解决方法同样适用于 腾讯云 Elasticsearch Service(ES)。
背景
当存量的索引不再有写入,并且索引分片多、数据量小的时候,可以考虑将数据分片个数减少。
Shrink 限制
1.索引主分片数是偶数的话,shrink后的个数是偶数(小于原来索引的主分片个数)或者1; 2.索引主分片数是奇数的话,shrink后的个数是奇数(小于原来索引的主分片个数); 3.索引主分片数是质数的话,shrink后的个数只能是1;
例如:
- 索引是
8
主分片可以收缩成4
、2
或1
主分片; - 索引是
15
主分片可以收缩成5
、3
或1
主分片; - 索引是
7
主分片只能收缩成1
;
收缩原理
1. 新建一个和源index相同配置的index,只是主分片个数不一样; 2 .将源index的segment创建硬连接到新index上。(windos系统不支持硬连接,所以会进行拷贝;若是segment位于不同的磁盘上,也需要拷贝); 3. 恢复成新index。
相关操作
索引在收缩分片个数前,需要将索引标记为只读,并且索引中每个分片的(主副本或副本)副本必须重定位到同一节点,并且索引的健康状态绿色。
代码语言:javascript复制PUT /source_index/_settings
{
"settings": {
"index.routing.allocation.require._name": "node_name",
"index.blocks.write": true
}
}
注,选择的数据节点要有能存储下这个索引的空间。
代码语言:javascript复制POST source_index/_shrink/shrink_index?copy_settings=true
{
"settings": {
"index.number_of_replicas": 1,
"index.number_of_shards": 1,
"index.codec": "best_compression"
},
"aliases": {
"my_search_indices": {}
}
}
注意, copy_settings
不能将其设置为 false
,该参数将在8版本中移除。
恢复源索引设置,否则副本分片不能分配。
代码语言:javascript复制POST my_source_index/_setting
{
"settings": {
"index.routing.allocation.require._name": null,
"index.blocks.write": null
}
}