zookeeper简介
分布式系统的分布式协同服务,保证分布式系统信息的一致性。
共享方式
- 通过网络进行信息共享
- 共享存储
集群角色
leader,follower, observer
observer不参与 leader选举,不参与写操作的过半写成功策略,提高集群的性能
写请求:
- follower接收客户端写请求,请求转发给 leader
- leader 收到写请求,写请求转换成带有各种状态的事务,广播该事务(proposal)
- 所有接收到 proposal的 follower 进行投票,向 leader 返回 ACK
- leader 发送事务提交请求
会话
客户端和服务端之间的一个TCP长连接
Znode
数据节点,保存数据内容和属性
- 持久性节点(Persistent)
- 临时性节点(Ephemeral)
- 顺序性节点(Sequential)
Watcher--数据变更通知
Zookeeper使⽤Watcher机制实现分布式数据的发布/订阅功能
Curator客户端
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);
private static CuratorFramework Client = CuratorFrameworkFactory.builder() .connectString("server1:2181,server2:2181,server3:2181") .sessionTimeoutMs(50000) .connectionTimeoutMs(30000) .retryPolicy(retryPolicy) .build(); client.start();
// 创建节点
client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(path);
// 删除节点
client.delete().forPath(path);
// 获取数据
client.getData().forPath(path);
// 更新数据
client.setData().forPath(path,"新内容".getBytes());
zookeeper应用场景
数据发布/订阅
客户端向服务端注册自己关注的节点,节点数据变化,服务端向客户端推送watcher时间通知。客户端接收消息通知,主动拉取服务端的最新数据。
分布式锁
- 排他锁(写锁,独占锁)
所有客户端创建同一个临时节点,创建成功的客户端获取锁。zookeeper保证只有⼀个客户端能够创建成功。
获取锁的客户端机器发⽣宕机,或者正常执⾏完业务逻辑后,客户端就会主动将⾃⼰创建的临时节点删除,从而释放锁 - 共享锁(读锁)
创建临时顺序节点表示锁
当前 是读请求,那么就创建例如/shared_lock/host1-R-0000000001的节点;如果是写请求,那么就创建例 如/shared_lock/host2-W-0000000002的节点。
只需要关注/shared_lock节点下序号⽐⾃⼰⼩的那个节点。
流程:
- 客户端创建临时顺序节点
- 客户端调⽤getChildren接⼝获取所有已经创建的⼦节点列表,不注册 watcher
- 自己当前是最小节点,获取锁,执行业务后释放锁。
- 客户端不是最小节点,对于读请求:向⽐⾃⼰ 序号⼩的最后⼀个写请求节点注册Watcher监听。对于写请求:向⽐⾃⼰序号⼩的最后⼀个节点注 册Watcher监听。
网友评论