解决python elasticsearch的TransportError异常问题

解决python elasticsearch的TransportError异常问题

照例先扯闲话,今天的雾霾终于下去了,风很大,身体有些虚.  是时候该锻炼了. 

收到elasticsearch数据延迟的微信报警。 通过看日志得知consumer进程异常了, ps aux f看了下进程状态貌似是正常.  我们可以确定了41577 是主进程,剩下的都是由41577 spawn出去的. 让我们拿出大杀器,strace

文章写的不是很严谨,欢迎来喷,另外该文后续有更新的,请到原文地址查看更新.

http://xiaorui.cc/2016/01/06/%E8%A7%A3%E5%86%B3python-elasticsearch%E7%9A%84transporterror%E5%BC%82%E5%B8%B8%E9%97%AE%E9%A2%98/

通过strace -p pid看到主进程在等待41591主进程。 我们可以看到bulk_transfer在做futex_wait_bitset操作, 而没有去干活。  另外我这边会有一个逻辑,如果内置队列满2k,暂停工作.   为毛队列一直爆满,而消费进程又在干嘛.


下面是详细的程序日志.  TransportError又是TransportError ,上次也是这破问题,当时的解决方法是直接exit退出,然后用supervisord来控制进程. 

TransportError(503, u’ClusterBlockException  ,  这个异常一般是elasticsearch cluster集群出问题引起的。 当elasticsearch集群出问题时候,所有的客户端都会出现这样的报错。 

需要注意的是,不能简单的把这个TransportError异常try execpt过滤,最好在异常后重新创立一个新的elasticsearch连接。 


上次我只是过滤TransportError异常,但等elasticsearch正常后,还是无法正常的入库。 pdb调试了下,貌似连接的状态有问题, 在官方问了issuse也没有得到靠谱的回答。不知道是不是elasticsearch-py的一个bug.

下面也是常见的elasticsearch python api的异常情况.

class elasticsearch.ConnectionError(TransportError)
Error raised when there was an exception while talking to ES. Original exception from the underlying Connection implementation is available as .info.

class elasticsearch.ConnectionTimeout(ConnectionError)
A network timeout. Doesn’t cause a node retry by default.

class elasticsearch.SSLError(ConnectionError)
Error raised when encountering SSL errors.

class elasticsearch.NotFoundError(TransportError)
Exception representing a 404 status code.

class elasticsearch.ConflictError(TransportError)
Exception representing a 409 status code.

class elasticsearch.RequestError(TransportError)
Exception representing a 400 status code.

class elasticsearch.ConnectionError(TransportError)
Error raised when there was an exception while talking to ES. Original exception from the underlying Connection implementation is available as .info.


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

发表评论

电子邮件地址不会被公开。 必填项已用*标注