我使用php中的mysql\u nd连接到mysql数据库,并在多个从服务器和主服务器之间进行故障切换,因此当mysql没有在服务器上运行时,一切正常,所有查询都转到其他服务器。
我需要启动mysql服务器并在服务器中运行,但会阻止所有传入的连接,以便php中的mysql\n驱动程序认为服务器已关闭。我以为一个简单的拒绝与potables将是足够的,但不是;数据包被拒绝,没有建立mysql连接,但php应用程序的行为不同,php线程等待并增加,直到达到最大值。
如果mysql服务关闭,mysql\n会立即检测到,请求会转发到其他服务器,不会减慢速度,也不会在web服务器上堆积php线程。
即使在mysql服务运行的情况下,只要我添加或插入一个带有reject的iptbles规则,请求也会被转发到其他服务器,但是php会堆积起来,就好像mysql的连接出于任何原因保持打开一样,因此,我假设拒绝带有iptables的数据包到一个端口返回的结果与linux内核在该端口中没有任何侦听不同。
有没有办法用iptables实现这种行为?
2条答案
按热度按时间wa7juj8i1#
我在回答我自己的问题;经过一番挖掘,在linux中我需要使用特定的tcp标志进行拒绝,否则php线程将保持打开状态并等待php超时。
合适的iptables线路是:
iptables-a input-s xx.xx.xx.xx-p tcp-m tcp--dport 3306-j reject--reject with tcp reset
这样,我可以正确地关闭从属服务器上的mysql服务,而使用mysql的php客户端将立即检测到服务关闭,并将查询重定向到其余从属服务器。
toiithl62#
公开暴露封闭端口的服务器将拒绝连接。在我看来,这似乎很好的模仿了iptables拒绝规则。如果你的应用程序服务器在启动时试图连接到数据库,但在数据库准备好之前,你可能也会得到这样的结果,所以这是一个有效的案例来处理,尽管你可能不得不费尽心思去重现。你应该让这个React也起作用。
然而,一个完全没有响应的服务器不能发送一个被拒绝的连接或者拒绝任何类型的数据包。iptables丢弃可以更好地模拟这种行为,它只是丢弃数据包而不需要额外的响应。连接最终在客户端超时,对客户端请求引入了一些限制。
你们可以在这里阅读更多关于拒绝和放弃的区别https://serverfault.com/questions/157375/reject-vs-drop-when-using-iptables 但是为了您的目的,可以这样说:不能响应(不存在或不起作用)的服务器是用drop建模的,并且不会响应(不监听端口或显式拒绝))由拒绝建模。