1. zookeeper是什么?
2. zookeeper文件系统?
- zookeeper提供一个多节点命名空间,(节点我们叫
znode),这些节点还能设置关联数据,而文件系统中只有文件节点 可以存放数据而目录节点不行 - zookeeper为了保证高吞吐和低延迟,是在
内存中维护了这个树状目录结构,基于这个特性,zookeeper中不能存放大量数据,每个节点存储数据的上限是1M(数据存放在内存中,自然不适合存放大量数据了,比较适合存放核心关键的一些数据信息)
3. zookeeper中的znode节点,3大类
- 持久性节点(Persistent)
- 临时性节点(Ephemeral)
- 顺序性节点(Sequential)
持久:客户端与zookeeper断开连接后,节点依然存在
顺序:客户端与zookeeper断开连接后,节点自动删除
持久 + 顺序:
临时 + 顺序:
持久和临时加上顺序后,创建的节点名是会自动带上序号的,这个序号有zookeeper自动控制并生成,这个序号是按创建的节点递增的(比如有个z01节点,然后又创建了一个不带序号节点,后面又创建了一个带序号节点,那么这个后面带序号的节点名就是z03,02会跳过,这点需要注意一下)
4. zookeeper通知机制
- client端会对某个znode创建一个watcher监听事件,当znode发生变化时,zookeeper会通知该client,客户端就会根据改变处理自己的相关业务。
要实现Watch,就必须实现org.apache.zookeeper.Watcher接口,wathcer是一次性事件,如果想要持续监听,就需要持续注册监听,服务端的话可以做一个回调,这样每次watcher完,就重新再注册一个新的监听 - zookeeper的监听,该文详细介绍了
5. 应用场景
1. 统一命名服务(文件系统)
- 分布式环境下,经常需要对应用/服务进行统一命名,便于识别,比如IP不容易记住,但是域名容易记住
命名服务是指通过指定的名字来获取资源或者服务的地址,利用zk创建 一个全局的路径,即是唯一的路径,这个路径就可以作为一个名字,指向 集群中的集群,提供的服务的地址,或者一个远程的对象等等。
2. 统一配置管理(文件系统,通知机制)
- 程序分布式的部署在不同的机器上,将程序的配置信息放在zk的znode 下,当有配置发生改变时,也就是znode发生变化时,可以通过改变zk 中某个目录节点的内容,利用watcher通知给各个客户端,从而更改配置。
3. 统一集群管理
- 所谓集群管理无在乎两点:是否有机器退出和加入、选举master。
- 对于第一点,所有机器约定在父目录下创建临时目录节点,然后监听父目 录节点的子节点变化消息。一旦有机器挂掉,该机器与zookeeper的连接 断开,其所创建的临时目录节点被删除,所有其他机器都收到通知:某个兄 弟目录被删除,于是,所有人都知道:它上船了。
- 新机器加入也是类似,所有机器收到通知:新兄弟目录加入,highcount又 有了,对于第二点,我们稍微改变一下,所有机器创建临时顺序编号目录 节点,每次选取编号最小的机器作为master就好。
4. 软负载均衡
服务端从zookeeper中获取当前系统的服务节点,并根据服务节点动态修改访问的后台服务(前置的服务可以做这件事)
5. 分布式锁
- 分布式锁实现详解
- 分布式锁说到底,其实还是利用zookeeper的特性,通过创建znode,谁最先创建了znode,那么谁就获取到了这把锁。
- zookeeper一致性
6. 队列管理等
6.消息广播
1. 写数据集流程
最后
以上内容有些是参考如下作者: