Zookeeper - 如果我只传递一个连接字符串zk集群中的一些节点(整体)会发生什么?

时间:2017-01-16 18:01:10

标签: apache-zookeeper

我有一个由N个节点组成的zookeeper集群(彼此了解)。如果我只通过M< zk客户端连接字符串中N个节点的地址?群集的行为是什么?

在更具体的情况下,如果我从群集中仅传递1个zk的主机地址怎么办?然后zk客户端是否可以从群集连接到其他主机?如果这个主机出现故障怎么办?客户端是否能够连接到集合中的其他zookeeper节点?

另一个问题是,是否可以限制客户端仅使用整体中的特定节点?

1 个答案:

答案 0 :(得分:5)

  

如果我只通过M< zk客户端中N个节点的地址   连接字符串?群集的行为是什么?

ZooKeeper客户端只能连接到连接字符串中指定的M个节点。 ZooKeeper集合的后端交互(领导者选举和处理写入事务提议)将继续由集群中的所有N个节点处理。任何N个节点仍然可以成为整体领导者。如果ZooKeeper服务器收到写入事务请求,并且该服务器不是当前的领导者,那么它会将请求转发给当前的领导者。

  

在更具体的情况下,如果我只传递1个zk的主机地址怎么办?   集群?是否有可能zk客户端连接到其他   群集中的主机?如果这个主机出现故障怎么办?将是客户   能够连接到整体中的其他zookeeper节点吗?

不,客户端只能连接到连接字符串中指定的单个地址。该地址实际上成为应用程序的单点故障,因为如果服务器出现故障,客户端将没有任何其他选项来建立连接。

  

另一个问题是,是否可以限制客户端仅使用整体中的特定节点?

是的,您可以通过仅列出客户端连接字符串中的那些节点来限制客户端考虑建立连接的节点。但是,请记住,群集中的任何N个节点仍然可以成为领导者,然后所有客户端写入请求都将转发给该领导者。从这个意义上讲,客户端间接使用其他节点,但客户端没有建立与这些节点的直接套接字连接。

Apache文档中的ZooKeeper Overview页面进一步讨论了ZooKeeper集群中的客户端和服务器行为。例如,实施部分中有相关引用:

  

作为协议协议的一部分,来自客户端的所有写入请求都是   转发到称为领导者的单个服务器。剩下的   ZooKeeper服务器,称为关注者,从中接收消息提议   领导者并就消息传递达成一致。消息传递层需要   关心替换失败的领导者和同步跟随者   领导者。