Zookeeper 从入门到精通
更多内容,前往 IT-BLOG
一、Zookeeper概述
Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目。Zookeeper从设计模式角度来理解:是一个基于观察者模式【链接】设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在 Zookeeper上注册的那些观察者做出相应的反应。
【Zookeeper 的角色】:zk提供了什么,简单的说,zookeeper = 文件系统+通知机制
【1】领导者(leader):负责进行投票的发起和决议,更新系统状态;
【2】学习者(learner):包括跟随者(Follower)和观察者(Observer),Follower用于接受客户端请求并向客户端返回结果,在选主过程中参与投票;
【3】Observer:可以接受客户端连接,将写请求转发给Leader,但 Observer不参加投票过程,只同步 Leader的状态,Observer的目的是为了扩展系统,提高读取速度;
【4】客户端(client):请求发起方;
二、Zookeeper 特点
Zookeeper 集群概念图如下:CAP原理中 ZK保证的是 AP
三、数据结构
ZooKeeper 数据模型的结构与 Unix文件系统很类似,整体上可以看作是一棵树,每个节点称做一个ZNode。每一个ZNode默认能够存储 1MB的数据,每个 ZNode都可以通过其路径唯一标识。
四、应用场景
【提供的服务包括】:统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。
【统一命名服务】:在分布式环境下,经常需要对应用/服务进行统一命名,便于识别。例如:IP不容易记住,而域名容易记住。
五、配置参数解读
Zookeeper 安装【链接】
六、Zookeeper 内部原理
【Leader 选举机制】:【1】半数机制:集群中半数以上机器存活,集群可用。所以 Zookeeper适合装在奇数台机器上;
【2】Zookeeper虽然在配置文件中并没有指定 Master和 Slave。但是,Zookeeper工作时,是有一个节点为Leader,其他则为Follower,Leader是通过内部的选举机制临时产生的;
【3】整个选举的过程如下:
七、节点类型
Znode 有两种类型:
【1】短暂(ephemeral):客户端和服务器端断开连接后,创建的节点自动删除;
【2】持久(persistent):客户端和服务器端断开连接后,创建的节点不删除;
Znode 有四种形式的目录节点(默认是persistent ):
【1】持久化目录节点(PERSISTENT):客户端与 Zookeeper断开连接后,该节点依旧存在;
【2】持久化顺序编号目录节点(PERSISTENT_SEQUENTIAL):客户端与 Zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号;
【3】临时目录节点(EPHEMERAL):客户端与 Zookeeper断开连接后,该节点被删除。动态上下线功能靠次实现;
【4】临时顺序编号目录节点(EPHEMERAL_SEQUENTIAL):客户端与 Zookeeper断开连接后,该节点被删除,只是 Zookeeper给该节点名称进行顺序编号;
八、客户端命令行操作
【1】启动客户端: ./zkCli.sh 启动通过 help 可以查看所有的客户端命令;
九、stat结构体
【1】czxid:引起这个 znode创建的 zxid,创建节点的事务的zxid。每次修改 ZooKeeper状态都会收到一个 zxid形式的时间戳,也就是ZooKeeper事务ID。事务ID是 ZooKeeper中所有修改总的次序。每个修改都有唯一的 zxid,如果 zxid1小于 zxid2,那么 zxid1在 zxid2之前发生;
【2】ctime:znode被创建的毫秒数(从1970年开始);
【3】mZxid:znode最后更新的zxid;
【4】mtime:znode最后修改的毫秒数(从1970年开始);
【5】pZxid:znode最后更新的子节点zxid;
【6】cversion:znode子节点变化号,znode子节点修改次数;
【7】dataversion:znode数据变化号;
【8】aclVersion:znode访问控制列表的变化号;
【9】ephemeralOwner:如果是临时节点,这个是 znode拥有者的session id。如果不是临时节点则是0;
【10】dataLength:znode的数据长度;
【11】numChildren:znode子节点数量;
十、监听器流程
【监听原理详解】:【1】首先要有一个main()线程;
【2】在 main线程中创建 Zookeeper客户端,这时就会创建两个线程,一个负责网络连接通信(connet),一个负责监听(listener);
【3】通过 connect线程将注册的监听事件发送给 Zookeeper;
【4】在 Zookeeper的注册监听器列表中将注册的监听事件添加到列表中;
【5】Zookeeper监听到有数据或路径变化,就会将这个消息发送给 listener线程;
【6】listener 线程内部调用了process()方法;
【常见的监听】:【1】监听节点数据的变化:get path [watch];
【2】监听子节点增减的变化:ls path [watch];
十一、写数据流程
十二、API应用
【1】常见的创建节点、获取节点数据、查看节点是否存在、删除节点、监听事件数据修改、监听节点删除事件等常见操作。
【2】输出结果查看
【4】序列化Demo