使用Zookeeper的负载均衡器

7
我正在尝试创建一个负载均衡器,用于Zookeeper 3.4.6集群的前端。当我这样做时,集群运行良好,但会抛出异常:
警告[NIOServerCxn.Factory:0.0.0.0 / 0.0.0.0:2181:NIOServerCnxn @ 357] - 捕获到流末异常 EndOfStreamException:无法从客户端会话ID 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将负载均衡器视为客户端,并尝试与其建立连接。但负载均衡器只会ping TCP 2181并退出。
1个回答

8
您想在ZooKeeper集群和客户端之间使用负载均衡器吗?
当您向客户端提供ZooKeeper连接字符串时,形式为多个端点的形式,如“server1,server2,server3…”,客户端将选择其中一台服务器并在发生故障时切换。这样,如果所有客户端都具有相同的ZooKeeper端点字符串,则最终会得到一个平衡的池。
如果在客户端和服务器之间放置标准负载均衡器,则可能会导致故障。负载均衡器无法与ZooKeeper期望其客户端行为的方式相匹配。客户端需要维护与其已创建会话的特定服务器的开放TCP连接,并发送周期性心跳包。
ZooKeeper客户端自身存在某些限制(例如,在服务器重新启动时不会重新平衡连接),但解决这些限制需要具有ZooKeeper协议感知的负载平衡逻辑,可能作为客户端实现的一部分。

使用负载均衡器的目的是能够在不需要更改客户端配置的情况下扩展Zookeeper。有没有可能呢? - Bruno dos Santos
好问题。我不确定。目前稳定的3.4.x版本不支持它,客户端需要静态连接字符串。3.5中有新的重新配置功能,但不确定何时可用。 正如我之前所说,如果在ZK客户端和服务器之间添加任何内容以添加此功能,则必须非常小心,不要干扰ZK期望客户端连接行为的方式,例如维护心跳。 - igorbel
谢谢您提供这个信息,您有从ZK页面得到的证据吗?我的意思是,ZK 3.4.x不支持在负载均衡器(集群IP和IP表,除此以外)后工作...因为我有生产环境,我想更改它,因为明显ZK客户端和服务器有自己的协议处理故障、延迟和彼此之间的“信任”,但已经以某种方式工作,尽管有很多消息丢失,但没有清晰的来自ZK服务器或客户端的错误证据... - user1995400
“丢失了很多消息”并不是“工作”。那是有问题的。 - Walter Underwood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接