【问题标题】:Connection to mysql server in SYN_SENT在 SYN_SENT 中连接到 mysql 服务器
【发布时间】:2012-04-20 18:15:44
【问题描述】:

过去几天我们的应用服务器和数据库服务器(Mysql)之间遇到了一个奇怪的问题:从应用服务器到数据库服务器的连接在 SYN_SENT 状态下挂起,之后我们无法与数据库服务器建立任何连接mysql 端口(3306)。当我们检查数据库服务器上的 netstat 输出时,它处于 SYN_RECV 状态。

我能弄清楚的是 mysql 服务器正在接收 SYN 请求并做出响应,但它没有到达客户端,因此服务器端的 SYN_RECV 和客户端的 SYN_SENT。我认为 SYN_SENT 状态应该会在一段时间后消失,因此与同一服务器的其他数据库连接尝试不应挂起。

有人知道我们如何解决这个问题吗?

设置详细信息:应用程序服务器:RHEL 5.4,内核版本 = 2.6.18-164.el5,x86_64 数据库服务器:Mysql 版本:5.1.49 RHEL 5.4,内核版本 = 2.6.18-164.el5, x86_64

【问题讨论】:

    标签: mysql tcp rhel rhel5


    【解决方案1】:

    修复只有 localhost 访问的服务器: 在my.cnf的绑定地址中设置127.0.0.1

    修复连接到远程 ip 的问题 (REMOTE_IP 替换为远程 ip)

    iptables -A INPUT -p tcp -d 127.0.0.1 --dport 3306 -s REMOTE_IP -j ACCEPT
    iptables -A INPUT -p udp -d 127.0.0.1 --dport 3306 -s REMOTE_IP -j ACCEPT
    iptables -A INPUT -p tcp --dport 3306 -j DROP
    iptables -A INPUT -p udp --dport 3306 -j DROP
    

    另外你需要将my.cnf中的bind ip设置为0.0.0.0。您不需要的第二条规则,我只是确定了;)(udp 部分)

    概念证明: 首先允许从remoteip到目的地的连接(-d 127.0.0.1 = localhost) -p tcp / udp = protocoll tcp 或 udp

    在此规则之后,您需要制定一个规则,将所有对 tcp / udp 连接的请求丢弃到端口 3306。

    为什么会这样: 因为 iptables 是“数字”的。总是一条又一条的规则。

    您可以使用以下命令查看您的规则:

    iptables -L INPUT -n --line-numbers
    

    显示的第一条规则是第一条规则,因此如果您说接受所有连接,然后从 ip x.x.x.x 中删除所有连接,则它不起作用。 您需要选择作为第一条规则从该​​ ip 删除所有连接,然后允许所有连接。 (这是一个不好的例子..)

    如果您未通过条目,您可以显示您的规则并在规则前面取数字并使用以下命令删除规则:

    iptables -D INPUT <<number here>>
    

    【讨论】:

    • 这是一个修复还是一个坏例子?请说清楚。并删除不相关的 UDP 规则。
    • 如果服务器已经接收到 SYN 并响应,如何解决?
    猜你喜欢
    • 2021-12-17
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 2019-05-13
    • 2017-05-28
    • 2015-05-10
    • 2017-04-20
    相关资源
    最近更新 更多