ZooKeeper对分布式系统的协调,使⽤共享存储解决分布式系统⾯临的问题。
其实共享存储,分布式应⽤也需要和存储进⾏⽹络通信。
大多数分布式系统中出现的问题,都源于信息的共享出了问题。如果各个节点间信息不能及时共享和同步,那么就会在协作过程中产生各种问题。ZooKeeper解决协同问题的关键,就是在于保证分布式系统信息的一致性。
- zookeeper写流程
zookeeper的基本概念
Zookeeper是一个开源的分布式协调服务,其设计目标是将那些复杂的且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一些简单的接口提供给用户使用。zookeeper是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据订阅/发布、负载均衡、命名服务、集群管理、分布式锁和分布式队列等功能
①集群角色
Zookeeper中,引入了Leader、Follower、Observer三种角色。Zookeeper集群中的所有机器通过Leader选举来选定一台被称为Leader的机器,Leader服务器为客户端提供读和写服务,除Leader外,其他机器包括Follower和Observer,Follower和Observer都能提供读服务,唯一的区别在于Observer不参与Leader选举过程,不参与写操作的过半写成功策略,因此Observer可以在不影响写性能的情况下提升集群的性能。
②会话(session)
Session指客户端会话,一个客户端连接是指客户端和服务端之间的一个TCP长连接, Zookeeper对外的服务端口默认为2181,客户端启动的时候,首先会与服务器建立一个TCP连接,从第一次连接建立开始,客户端会话的生命周期也开始了,通过这个连接,客户端能够心跳检测与服务器保持有效的会话,也能够向 Zookeeper服务器发送请求并接受响应,同时还能够通过该连接接受来自服务器的 Watch事件通知。
③数据节点(Znode)
在谈到分布式的时候,我们通常说的“节点”是指组成集群的每一台机器。然而,在 ZooKeeper中,“节点分为两类,第一类同样是指构成集群的机器,我们称之为机器节点;第二类则是指数据模型中的数据单元,我们称之为数据节点——ZNode。 ZooKeeper将所有数据存储在内存中,数据模型是一棵树(ZNode Tree),由斜杠(/)进行分割的路径,就是一个node,例如app/path.每个node上都会保存自己的数据内容,同时还会保存一系列属性信息。
④版本
刚刚我们提到,Zookeeper的每个Znode上都会存储数据,对于每个ZNode,Zookeeper都会为其维护一个叫作 Stat 的数据结构,Stat记录了这个ZNode的三个数据版本,分别是version(当前ZNode的版本)、cversion(当前ZNode子节点的版本)、aversion(当前ZNode的ACL版本)。
⑤Watcher(事件监听器)
Wathcer(事件监听器),是Zookeeper中一个很重要的特性,Zookeeper允许用户在指定节点上注册一些Watcher,并且在一些特定事件触发的时候,Zookeeper服务端会将事件通知到感兴趣的客户端,该机制是Zookeeper实现分布式协调服务的重要特性
⑥ ACL
Zookeeper采用ACL(Access Control Lists)策略来进行权限控制,其定义了如下五种权限:
·CREATE:创建子节点的权限。
·READ:获取节点数据和子节点列表的权限。
·WRITE:更新节点数据的权限。
·DELETE:删除子节点的权限。
·ADMIN:设置节点ACL的权限。
其中需要注意的是,CREATE和DELETE这两种权限都是针对子节点的权限控制
Zookeeper的搭建方式
单机模式:Zookeeper只运行在一台服务器上,适合测试环境;
cd conf
mv zoo_sample.cfg zoo.cfg
vi conf/zoo.cfg
编辑文件设置 dataDir = /path/to/zookeeper/data
启动
./zkServer.sh start
关闭
./zkServer.sh stop
查看状态
./zkServer.sh status
./zkCli.sh 本地的zookeeper服务器
./zkCli.sh -server ip:port 指定的服务器
伪集群模式:就是在一台服务器上运行多个Zookeeper实例;
- 创建 data 文件夹 和 logs 文件夹
- 在各自的zoo.cfg中写
clientPort=2181
配置快照文件存放的目录
dataDir=/zkcluster/zookeeper01/data
配置日志文件存放的目录
dataLogDir=/zkcluster/zookeeper01/data/logs
- data 下创建 myid 文件, 内容分别为 1, 2, 3 (数字可以依次累增), 这个文件的作用就是记录zk的id
- 在各自的zoo.cfg中写
server.服务器ID=服务器IP地址:服务器之间通信端口:服务器之间投票选举端口
server.1=10.211.55.4:2881:3881
server.2=10.211.55.4:2882:3882
server.3=10.211.55.4:2883:3883
Zookeeper基本使用
ZooKeeper系统模型
ZooKeeper数据模型Znode在ZooKeeper中,数据信息被保存在一个个数据节点上,这些节点被称为 ZNode。ZNode是Zookeeper中最小数据单位,在ZNode下面又可以再挂 ZNode,这样一层层下去就形成了一个层次化命名空间ZNode树,我们称为ZNode Tree,它采用了类似文件系统的层级树状结构进行管理。见下图示例:
四种节点类型
- 持久节点
- 持久顺序节点
- 临时节点
- 临时顺序节点