1,Zookeeper是什么?
ZooKeeper是一种分布式协调服务,用于管理大型主机。在分布式环境中协调和管理服务是一个复杂的过程。ZooKeeper通过其简单的架构和API解决了这个问题。 ZooKeeper允许开发人员专注于核心应用程序逻辑,而不必担心应用程序的分布式特性。ZooKeeper框架最初是在“Yahoo!”上构建的,用于以简单而稳健的方式访问他们的应用程序。后来,Apache ZooKeeper成为Hadoop,HBase和其他分布式框架使用的有组织服务的标准。
官方文档上这么解释zookeeper,它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
2,树形结构(类似unix文件系统)
每个子目录项如 NameService 都被称作为 znode(目录节点),和文件系统一样,我们能够自由的增加、删除znode,在一个znode下增加、删除子znode,唯一的不同在于znode是可以存储数据的。
有四种类型的znode:
a,PERSISTENT-持久化目录节点
客户端与zookeeper断开连接后,该节点依旧存在
b,PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点
客户端与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!等信息
在任意一台上创建节点并关联测试数据,然后在另外一台上查看是否可以看到相关节点保存的数据