HAProxy + Netty:tcp-check使Netty抛出“peer by peer reset”异常

时间:2016-10-07 16:00:12

标签: tcp netty thrift haproxy

我正在使用Facebook的Nifty来运行基于TCP的Thrift应用程序。我想负载均衡请求,所以我试图将HAProxy设置为负载均衡器。负载平衡部分工作得很好。 server check部分实际上很有效。如果我取下一台服务器,HAProxy会看到它并将流量引导到另一台服务器。

不起作用tcp-check选项。它所做的每一个请求都会强制Netty抛出java.io.IOException: Connection reset by peer异常。

所以,HAProxy正在关闭连接,Netty仍在聊天。但奇怪的是,tcp-check expect binary 5550 # UP正在发挥作用!

这是我的参考配置:

defaults
    mode tcp
    timeout connect 5000ms
    timeout client 50000ms

listen thrift
    bind *:9090
    mode tcp
    balance roundrobin
    option tcpka
    retries 3
    option tcp-check
    tcp-check send-binary 80010001000000135379734f7073536572766963653a636865636b0000000000
    # tcp-check expect string UP
    tcp-check expect binary 5550 # UP
    server thrift01 127.0.0.1:4444 check inter 10s
    server thrift02 127.0.0.1:5555 check inter 10s
    timeout connect 20s
    timeout server 30s

再次,连接工作。负载均衡有效。定期SYN / ACK检查有效。但是,当我打开tcp-check时,我在服务器上收到错误。

[2016-10-06 17:47:17,586] [nifty-server-worker-5]  ERROR c.f.nifty.core.NiftyExceptionLogger - Exception triggered on channel connected to /127.0.0.1:39010
java.io.IOException: Connection reset by peer
    at sun.nio.ch.FileDispatcherImpl.read0(Native Method)
    at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39)
    at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
    at sun.nio.ch.IOUtil.read(IOUtil.java:192)
    at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380)
    at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:64)
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:108)
    at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:337)
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:89)
    at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178)
    at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)
    at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

感谢。

0 个答案:

没有答案