在使用MySql(Aurora)时,我开始注意到奇怪的查询不见了,而工作人员却永远挂在那里。经过一些调查,似乎相同的代码运行在AWS是好的,但在Azure上它只是挂起,永远!你知道吗
原因似乎是Azure简单地终止了空闲的连接(比如长时间运行的查询)。请注意,我可以在前面甚至没有负载平衡器的虚拟机上重现这一点。你知道吗
这可以用以下date && time mysql -h$SERVER -u$USER -D mydb -p$PASS -e "SELECT SLEEP(260);"
重现
注意,我用240250测试了它,在260时它就死了。 但不只是死,挂,永远!看起来Azure甚至懒得告诉套接字挂断,所以MySql客户端挂起。你知道吗
我们有从NodeJs和Python运行的查询,所以如果可能的话,我需要一个在这两种语言中都能工作的解决方案。你知道吗
这里有一个很好的例子:https://imgur.com/gallery/FCV8ZWb(注意,我必须在另一个会话中杀死mysql,它才能真正发布)
经过一番研究,我找到了一个应该始终有效的低级别解决方法,我将lib注入到任何二进制文件中,使用LD\u PRELOAD使所有套接字保持活动状态。我注入的库是libdontdie,一个旧库的分支:libkeepalive。你知道吗
构建lib之后,我运行:
date && time DD_DEBUG=1 DD_TCP_KEEPALIVE_TIME=4 DD_TCP_KEEPALIVE_INTVL=5 DD_TCP_KEEPALIVE_PROBES=6 LD_PRELOAD=/usr/lib/libdontdie.so mysql -h$SERVER -u$USER -D mydb -p$PASS -e "SELECT SLEEP(300);"
而且它工作正常(在azure中的VM和AKS中的docker映像上都进行了测试)。你知道吗
相关问题 更多 >
编程相关推荐