写ES报timeout waiting for connection from pool错误怎么解决?
问题描述
写ES报timeout waiting for connection from pool,且日志中输出多个es_rejected_execution_exception。
故障分析
从cerebro界面看到索引只有一个分片。但新建一个索引设成3个分片也是一样会报es_rejected_execution_exception。
继续定位发现记录几乎都写入到了一个分片中。至此问题清楚。是因为产生了热点。
解决方案
用户在迁移时有选择主键,也就是用它来替代 _id。计算出来的shard属同一个。
1. 建议用户不选主键,让es自动生成_id, 这样获的hash值比较分散。
2. 如果用户的应用必须用自有主键替代_id,则只能建议用性能更好的ES集群。