Zookeeper-Client端初始化过程.

时间:2022-01-14 21:13:12

Zookeeper全参数构造函数:

  • public Zookeeper(String connectString,int sessionTimeout,Watcher watcher,long sessionId,byte[] sessionPWD,boolean canBeReadOnly)

 
Zookeeper-Client端初始化过程.
F1 Zookeeper实例整体过程


Zookeeper-Client端初始化过程.
 F2 内部原理

 

 

 

  1. 如果server端开启了”readonlymode.enabled”,即允许当前server可以readonly方式运行,
  2. 当server端尚未加入集群(处于LOOING状态),或者集群处于”危险状态”(大多数机器已经失效),那么此时server将会readonly模式,即只能接受read,不能接受write.因为此时write将无法保证在整个集群中是”一致性成功”的.
  3. 处于LOOKING状态的server,会将实例化一个ReadOnlyZookeeper实例来为当前server上的所有请求服务.
  4. 如果client允许连接readonly server(当然也可以连接R/W server),那么在实例化ZK时,传递canReadonly = true即可.在client与server建立链接时(其他请求时也会),将会把此参数交付给server,server会回馈自己的模式是不是readonly.如果client和一个”只读”模式的server建立了链接,那么client在SendThread的处理体中,开启一个pingRW的分支,通过ping的方式查找server列表中是否有server已经处于R/W模式,如果找到,那么将以异常的方式(RWServerFoundException)结束当前socket,并和R/W server建立链接.这些过程,将对Client不可见.
  5. Client通过将请求/响应队列化来确保所有交互的有序性,xid是client维护的唯一性id.server端也会做类似的全序性控制.如果发现交互中次序不符合约定,将会导致异常.
  6. connectString即为客户端可以连接的Server列表,此列表必须和server配置的列表一致。即使不一致,也能工作,比如client交付了server配置列表的一部分;不过如果client交付的列表不在server配置中或许不能工作。


源码参考:
1)    Zookeeper:面向client服务类,通过此类可以创建ZK client实例,以及向server提交请求,此类还间接的负责Watcher的注册和跟踪.
2)    ClientCnxn:client与server交互处理类,负责根据请求类型/数据信号,封装请求内容;负责根据server响应的内容/error信号,封装响应内容或者触发本地事件;根据链接状态或者server响应内容,转换client状态.
3)    ReadOnlyZookeeperServer:只读模式下,Server将会实例化一个临时的此实例,为client服务.
4)    ServerCnxn/NIOServerCnxn:server端处理请求的handle类,通过工厂模式为每个client绑定一个.注意,它只是handle类,仍然会在单线程模式下被使用,被相应的ZookeeperServer实例所调度.

  • Zookeeper-Client端初始化过程.
  • 大小: 73.9 KB
  • Zookeeper-Client端初始化过程.
  • 大小: 112 KB