在使用MySql(Aurora)时,我开始注意到奇怪的查询丢失了,而工作人员却永远挂了。经过一番调查后,似乎可以在AWS中运行相同的代码,但是在Azure上,它将永久挂起!
出现这种情况的原因似乎是Azure只是杀死了空闲的连接(例如长时间运行的查询)。请注意,我可以在甚至没有负载平衡器的VM上重现此内容。
以下date && time mysql -h$SERVER -u$USER -D mydb -p$PASS -e "SELECT SLEEP(260);"
请注意,我使用240、250和260对其进行了测试,它死了。 但是不仅死掉,永远死掉!看起来Azure甚至不费心告诉套接字消失,因此MySql客户端挂起。
我们有从NodeJs和Python运行的查询,因此我需要一个可能同时适用于这两种情况的解决方案。
看到一个很好的例子:https://imgur.com/gallery/FCV8ZWb(请注意,我必须在另一个会话中杀死mysql才能真正释放它)
答案 0 :(得分:4)
经过一些研究,我发现了一个低级变通办法,该变通办法应该一直有效,我将一个lib注入任何使用LD_PRELOAD使所有套接字KEEP-ALIVE保持二进制状态的二进制文件中。我注入的库是libdontdie,它是旧版库libkeepalive的分支。
构建库之后,我运行:
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镜像上都进行了测试。