es报错 es_rejected_execution_exception[status: 429]
描述
使用 go-mysql-elasticsearch 同步 mysql
数据到 elasticsearch
时, 由于量大出现一个错误, 如下:
time="2017-11-21T18:20:35+08:00" level=error msg="update index: prod_db_room, type: room, id: 556314, status: 429, error: {\"type\":\"es_rejected_execution_exception\",\"reason\":\"rejected execution of org.elasticsearch.transport.TransportService$4@16211f2a on EsThreadPoolExecutor[bulk, queue capacity = 50, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@6f50e0ac[Running, pool size = 8, active threads = 8, queued tasks = 50, completed tasks = 302613024]]\"}"
time="2017-11-21T18:20:35+08:00" level=error msg="update index: prod_db_vdoid, type: vdoid, id: 6926660, status: 429, error: {\"type\":\"es_rejected_execution_exception\",\"reason\":\"rejected execution of org.elasticsearch.transport.TransportService$4@50d7ff2 on EsThreadPoolExecutor[bulk, queue capacity = 50, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@6f50e0ac[Running, pool size = 8, active threads = 8, queued tasks = 50, completed tasks = 302613024]]\"}"
分析
从报错信息初步判断是并发量大, 可用的8个线程和50个长度的队列不够用了, 处理不过来
解决
参考官方文档, 注意我这是
2.4
版本的文档, 各位看官可以根据自己的 es 版本在右侧选择对应版本的文档, 在目录中依次点击Modules - Thread pool
看你使用的版本说明, 其实这块基本通用, 不同版本变化不大
在 elasticsearch.yml
文件末尾添加如下配置后重启es即可:
threadpool.bulk.type: fixed
threadpool.bulk.size: 8
threadpool.bulk.queue_size: 1000
其中:
type 是要配置的线程池类型
- bulk 批量操作, 也就是我们上面报错里提示的
- index 用于索引/删除操作
- search 计数/搜索/建议操作
- get 获取操作
- snapshot 用于快照/恢复操作
- refresh 用于刷新操作
- size 线程数量, 一般设置为 cpu 核数
- queue_size 等待线程处理的队列容量
其它
增加线程和队列容量是一种解决办法, 另外节点数量和分片的分布也是影响原因
以批量操作为例, 队列默认配置是50个容量, 如果3个节点都是8核, 那批量操作的并发最大是 50 3 8 = 1200, 如果分片都在同一台机器上, 那可能只有 400
所以, 增加节点数和均匀分布分片也很重要