长TCP连接
在Zookeeper的运行过程中,客户端会在会话超时的到期范围内向服务器发送请求(包括读写)或ping请求,俗称心跳检测,以完成会话激活,从而保持会话的有效性。
代码语言:javascript复制ExpirationTime = CurrentTime SessionTimeout;
ExpirationTime = (ExpirationTime / ExpirationInterval 1) * ExpirationInterval;
客户端和服务器之间的连接基于长TCP连接。客户端连接到服务器的默认2181端口,即会话会话。 由于建立了第一个连接,客户端开始会话的生命周期。当客户端从服务器请求ping数据包时,每个会话都可以设置超时。 创建会话 SessionID:会话ID用于唯一标识会话。每次客户端创建会话时,Zookeeper都会为其分配一个全局唯一的sessionID。Zookeeper在sessionID类SessionTrackerImpl中创建源代码。
代码语言:javascript复制echo [command] | nc [ip] [port]
超时:会话超时。当客户端构造Zookeeper实例时,它将配置的超时发送给服务器。服务器将根据自己的超时限制最终确认会话的超时。 TickTime:下一个会话的超时点。默认值为2000毫秒。它可以在zoo.cfg配置文件中进行配置,以便于服务器端对会话会话实施桶分割策略管理。 isClosing:此属性标记会话是否已关闭。当服务器检测到会话已过期时,会话将标记为“已关闭”,不会处理会话的新请求。 会话的状态
代码语言:javascript复制$ echo ruok | nc 192.168.3.38 2181
以下是一些重要状态: 正在连接:在连接中,一旦会话建立,状态在短时间内为连接状态。 已连接:已连接,连接成功后的状态。 Closed:已关闭,会话到期时发生。通常,由于网络故障,客户端重新连接失败,服务器停机或客户端主动断开连接。 会话超时管理(bucket拆分策略 会话激活) Zookeeper的引导服务器在重新运行期间定期检查会话超时。时间间隔为ExpirationInterval,单位为毫秒。默认值为tickTime。每次tickTime都会执行会话超时检查。
代码语言:javascript复制$ echo conf | nc 192.168.3.38 2181
使用zookeeper的本地API连接到上一教程中设置的三个服务集群。因为连接需要时间,所以用countDownLatch阻塞它,等待连接成功,控制台将输出连接状态!
代码语言:javascript复制<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.8</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.0</version>
</dependency>
Curator的Java 客户端搭建
Curator是Netflix的一个开源Zookeeper客户端框架,它解决了Zookeepher客户端开发的许多低级细节,包括重新连接、重复注册Watcher和NodeExistsException异常。 策展人包含几个包: 游标框架:封装了zookeeper的底层api。 Curator客户端:提供一些客户端操作,例如重试策略。 Curator拦截:封装了一些高级功能,例如:缓存事件侦听、选举、分布式锁、分布式计数器、分布式屏障等。
代码语言:javascript复制public class CuratorDemo {
public static void main(String[] args) throws Exception {
CuratorFramework curatorFramework=CuratorFrameworkFactory.
builder().connectString("192.168.3.33:2181,"
"192.168.3.35:2181,192.168.3.37:2181").
sessionTimeoutMs(4000).retryPolicy(new
ExponentialBackoffRetry(1000,3)).
namespace("").build();
curatorFramework.start();
Stat stat=new Stat();
//查询节点数据
byte[] bytes = curatorFramework.getData().storingStatIn(stat).forPath("/runoob");
System.out.println(new String(bytes));
curatorFramework.close();
}
}
长TCP连接
动物园管理员的ACL(访问控制列表)权限在生产环境中尤为重要,因此本章将对其进行介绍。 可以为节点设置ACL权限,以确保数据安全。 权限可以指定不同的权限范围和角色。 ACL命令行
代码语言:javascript复制$ getAcl /runoob/child
$ setAcl /runoob/child world:anyone:crwa
$ delete /runoob/child
GetAcl命令:获取节点的acl权限信息。 SetAcl命令:设置节点的acl权限信息。 Addauth命令:输入认证和授权信息,注册时输入明文密码,并以加密形式保存。
代码语言:javascript复制$ setAcl /runoob/child auth:user1:123456:cdrwa
$ addauth digest user1:123456
$ setAcl /runoob/child auth:user1:123456:cdrwa
$ getAcl /runoob/child
ACL组成
Zookeeper的ACL通过[scheme