
01
—
ZooKeeper是什么
ZooKeeper(基于k-v形式存储)是雅虎研究院的一个研究小组为解决分布式单点问题(SPOF)而开发的分布式协调框架(感兴趣的伙伴可以了解一下其名字的由来,很是有趣)。后来,ZooKeeper成为Hadoop子项目,为大数据生态中一些组件提供统一的分布式协作服务。之后,ZooKeeper脱离Hadoop,成为Apache顶级项目,并开源至今。
ZooKeeper提供基于类似于文件系统的目录节点树方式的数据存储,但是它并不是用来专门存储数据的,它的作用主要是用来维护和监控存储的数据的状态变化。通过监控这些数据状态的变化,从而可以达到基于数据的集群管理。
02
—
为何需要ZooKeeper
在解答该问题之前,我们先了解一下,在分布式环境下会出现的问题:
在分布式环境下,需要确定一个管理节点;
如果只设置一个管理节点,容易出现单点故障;
为了解决管理节点的单点故障问题,需要配置多个管理节点;
需要多个管理节点保证信息的共享以及能够应对崩溃恢复的场景;
确定一套选举算法,能够始终保证对外提供服务。
举个栗子:

在一个团队里面,通常都会需要一个leader,一方面管理团队,另一方面如果团队外的人想要了解团队内的一切事情,那么首先就会找这个leader,原因无他,因为这个leader知道的最多,并且他所说的也最值得信赖。
突然有天,产品A需要找团队里的比如成员a商讨某项目需求,leader 发现成员a 手头目前没有其他项目,于是就将成员a安排给了产品A;
过了一会儿,产品B也来要人了,leader 发现无人可以安排,就打发产品B说人员已经都被你们产品要走了,你们产品自己去协调。
某天,leader感冒请了病假,产品这时候过来要人,发现leader不在,则无法进行新的产品需求对应;

Boss觉得这个不是事,就给这个团队配了2个leader候选人,并规定两个leader候选人同时只能一个人请假,并且两个人信息共享,这样产品那边过来要人的时候总能找到一个leader候选人对应;
又某天,两个leader候选人闹别扭,不再信息共享,那么不同的产品来要人时,每个leader都安排自己所了解到的成员,成员们傻眼了,出现了一个成员被两个产品同时要的情况,甚至有的成员没有事情可做。
这样的团队显然不是Boss愿意看到的,因此Boss决定给这个团队配了3个leader候选人,并规定三个人中,有一个leader,每次只能leader对接产品那边的需求,每个人都需要同leader信息共享,当leader请假时,选择剩下两个人了解信息对多的人来当leader并继续对外提供服务。
Boss觉得这样如此的决策很赞。

03
—
ZooKeeper的简单安装
关闭防火墙
[root@hadoop01 software]# systemctl status firewalld......[root@hadoop01 software]# systemctl stop firewalld[root@hadoop01 software]# systemctl disable firewalld安装JDK,下载解压 jdk-8u181-linux-x64.tar.gz 并配置环境变量
安装ZooKeeper,下载解压zookeeper-3.4.14.tar.gz
进入安装目录conf中
ZooKeeper配置文件复制
修改属性,例如
保存退出 并cd到bin目录下
启动
jps
当服务器启动的时候,会在bin目录下生成一个zookeeper.out的文件,记录的Zookeeper启动日志
[root@hadoop01 software]# java -versionjava version "1.8.0_181"Java(TM) SE Runtime Environment (build 1.8.0_181-b13)Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
[root@hadoop01 software]# cd zookeeper-3.4.14/conf
[root@hadoop01 conf]# cp zoo_sample.cfg zoo.cfg
dataDir=/home/software/zookeeper-3.4.14/datadataLogDir=/home/software/zookeeper-3.4.14/logserver.1=hadoop01:2888:3888
[root@hadoop01 bin]# ./zkServer.sh startZooKeeper JMX enabled by defaultUsing config: home/software/zookeeper-3.4.14/bin/../conf/zoo.cfgStarting zookeeper ... STARTED
[root@hadoop01 bin]# jps1683 QuorumPeerMain1705 Jps
[root@hadoop01 bin]# lsREADME.txt zkCli.cmd zkEnv.cmd zkServer.cmd zkTxnLogToolkit.cmd zookeeper.outzkCleanup.sh zkCli.sh zkEnv.sh zkServer.sh zkTxnLogToolkit.sh
04
—
ZooKeeper的特点
其本身是一个树状结构,称为ZNode树,其根节点为/
任意一个节点称为ZNode节点
任何一个节点都必须存储数据
只有持久节点才能挂接子节点
任意一条路径都是从根节点开始计算,并且是唯一的
ZNode树是维系在内存中的,就是为了能够快速查询
发生的每一次写操作(创建、更新、删除)都会分配一个全局且递增的事务id——Zxid
其数据可以持久化到磁盘上,目录由dataDir决定
节点状态
looking - 选举
follower - 跟随者
leader - 领导者
observer - 观察者
节点类型:
持久 临时 顺序 Persistent_Sequential Ephemeral_Sequential 非顺序 Persistent Ephemeral
05
—
ZooKeeper的客户端命令使用
进入客户端
查看根节点(Kafka已配置)
跟节点创建node1节点,并且数据为hi
查看node1节点数据
更改node1节点数据
查看node1节点的已更新信息
删除node1节点 (delete 删除/rmr 递归删除)
创建临时节点node2
创建持久顺序节点node3
创建临时顺序节点node4
[root@hadoop01 bin]# ./zkCli.sh......WatchedEvent state:SyncConnected type:None path:null[zk: localhost:2181(CONNECTED) 0]
[zk: localhost:2181(CONNECTED) 0] ls[cluster, controller_epoch, brokers, zookeeper, admin, isr_change_notification, consumers, log_dir_event_notification, latest_producer_id_block, config]
[zk: localhost:2181(CONNECTED) 1] create node1 "hi"Created /node1[zk: localhost:2181(CONNECTED) 2] ls /[cluster, controller_epoch, brokers, zookeeper, admin, isr_change_notification, consumers, log_dir_event_notification, latest_producer_id_block, config, node1]
[zk: localhost:2181(CONNECTED) 3] get /node1hicZxid = 0x194ctime = Wed Jul 08 12:05:55 EDT 2020mZxid = 0x194mtime = Wed Jul 08 12:05:55 EDT 2020pZxid = 0x194cversion = 0dataVersion = 0aclVersion = 0ephemeralOwner = 0x0dataLength = 2numChildren = 0
[zk: localhost:2181(CONNECTED) 4] set /node1 "hello"cZxid = 0x194ctime = Wed Jul 08 12:05:55 EDT 2020mZxid = 0x195mtime = Wed Jul 08 12:08:22 EDT 2020pZxid = 0x194cversion = 0dataVersion = 1aclVersion = 0ephemeralOwner = 0x0dataLength = 5numChildren = 0
[zk: localhost:2181(CONNECTED) 5] get /node1hellocZxid = 0x194ctime = Wed Jul 08 12:05:55 EDT 2020mZxid = 0x195mtime = Wed Jul 08 12:08:22 EDT 2020pZxid = 0x194cversion = 0dataVersion = 1aclVersion = 0ephemeralOwner = 0x0dataLength = 5numChildren = 0
[zk: localhost:2181(CONNECTED) 6] rmr /node1[zk: localhost:2181(CONNECTED) 7] ls /[cluster, controller_epoch, brokers, zookeeper, admin, isr_change_notification, consumers, log_dir_event_notification, latest_producer_id_block, config]
[zk: localhost:2181(CONNECTED) 3] create -e /node2 ''Created /node2
[zk: localhost:2181(CONNECTED) 4] create -s /node3 ''Created /node30000000032
[zk: localhost:2181(CONNECTED) 5] create -e -s /node5 ''Created /node50000000033
对于创建的顺序节点名称与所显示的不太一样,具体原因在后面的章节中会讲到,那么本章节内容到此就结束了,后面还有ZooKeeper集群的选举与奔溃恢复以及不同状态节点的职责分别是什么、ZooKeeper的源码分析等等,小伙伴们敬请期待!





