当使用Percona XtraDB集群检查从对等端接收数据时发生curl失败

我有一个类似的问题,这里提到的一个: xinetd'连接重置对等'

我已经用xinetd设置了percona-clustercheck(它附带了Percona的XtraDB集群包),并且在试图使用clustercheck远程执行时发生错误。 (注意它在当地很好。)

这是它看起来像LOCALLY:

[root@db1 tmp]# for i in {1..1000}; do curl http://db1.ourdomain.local:9200; sleep 2; date; done Percona XtraDB Cluster Node is synced. Fri May 3 07:30:16 EDT 2013 Percona XtraDB Cluster Node is synced. Fri May 3 07:30:18 EDT 2013 Percona XtraDB Cluster Node is synced. Fri May 3 07:30:20 EDT 2013 Percona XtraDB Cluster Node is synced. Fri May 3 07:30:22 EDT 2013 Percona XtraDB Cluster Node is synced. Fri May 3 07:30:24 EDT 2013 Percona XtraDB Cluster Node is synced. Fri May 3 07:30:26 EDT 2013 Percona XtraDB Cluster Node is synced. Fri May 3 07:30:28 EDT 2013 Percona XtraDB Cluster Node is synced. Fri May 3 07:30:30 EDT 2013 Percona XtraDB Cluster Node is synced. Fri May 3 07:30:32 EDT 2013 Percona XtraDB Cluster Node is synced. Fri May 3 07:30:34 EDT 2013 Percona XtraDB Cluster Node is synced. 

和远程:

 [root@db2 ~]# for i in {1..1000}; do curl http://db1.ourdomain.local:9200; sleep 2; date; done Percona XtraDB Cluster Node is synced. Fri May 3 07:32:23 EDT 2013 curl: (56) Failure when receiving data from the peer <----- error Fri May 3 07:32:25 EDT 2013 curl: (56) Failure when receiving data from the peer <----- error Fri May 3 07:32:27 EDT 2013 Percona XtraDB Cluster Node is synced. Fri May 3 07:32:29 EDT 2013 curl: (56) Failure when receiving data from the peer <----- error Fri May 3 07:32:31 EDT 2013 Percona XtraDB Cluster Node is synced. Fri May 3 07:32:33 EDT 2013 Percona XtraDB Cluster Node is synced. Fri May 3 07:32:35 EDT 2013 Percona XtraDB Cluster Node is synced. Fri May 3 07:32:37 EDT 2013 

在之前的文章中的解决scheme是设置“Content-Length:”,但我正在使用的脚本已经尝试设置内容长度:

 if [[ "${WSREP_STATUS}" == "4" ]] || [[ "${WSREP_STATUS}" == "2" && ${AVAILABLE_WHEN_DONOR} == 1 ]] then # Percona XtraDB Cluster node local state is 'Synced' => return HTTP 200 # Shell return-code is 0 echo -en "HTTP/1.1 200 OK\r\n" echo -en "Content-Type: text/plain\r\n" echo -en "Connection: close\r\n" echo -en "Content-Length: 40\r\n" echo -en "\r\n" echo -en "Percona XtraDB Cluster Node is synced.\r\n" exit 0 else # Percona XtraDB Cluster node local state is not 'Synced' => return HTTP 503 # Shell return-code is 1 echo -en "HTTP/1.1 503 Service Unavailable\r\n" echo -en "Content-Type: text/plain\r\n" echo -en "Connection: close\r\n" echo -en "Content-Length: 44\r\n" echo -en "\r\n" echo -en "Percona XtraDB Cluster Node is not synced.\r\n" exit 1 fi 

我试图改变内容长度为零,如所build议的。 在if和else语句中echo -en“Content-Length:0 \ r \ n” – 但对我来说似乎没有帮助。

下面是我以详细模式运行curl时看到的内容:

 Fri May 3 08:34:33 EDT 2013 * About to connect() to db1.ourdomain.local port 9200 (#0) * Trying 1.2.3.4... connected * Connected to db1..local (1.2.3.4) port 9200 (#0) > GET / HTTP/1.1 > User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2 > Host: db1.ourdomain.local:9200 > Accept: */* > < HTTP/1.1 200 OK * Closing connection #0 * Failure when receiving data from the peer curl: (56) Failure when receiving data from the peer 

如果我在本地使用curl,或者如果我远程使用telnet,它似乎一切正常。 它只是curl远程这是一个问题。 不幸的是,我们使用的硬件负载平衡器要求我执行http检查(无telnet选项)。

我怎样才能进一步解决这个问题?

谢谢! 布拉德

编辑 – 添加xinetd脚本的内容:

 cat /etc/xinetd.d/mysqlchk # default: on # description: mysqlchk service mysqlchk { # this is a config for xinetd, place it in /etc/xinetd.d/ disable = no flags = REUSE socket_type = stream port = 9200 wait = no user = nobody server = /usr/bin/clustercheck log_type = FILE /var/log/xinetdlog log_on_failure += USERID only_from = 0.0.0.0/0 # recommended to put the IPs that need # to connect exclusively (security purposes) per_source = UNLIMITED } 

问题在于,这个检查脚本不考虑HTTP协议而将HAproxy作为一个单独的stream来回答。 介绍睡眠似乎是为我的设置工作。

 then # Cluster node state is 'OK' => return HTTP 200 /bin/echo -en "HTTP/1.1 200 OK\r\n" sleep 0.1 /bin/echo -en "Content-Length: 26\r\n" sleep 0.1 /bin/echo -en "Content-Type: text/plain\r\n" sleep 0.1 /bin/echo -en "\r\n" sleep 0.1 /bin/echo -en "Cluster Node is GOOD.\r\n" sleep 0.1 /bin/echo -en "\r\n" exit 0 else # Cluster node local state is 'BAD' => return HTTP 503 /bin/echo -en "HTTP/1.1 503 Service Unavailable\r\n" sleep 0.1 /bin/echo -en "Content-Length: 0\r\n" sleep 0.1 /bin/echo -en "Content-Type: text/plain\r\n" sleep 0.1 /bin/echo -en "Connection: close\r\n" sleep 0.1 /bin/echo -en "\r\n" sleep 0.1 /bin/echo -en "Cluster Node state is BAD.\r\n" sleep 0.1 /bin/echo -en "\r\n" sleep 0.1 exit 1 

我在你的debugging会话中注意到,你的curl在收到响应的第一行后立即closures连接。 它不会收到“Content-Length”标题,因此不会使用它(这就是为什么将它设置为0并不重要)。 和我一样,它看起来像这样:

 * About to connect() to vm0010 port 9200 (#0) * Trying 1.2.3.4... connected * Connected to vm0010 (1.2.3.4) port 9200 (#0) > GET / HTTP/1.1 > User-Agent: curl/7.21.0 (x86_64-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.15 libssh2/1.2.6 > Host: vm0010:9200 > Accept: */* > < HTTP/1.1 200 OK < Content-Type: text/plain < Connection: close < Content-Length: 40 < Percona XtraDB Cluster Node is synced. * Closing connection #0 

你的xinetd是如何为这个脚本configuration的?