azurevms似乎可以终止长时间运行的MySql查询

2024-05-20 14:10:12 发布

您现在位置:Python中文网/ 问答频道 /正文

在使用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,它才能真正发布)


Tags: awsdateservertimemysql原因passazure
1条回答
网友
1楼 · 发布于 2024-05-20 14:10:12

经过一番研究,我找到了一个应该始终有效的低级别解决方法,我将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映像上都进行了测试)。你知道吗

相关问题 更多 >