客户如何知道zookeeper在交易中落后?

问题描述 投票:1回答:1

谁能告诉我在下面的场景中会发生什么

  • 有五个zookeeper服务器s1,s2,s3,s4和s5
  • 当客户端连接到s3时,它是最新的
  • 客户端发出写入请求来创建/测试节点到s3它转发给领导者(s5)
  • 当s1,s2,s5成功完成该请求时,客户端获得了成功消息
  • 但由于网络问题,s3无法完成工作
  • 仍然客户端与s3连接
  • 现在客户端正在向s3发出读取/测试节点的读取请求

现在会发生什么,是s3会抛出节点未找到错误还是其他任何事情发生?

hbase apache-zookeeper
1个回答
0
投票

只有当服务器以只读模式启动并且客户端在连接时请求了只读模式支持时,客户端才能在分区后保持与仲裁之外的服务器的连接。在您的示例中,在默认模式下,客户端将从s3断开连接,s3和s4将无法形成仲裁,并将停止向客户端提供请求。

但是,在只读模式下,客户端可以从s3读取(但不能写入)数据。但是,它读取的数据可能是陈旧的。见official doc

来自zk官方文件

只读模式服务器(Java系统属性:readonlymode.enabled)

3.4.0中的新增功能:将此值设置为true可启用只读模式服务器支持(默认情况下禁用)。即使服务器可能与仲裁分区,ROM也允许请求ROM支持的客户端会话连接到服务器。在此模式下,ROM客户端仍然可以从ZK服务读取值,但无法写入值并查看其他客户端的更改。有关详细信息,请参阅ZOOKEEPER-784。

如果您的客户端使用了包含集合中所有服务器的连接字符串,则它将能够重新连接到新形成的仲裁中的一个服务器,并且能够读取上次成功写入。但另一方面,如果您只直接连接到s3,那么您将断开连接或能够读取可能过时的数据,具体取决于是否启用了只读模式。

在您的示例中,连接到s3的客户端更改了状态并获得了成功确认,它也能够读取相同的内容并且不会获得NoNodeException

© www.soinside.com 2019 - 2024. All rights reserved.