使用MongoConnector时出现ReadTimeOutError,重启ElasticSearch仍未解决
我之前在用MongoConnector同步MongoDB到Elasticsearch时,也碰到过几乎一模一样的超时问题,重启ES根本不管用。先把你遇到的错误贴出来方便大家参考:
ConnectionFailed: ConnectionTimeout caused by - ReadTimeoutError(HTTPConnectionPool(host='localhost', port=9200): Read timed out. (read timeout=10))
2018-04-21 13:36:04,655 [ERROR] mongo_connector.oplog_manager:678 - OplogThread: Failed during dump collection cannot recover! Collection(Database(MongoClient(host=['localhost:27017'], documen...
下面是我亲测有效的几个排查和解决方向:
调整MongoConnector的超时参数
默认的读超时只有10秒,要是ES处理请求慢一点就会触发超时。你可以在启动MongoConnector的时候手动加大超时时间:mongo-connector --read-timeout 30 --connect-timeout 20 -m localhost:27017 -t localhost:9200 -d elastic2_doc_manager这里把读超时改成了30秒,连接超时改成20秒,你可以根据实际情况再调大。如果用配置文件的话,在
config.json里加:{ "readTimeout": 30000, "connectTimeout": 20000 }检查Elasticsearch的资源瓶颈
ES响应慢大概率是资源不够用了:- 用
curl localhost:9200/_cat/nodes?v看节点的CPU、内存使用率,要是内存占满了,赶紧调整ES的JVM堆内存(在jvm.options里改-Xms和-Xmx,一般设为机器内存的一半,比如8G机器设成4G)。 - 用
curl localhost:9200/_cat/thread_pool?v看线程池状态,要是bulk或者search线程池的队列满了,说明ES处理不过来,得优化同步的批量大小。 - 检查磁盘空间:ES磁盘使用率超过85%会进入只读模式,直接导致写入失败,用
df -h(Linux)或者资源管理器(Windows)看一下磁盘剩余空间。
- 用
优化同步的批量大小
要是首次同步大集合,默认的批量大小(一般是1000条)可能会把ES压垮。你可以启动MongoConnector时加--batch-size参数调小批量:mongo-connector --batch-size 100 -m localhost:27017 -t localhost:9200 -d elastic2_doc_manager这样每次给ES发的请求数据量小一点,ES能处理得过来,就不会超时了。
临时调整Elasticsearch的副本数
同步期间副本数太高会拖慢写入速度,你可以先把副本数改成0,同步完成后再改回去:curl -XPUT localhost:9200/_all/_settings -d '{"index.number_of_replicas": 0}' -H "Content-Type: application/json"等同步完成后,再改回原来的副本数(比如1):
curl -XPUT localhost:9200/_all/_settings -d '{"index.number_of_replicas": 1}' -H "Content-Type: application/json"检查本地网络/端口状态
虽然是localhost,但也有可能出现端口占用或者本地防火墙拦截的情况。用telnet localhost 9200测试端口是否能连通,用curl -w "%{time_total}\n" localhost:9200测一下ES的响应时间,如果响应时间超过10秒,那肯定会触发超时。
内容的提问来源于stack exchange,提问作者Josh

