我正在使用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)
感谢。