
# Elasticsearch集群出现写入拒绝"Bulk Reject"，如何解决？
#### 问题现象
集群在某些情况下会出现写入拒绝率增大"Bulk Reject"的现象，具体表现为Bulk写入时，会有类似以下报错：
```
[2019-03-01 10:09:58][ERROR]rspItemError: {
    "reason": "rejected execution of org.elasticsearch.transport.TransportService$7@5436e129 on EsThreadPoolExecutor[bulk, queue capacity = 1024, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@6bd77359[Running, pool size = 12, active threads = 12, queued tasks = 2390, completed tasks = 20018208656]]",
    "type": "es_rejected_execution_exception"
}
```
#### 问题分析
引起Bulk Reject的大多原因是shard容量过大或shard分配不均，具体可通过以下方法进行定位分析。
1. 检查分片（shard）数据量是否过大。 单个分片数据量过大，可能引起Bulk Reject，建议单个分片大小控制在20GB - 50GB左右。可在kibana控制台，通过如下命令查看索引各个分片的大小。
   ```
   GET _cat/shards?index=index_name&v
   ```
   
2. 检查分片数是否分布不均匀。 提供如下两种方式查看：
   - 方式一：在控制台查看集群的监控指标，确认节点分片相关的监控数据，具体操作可参见[查看监控指标](https://support.huaweicloud.com/usermanual-css/css_01_0155.html#section3)。
   
   - 方式二：使用命令行查看节点分片。
     例如，在客户端执行curl命令，查看集群各个节点的分片个数。
     ```
     curl "$ip:$port/_cat/shards?index={index_name}&s=node,store:desc" | awk '{print $8}' | sort | uniq -c | sort
     ```
     图1返回结果示意图   
     ![](https://support.huaweicloud.com/trouble-css/figure/zh-cn_image_0000001981501261.png "点击放大")
     返回结果中，第一列为分片个数，第二列为节点ID。图中，有的节点分片为1，有的为8，分布极不均匀。
     
    
#### 解决方案
- 如果问题是由分片数据量过大导致。 分片大小可以通过index模板下的"number_of_shards"参数进行配置。
  模板创建完成后，新建索引立即生效，已有索引不能调整。
  
 
- 如果问题是由分片数分布不均匀导致。 临时解决方案：
  1. 可以通过如下命令设置"routing.allocation.total_shards_per_node"参数，动态调整某个index解决。
     ```
     PUT <index_name>/_settings
     {
         "settings": {
             "index": {
                 "routing": {
                     "allocation": {
                         "total_shards_per_node": "3"
                     }
                 }
             }
         }
     }
     ```
     ![](https://support.huaweicloud.com/trouble-css/public_sys-resources/caution_3.0-zh-cn.png)
     "total_shards_per_node"要留有一定的buffer，防止机器故障导致分片无法分配（例如10台机器，索引有20个分片，则total_shards_per_node设置要大于2，可以取3）。
     
  
  2. 在索引创建前，可以通过索引模板设置索引在每个节点上的分片个数。
     ```
     PUT _template/<template_name>
     {
         "order": 0,
         "template": "{index_prefix}*",  //要调整的index前缀
         "settings": {
             "index": {
                 "number_of_shards": "30", //指定index分配的shard数，可以根据一个shard 30GB左右的空间来分配
                 "routing.allocation.total_shards_per_node": 3 //指定一个节点最多容纳的shards数
             }
         },
         "aliases": {}
     }
     ```
     
   
 
