带Zookeeper的负载均衡器

时间:2015-06-18 01:16:38

标签: load-balancing apache-zookeeper

我正在尝试创建一个位于Zookeeper 3.4.6群集前面的Load Balancer。当我这样做时,集群运行良好,但抛出异常:

  

WARN [NIOServerCxn.Factory:0.0.0.0 / 0.0.0.0:2181:NIOServerCnxn @ 357] - 捕获了流末端异常   EndOfStreamException:无法从客户端sessionid 0x0读取其他数据,可能客户端已关闭套接字   
在org.apache.zookeeper.server.NIOServerCnxn.doIO(NIOServerCnxn.java:228)   
在org.apache.zookeeper.server.NIOServerCnxnFactory.run(NIOServerCnxnFactory.java:208)   
在java.lang.Thread.run(Thread.java:745)

这意味着Zookeeper将Load Balancer理解为客户端,并尝试与其建立连接。但负载均衡器只是ping TCP 2181并且出来了。

1 个答案:

答案 0 :(得分:5)

您是否尝试在ZooKeeper集群和客户端之间使用负载均衡器?

当您为客户端提供多个端点形式的ZooKeeper连接字符串时,如下所示:" server1,server2,server3 ...",客户端将选择其中一个服务器并切换到失败的情况。这样,如果所有客户端都具有相同的ZooKeeper端点字符串,则最终会得到一个平衡池。

如果在客户端和服务器之间放置标准负载均衡器,可能会导致这样的故障。负载均衡器不能满足ZooKeeper期望其客户端的行为方式。客户端需要维护与其具有会话的特定服务器的开放TCP连接,并发送定期心跳。

ZooKeeper客户端自身负载均衡的方式存在一定的局限性(例如,在服务器重启的情况下,连接不会重新平衡),但修复这些限制需要ZooKeeper协议识别负载均衡逻辑,可能是其中的一部分。客户实施。