【问题标题】:Load Balancer with Zookeeper带有 Zookeeper 的负载均衡器
【发布时间】:2015-09-03 11:32:24
【问题描述】:

我正在尝试在 Zookeeper 3.4.6 集群前面创建一个负载均衡器。当我这样做时,集群运行良好但抛出异常:

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 将负载均衡器理解为客户端,并尝试与它建立连接。但是负载均衡器只是 ping TCP 2181 就出来了。

【问题讨论】:

    标签: load-balancing apache-zookeeper


    【解决方案1】:

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

    当您以多个端点的形式为客户端提供 ZooKeeper 连接字符串时,例如:“server1,server2,server3...”,客户端将选择其中一个服务器并在发生故障时切换。这样,如果您的所有客户端都具有相同的 ZooKeeper 端点字符串,您将最终得到一个平衡池。

    如果您在客户端和服务器之间放置标准负载平衡器,可能会导致此类故障。负载均衡器不能很好地适应 ZooKeeper 期望其客户端的行为方式。客户端需要保持与它有会话的特定服务器的开放 TCP 连接,并定期发送心跳。

    ZooKeeper 客户端自身负载平衡的方式存在某些限制(例如,在服务器重新启动的情况下连接不会重新平衡),但修复这些限制需要 ZooKeeper 协议感知负载平衡逻辑,可能作为客户端实现的一部分.

    【讨论】:

    • 使用负载均衡器的目的是能够在不需要更改客户端配置的情况下扩展 zookeeper。有没有可能?
    • 好问题。我不知道。当前稳定的 3.4.x 版本不支持,客户端需要静态连接字符串。 3.5 中有新的重新配置功能,但不确定何时可用。正如我之前所说,如果你在 ZK 客户端和服务器之间放置任何会添加此功能的东西,你必须非常小心不要弄乱 ZK 期望客户端连接的行为方式,例如保持心跳。
    • 感谢您提供此信息,您有来自 ZK 页面的任何证据吗?我的意思是 ZK 3.4.x 不支持在 LB 后面工作(clusterIP 和 ip 表,仅此而已)......因为我有那个生产环境,我想改变它,因为显然 ZK 客户端和服务器有自己的协议处理失败, 延迟和它们之间的“信心”,但以某种方式工作,尽管丢失了很多消息,但没有明确的证据表明 ZK 服务器或客户端出现错误......
    • “丢失了很多消息”不是“工作”。那是坏的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多