Zookeeper

作者: 极速魔法 | 来源:发表于2022-04-26 14:07 被阅读0次

zookeeper简介

分布式系统的分布式协同服务,保证分布式系统信息的一致性。

共享方式

  • 通过网络进行信息共享
  • 共享存储

集群角色

leader,follower, observer
observer不参与 leader选举,不参与写操作的过半写成功策略,提高集群的性能

写请求:

  1. follower接收客户端写请求,请求转发给 leader
  2. leader 收到写请求,写请求转换成带有各种状态的事务,广播该事务(proposal)
  3. 所有接收到 proposal的 follower 进行投票,向 leader 返回 ACK
  4. 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节点下序号⽐⾃⼰⼩的那个节点。
    流程:
  1. 客户端创建临时顺序节点
  2. 客户端调⽤getChildren接⼝获取所有已经创建的⼦节点列表,不注册 watcher
  3. 自己当前是最小节点,获取锁,执行业务后释放锁。
  4. 客户端不是最小节点,对于读请求:向⽐⾃⼰ 序号⼩的最后⼀个写请求节点注册Watcher监听。对于写请求:向⽐⾃⼰序号⼩的最后⼀个节点注 册Watcher监听。

相关文章

网友评论

      本文标题:Zookeeper

      本文链接:https://www.haomeiwen.com/subject/dwmsertx.html