Elasticsearch 缩减索引的分片个数「Index Shrink」

2024-08-31 18:18:10 浏览数 (1)

说明

本文描述问题及解决方法同样适用于 腾讯云 Elasticsearch Service(ES)

背景

当存量的索引不再有写入,并且索引分片多、数据量小的时候,可以考虑将数据分片个数减少。

Shrink 限制

1.索引主分片数是偶数的话,shrink后的个数是偶数(小于原来索引的主分片个数)或者1; 2.索引主分片数是奇数的话,shrink后的个数是奇数(小于原来索引的主分片个数); 3.索引主分片数是质数的话,shrink后的个数只能是1;

例如:

  • 索引是 8 主分片可以收缩成 421 主分片;
  • 索引是15 主分片可以收缩成 531 主分片;
  • 索引是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 
  }
}

0 人点赞