通过对 Zookeeper 中丰富的数据节点进行交叉使用,配合 Watcher 事件通知机制,可以非常方便的构建一系列分布式应用中涉及的核心功能,比如 数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列 等功能
1. 数据发布/订阅
当某些数据由几个机器共享,且这些信息经常变化数据量还小的时候,这些数据就适合存储到ZK中
- 数据存储:将数据存储到 Zookeeper 上的一个数据节点。
- 数据获取:应用在启动初始化节点从 Zookeeper 数据节点读取数据,并在该节点上注册一个数据变更 Watcher
- 数据变更:当变更数据时会更新 Zookeeper 对应节点数据,Zookeeper会将数据变更通知发到各客户端,客户端接到通知后重新读取变更后的数据即可。
2. 分布式锁
基于ZooKeeper的分布式锁一般有如下两种:
- 保持独占:在zk中有一个唯一的临时节点,只有拿到节点的才可以操作数据,没拿到的线程就需要等待。缺点:可能引发羊群效应,第一个用完后瞬间有999个同时并发的线程向zk请求获得锁。
- 控制时序:主要是避免了羊群效应,临时节点已经预先存在,所有想要获得锁的线程在它下面创建临时顺序编号目录节点,编号最小的获得锁,用完删除,后面的依次排队获取。
3. 负载均衡
多个服务将各自信息(IP:port)注册到ZooKeeper中,客户端获取中间件地址集合,从集合中随机选一个服务执行任务
ZooKeeper负载均衡和Nginx负载均衡区别:
4. 命名服务
命名服务是指通过指定的名字来获取资源或者服务的地址,利用 zk 创建一个全局唯一的路径,这个路径就可以作为一个名字,指向集群中的集群,提供的服务的地址,或者一个远程的对象等等。
5. 分布式协调通知
- 对于系统调度来说,用户更改zk某个节点的value, ZooKeeper会将这些变化发送给注册了这个节点的 watcher 的所有客户端,进行通知。
- 对于执行情况汇报来说,每个工作进程都在目录下创建一个携带工作进度的临时节点,那么汇总的进程可以监控目录子节点的变化获得工作进度的实时的全局情况。
6. 集群管理
大数据体系下的大部分集群服务好像都通过ZooKeeper管理的,主要关注的是机器的动态上下线跟leader选举。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。