
# CSS服务中为什么新创建的索引分片集中分配到单节点上？
#### 原因分析
新建索引分片被集中分配于一个node节点上可能有以下原因：
- 之前索引的分配导致某个节点上的shards数量过少，新建索引shards分配被balance.shard参数主导，为了平衡所有索引的全部分片，将shards集中分配在数量过少的节点上。
- 节点扩容，当新节点加入时新节点上的shards数量为0，此时集群会自动进行rebalance，但是rebalance需要时间，此时新建索引很容易会被balance.shard参数主导，平衡所有索引的分片，即都分配在新节点上看起来更加平衡。
涉及集群平衡性shard分配主要有两个配置参数：
cluster.routing.allocation.balance.index（默认值0.45f）
cluster.routing.allocation.balance.shard（默认值0.55f）
![](https://support.huaweicloud.com/css_faq/public_sys-resources/note_3.0-zh-cn.png)
- "balance.index"：值越大，shard分配越倾向于使得每个索引的所有分片在节点上均匀分布，如a索引共有6个shards，数据节点有3个，该配置值倾向于让a索引2、2、2平衡分配。
- "balance.shard"：值越大，shard分配越倾向于使得所有分片（所有索引的）在节点上平衡，如索引a有2个shards，索引b有4个shards，该配置倾向于所有6个分片进行2、2、2平衡分配。
- balance.index和balance.shard共同负责shards分配。
 
#### 解决方案
当新建的索引分片被全部分配在一个node节点上时，有以下2种解决办法：
1. 扩容集群需要新建索引时，按照如下所示设置对应参数。
   ```
   PUT INDEX_NAME/_settings
   {
     "index.routing.allocation.total_shards_per_node": 2
   }
   ```
   即单个索引在每个节点上最多分配2个shards。其中，具体每个节点最多分配多少个shards，请根据集群数据节点个数、索引分片（主、副）的数量自行决定。
   

2. 如果是节点上已有分片数量过少导致新索引分片被集中分配到该节点上，可以使用POST _cluster/reroute的move命令迁移分片到其他节点，rebalance模块会自动分配其他更合适的分片与其交换节点。根据具体业务使用场景可以适当调节balance.index，balance.shard配置。
 
