任何人都可以告诉我在以下情况中会发生什么
有五个zookeeper服务器s1,s2,s3,s4和s5
当客户连接到s3时,它是最新的
客户端发出写入请求以创建/测试节点到s3它转发给领导者(s5)
当s1,s2,s5成功完成该请求时,客户端获得了成功消息
但是由于网络问题,s3无法完成工作
仍然是客户端与s3连接
现在客户端正在读取/测试节点的读取请求到s3
现在会发生什么,s3会抛出节点未找到错误还是其他任何事情发生?
答案 0 :(得分:0)
只有在服务器以只读模式启动且客户端在连接时请求了只读模式支持时,客户端才能在分区后保持与仲裁之外的服务器的连接。在您的示例中,在默认模式下,客户端将从s3断开连接,s3和s4将无法形成仲裁,并将停止向客户端提供请求。
但是,在只读模式下,客户端可以从s3读取(但不能写入)数据。但是,它读取的数据可能是陈旧的。见official doc
来自zk官方文档
只读模式服务器(Java系统属性:readonlymode.enabled)
3.4.0中的新功能:将此值设置为true将启用只读模式服务器 支持(默认情况下禁用)。 ROM允许客户端会话 请求ROM支持即使在服务器连接到服务器 可以从法定人数中划分。在这种模式下ROM客户端可以 仍然从ZK服务读取值,但无法写入 值并查看其他客户的更改。有关更多信息,请参阅ZOOKEEPER-784 的信息。
如果您的客户端使用了包含集合中所有服务器的连接字符串,则它将能够重新连接到新形成的仲裁中的一个服务器,并且能够读取上次成功写入。但另一方面,如果您只直接连接到s3,那么您将断开连接或能够读取可能过时的数据,具体取决于是否启用了只读模式。
在您的示例中,连接到s3的客户端更改了状态并获得了成功确认,它也能够读取相同内容并且不会获得NoNodeException