1,Zookeeper是什么?java
ZooKeeper是一种分布式协调服务,用于管理大型主机。在分布式环境中协调和管理服务是一个复杂的过程。ZooKeeper经过其简单的架构和API解决了这个问题。 ZooKeeper容许开发人员专一于核心应用程序逻辑,而没必要担忧应用程序的分布式特性。ZooKeeper框架最初是在“Yahoo!”上构建的,用于以简单而稳健的方式访问他们的应用程序。后来,Apache ZooKeeper成为Hadoop,HBase和其余分布式框架使用的有组织服务的标准。node
官方文档上这么解释zookeeper,它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中常常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。linux
2,树形结构(相似unix文件系统)
每一个子目录项如 NameService 都被称做为 znode(目录节点),和文件系统同样,咱们可以自由的增长、删除znode,在一个znode下增长、删除子znode,惟一的不一样在于znode是能够存储数据的。程序员
有四种类型的znode:数据库
a,PERSISTENT-持久化目录节点apache
客户端与zookeeper断开链接后,该节点依旧存在vim
b,PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点centos
客户端与zookeeper断开链接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号服务器
c,EPHEMERAL-临时目录节点架构
客户端与zookeeper断开链接后,该节点被删除
d,EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点
客户端与zookeeper断开链接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号
3, 监听通知机制
客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增长删除)时,zookeeper会通知客户端。
4,Zookeeper与客户端
Leader 服务器是整个 ZooKeeper 集群工做机制中的核心,其主要工做有如下两个:
事务请求的惟一调度和处理者,保证集群事务处理的顺序性。
集群内部各服务器的调度者。
从角色名字上能够看出,Follewer 服务器是 ZooKeeper 集群状态的跟随者,其主要工做有如下三个:
处理客户端非事务请求,转发事务请求给 Leader 服务器。
参与事务请求 Proposal 的投票。
参与 Leader 选举投票。
Observer 充当了一个观察者的角色,在工做原理上基本和 Follower 一致,惟一的区别在于,它不参与任何形投票。
5,节点操做流程
5.1,在 Client 向 Follower 发出一个写请求。
5.2, Follower 把请求转发给 Leader。
5.3,Leader 接收到之后开始发起投票并通知 Follower 进行投票。
5.4,Follower 把投票结果发送给 Leader。
5.5, Leader 将结果汇总后,若是须要写入,则开始写入,同时把写入操做通知给 Follower,而后 commit。
5.6,Follower 把请求结果返回给 Client。
6,ZooKeeper 特色
顺序一致性:从同一客户端发起的事务请求,最终将会严格地按照顺序被应用到 ZooKeeper 中去。
原子性:全部事务请求的处理结果在整个集群中全部机器上的应用状况是一致的,也就是说,要么整个集群中全部的机器都成功应用了某一个事务,要么都没有应用。
单一系统映像:不管客户端连到哪个 ZooKeeper 服务器上,其看到的服务端数据模型都是一致的。
可靠性:一旦一次更改请求被应用,更改的结果就会被持久化,直到被下一次更改覆盖。
7,分布式锁的实现
有了zookeeper的一致性文件系统,锁的问题变得容易。锁服务能够分为两类,一个是保持独占,另外一个是控制时序。
对于第一类,咱们将zookeeper上的一个znode看做是一把锁,经过createznode的方式来实现。全部客户端都去建立 /distribute_lock 节点,最终成功建立的那个客户端也即拥有了这把锁。厕全部言:来也冲冲,去也冲冲,用完删除掉本身建立的distribute_lock 节点就释放出锁。 对于第二类, /distribute_lock 已经预先存在,全部客户端在它下面建立临时顺序编号目录节点,和选master同样,编号最小的得到锁,用完删除,依次方便。
8,队列管理
两种类型的队列:
8.1, 同步队列,当一个队列的成员都聚齐时,这个队列才可用,不然一直等待全部成员到达。
8.2,队列按照 FIFO 方式进行入队和出队操做。
第一类,在约定目录下建立临时目录节点,监听节点数目是不是咱们要求的数目。
第二类,和分布式锁服务中的控制时序场景基本原理一致,入列有编号,出列按编号。
终于了解完咱们能用zookeeper作什么了,但是做为一个程序员,咱们老是想狂热了解zookeeper是如何作到这一点的,单点维护一个文件系统没有什么难度,但是若是是一个集群维护一个文件系统保持数据的一致性就很是困难了
9,Zookeeper客户端经常使用命令
create /parh data 建立一个名为/path的zNode节点,并包含数据data
delete /path 删除名为/path的zNode节点
exists /path 检查是否存在名为/path的zNode节点
setData /path data 设置名为/path的zNode的数据为data
getData /path 返回名为/path的zNode节点的数据信息
getChildren /path 返回全部/path节点的全部子节点列表
zNode节点还有不一样的类型,持久(persistent)节点和临时(ephemeral)节点。持久的zNode,如/path,只能经过调用delete来进行删除,而临时的zNode则与之相反,当建立该节点的客户端崩溃或者关闭了与ZooKeeper服务器的链接时候,这个临时zNode节点就会被删除了。其中临时节点可用于实现分布式锁。
10,集群搭建
Zookeeper 官网下载地址:
https://archive.apache.org/dist/zookeeper/
三台linux系统的ip(安装有java环境):
ip1:192.168.1.201
ip2:192.168.1.202
ip3:192.168.1.203
Zookeeper目录结构以下:
重命名zoo-sample.cfg文件名统一修改成zoo.cfg
vim zoo.cfg
initLimit=10: 对于从节点最初链接到主节点时的超时时间,单位为tick值的倍数。
syncLimit=5:对于主节点与从节点进行同步操做时的超时时间,单位为tick值的倍数。
dataDir=/tmp/zookeeper: 用于配置内存数据库保存的模糊快照的目录。即刚刚建立的data文件夹就是在此目录中。文件信息都存放在data目录下。
clientPort=2181: 表示客户端所链接的服务器所监听的端口号,默认是2181。即zookeeper对外提供访问的端口号。
server.1=192.168.1.201:2888:3888 (主机名, 心跳端口、数据端口)
server.2=192.168.1.202:2888:3888
server.3=192.168.1.203:2888:3888
在zookeeper安装目录下新建data目录并新建myid文件,而后写入对应的编号
在192.168.1.201机器上输入1,保存退出;在192.168.1.202机器上输入2,保存退出;在192.168.1.203机器上输入3,保存退出。这里的1,2,3是与server1,2,3相对应的。
查看防火墙状态,并关闭禁用防火墙
centos7下查看防火墙状态的命令:
firewall-cmd --state
关闭防火墙的命令:
systemctl stop firewalld.service
systemctl disable firewalld.service (禁止开机启动,永久关闭防火墙)
而后重启三个zookeeper服务:zkServer.sh restart,在zkServer.sh status后发现成功了。
11 ,链接到zookeeper并测试
在命令行中输入:zkCli.sh -server 192.168.1.201:2181 便可链接到其中一台ZooKeeper服务器。其余自动实现同步,客户端只须要和一台保持链接便可。链接成功后,系统会输出ZooKeeper的相关配置信息和相关环境,并在屏幕上输出Welcome to ZooKeeper!等信息
在任意一台上建立节点并关联测试数据,而后在另一台上查看是否能够看到相关节点保存的数据