zookeeper深入学习(观察者设计模式)
Zookeeper = 文件系统 + 通知机制
Zookeeper是一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储。但是,zookeeper并不是专门存储数据的,它主要是维护和监控系统的数据的状态的变化的。通过监控这些数据的变化,从而达到基于数据的集群管理。
Zookeeper所提供的服务主要是通过: 数据结构+原句+watcher机制这三个部分来实现的。
初步了解
zookeeper的节点初步介绍
zookeeper中的数据存储在一个叫做ReplicatedDataSource的数据库中,该数据是一个内存数据库,既然是内存数据库,数据量就不会很大
zookeeper的数据存储在内存中,由于内存空间的限制,存储的节点需要根据需求和功能进行选择,都是有ZK节点的性质和该节点所关联的数据实现的。
Zookeeper中每个节点存储的数据都是要进行原子性的操作,也就是读操作将获取与节点相关的所有数据,写操作将替换掉节点所有的数据。每一个节点都拥有自己的ACL(访问控制列表),这个列表规定了用户的权限,即限定了特定用户对目标节点可以执行的操作。
特点
zookeeper节点类型
主要有两种,一种是 临时节点,另一种是 永久节点,节点的类型在创建时即被确定,并且不能改变。
临时节点
该节点的生命周期依赖于创建它们的会话。一旦会话(Session)结束,临时节点将被自动删除,当然可以也可以手动删除。虽然每个临时的Znode都会绑定到一个客户端会话,但他们对所有的客户端还是可见的。另外,ZooKeeper的临时节点不允许拥有子节点。
永久节点
该节点的生命周期不依赖于会话,并且只有在客户端显示执行删除操作的时候,他们才能被删除。
存储结构是一个树状,每个节点被称为一个ZNode,默认能够存储1MB的数据,并且每个ZNode都是可以通过路径唯一标识
Zookeeper的常用方式
统一配置信息
把集群的中各个服务器配置存放于每一个ZNode中,节点信息变化,会通知到各个服务器
统一集群模式
主要是把各个集群的状态存放于节点中,哪台服务器宕机了,其他节点会立刻被通知到
服务器动态上下线
服务节点上下线会把信息返回给客户端,客户端将不再调用此服务
软负载均衡
把服务器的访问量存储在ZNode中,然后,客户端去访问的时候,把访问的请求分发给请求少的服务器
Zookeeper监听原理
- 首先要有一个main()线程
- 在main线程中创建zookeeper客户端,这时就会创建两个线程,一个负责网络连接通信(connect),一个负责监听(listener)
- 通过connect线程将注册的监听事件发给zookeeper
- 在zookeeper的注册监听列表中将注册的监听事件添加到列表中
- zookeeper监听到数据或者路径有变化时,会将这个消息发送给listener线程
- listener线程内部调用process()方法。
常见的监听类型
- 监听节点数据的变化
get [path] watch
- 监听节点数量的变化
ls [path] watch