Zookeeper-Client端初始化过程.

本文详细介绍了Zookeeper的全参数构造函数,包括参数解释、实例化过程、内部原理及集群状态对readonly模式的影响。重点阐述了如何通过connectString连接server列表、参数canBeReadOnly控制读写模式,并解析了在readonly状态下client与server交互的过程。

Zookeeper全参数构造函数:

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

 

F1 Zookeeper实例整体过程



 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 3.4.10版本中zoo.cfg文件的配置方法及示例 在ZooKeeper 3.4.10版本中,`zoo.cfg`是核心配置文件,用于定义ZooKeeper服务的各项参数。以下是常见的配置项及其说明: #### 1. tickTime `tickTime` 是 ZooKeeper 的基本时间单位,以毫秒为单位。心跳机制和超时时间都基于此值计算。 ```properties tickTime=2000 ``` 此值通常设置为2000毫秒(即2秒)[^1]。 #### 2. initLimit `initLimit` 定义了集群中的 follower 节点与 leader 节点进行初始连接时的最大尝试次数(以 tickTime 为单位)。如果 follower 在指定时间内未能完成同步,则会被视为连接失败。 ```properties initLimit=10 ``` 此值表示允许的最大初始化时间为 10 * tickTime = 20 秒[^1]。 #### 3. syncLimit `syncLimit` 定义了 follower 节点与 leader 节点之间的最大同步时间限制(以 tickTime 为单位)。如果 follower 在此时间内未能完成数据同步,则会被移除。 ```properties syncLimit=5 ``` 此值表示允许的最大同步时间为 5 * tickTime = 10 秒[^1]。 #### 4. dataDir `dataDir` 指定了存储内存数据库快照的位置。同时,除非另有指定,WAL(Write-Ahead Log)日志也会存储在此目录中。 ```properties dataDir=/var/lib/zookeeper ``` 确保此路径存在且具有写权限[^1]。 #### 5. clientPort `clientPort` 是 ZooKeeper 监听客户连接的口号。 ```properties clientPort=2181 ``` 默认情况下,ZooKeeper 使用 2181 口监听客户请求[^1]。 #### 6. maxClientCnxns `maxClientCnxns` 定义了单个 IP 地址上允许的最大客户连接数。 ```properties maxClientCnxns=60 ``` 此值可以防止某个客户占用过多连接资源。 #### 7. autopurge.snapRetainCount 和 autopurge.purgeInterval 这两个参数用于自动清理旧的快照和事务日志: - `autopurge.snapRetainCount` 表示保留的最新快照和日志文件数量。 - `autopurge.purgeInterval` 表示自动清理的频率(以小时为单位)。 ```properties autopurge.snapRetainCount=3 autopurge.purgeInterval=24 ``` 上述配置表示每 24 小时清理一次,并保留最近的 3 个快照和日志文件。 #### 8. dataLogDir `dataLogDir` 指定了事务日志的存储位置。如果未指定,则事务日志将存储在 `dataDir` 中。 ```properties dataLogDir=/var/log/zookeeper ``` 建议将事务日志与快照分开存储,以提高性能。 #### 9. 集群相关配置 对于分布式集群模式,需要在 `zoo.cfg` 中添加以下内容: ```properties server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888 ``` 其中: - `zoo1`、`zoo2`、`zoo3` 是服务器主机名或 IP 地址。 - `2888` 是 follower 节点与 leader 节点通信的口。 - `3888` 是选举口,用于在 leader 选举期间通信[^1]。 #### 示例配置文件 以下是一个完整的 `zoo.cfg` 示例: ```properties tickTime=2000 initLimit=10 syncLimit=5 dataDir=/var/lib/zookeeper clientPort=2181 maxClientCnxns=60 autopurge.snapRetainCount=3 autopurge.purgeInterval=24 dataLogDir=/var/log/zookeeper # 集群配置 server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888 ``` ### 常用命令 ZooKeeper 提供了一些常用命令来管理服务和客户操作: - 启动服务:`./zkServer.sh start` - 查看状态:`./zkServer.sh status` - 启动客户:`./zkCli.sh` - 停止服务:`./zkServer.sh stop`[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值