#一.zookeeper的概念
1.ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现, 是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
2 .ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
3. ZooKeeper包含一个简单的原语集, [1] 提供Java和C的接口。
4. ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper- 3.4.3\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。
5.原理:ZooKeeper是以Fast Paxos算法为基础的,Paxos 算法存在活锁的问题,即当有多个proposer交错提交时,有可能互相排斥导致没有一个proposer能提交成功,而Fast Paxos作了一些优化,通过选举产生一个leader (领导者),只有leader才能提交proposer,具体算法可见Fast Paxos。因此,要想弄懂ZooKeeper首先得对Fast Paxos有所了解。
5. zookeeper的基本运转流程:
(1)、选举Leader。
(2)、同步数据。
(3)、选举Leader过程中算法有很多,但要达到的选举标准是一致的。
(4)、Leader要具有最高的执行ID,类似root权限。
(5)、集群中大多数的机器得到响应并接受选出的Leader。
6.zookeeper在Linux中的安装:
(1)apache官网下载的地址
https://zookeeper.apache.org/
(2)进入apache官网,由于是国外的网站,里面内容都是英文的,可以大概看下Zookeeper的描述和介绍,在Getting Started的第二条有个download下载入口
(3)如图所示,在这个页面是Zookeeper的Releases发布的版本内容介绍,如果不关注的话,可以直接点击Download下载地址
(4)apache提供了很多的下载镜像服务器,一般我们就选择最上面的官方推荐的镜像服务器地址下载即可。如果第一个下载不了或者下载速度很慢,则可以尝试下面其它的镜像服务器地址下载
(5)点击进入之后,会显示Zookeeper文件的下载目录,如图所示,显示了多个版本可以下载,alpha版本是内测,功能不是很完全的,能够满足一定的需要,这里我们不建议选择,beta是公测版本,基本上可以满足要求,可以适当的根据需要选择,如果是对稳定性要求非常高的话,最好是选择正式发布的版本
(6)这里我们选择下载3.4.14版本,这个版本里面的文件是一个tar.gz包,下载下来解压即可
(7)如果所示,解压之后无需特殊配置,只需要将conf里面的zoo_sample.cfg文件复制一份改成zoo.cfg即可,默认2181端口如果没有被占用,则不需要修改,此时可以直接进入bin目录启动即可
注意事项
Zookeeper可以管理集群服务,其本身也是可以集群部署的。
(8)安装步骤:
第一步:安装 jdk(此步省略,我给大家提供的镜像已经安装好JDK)
第二步:把 zookeeper 的压缩包(资源\配套软件\dubbox\zookeeper-3.4.6.tar.gz)上传到 linux 系统。
Alt+P 进入SFTP ,输入put d:\zookeeper-3.4.6.tar.gz 上传
第三步:解压缩压缩包
tar -zxvf zookeeper-3.4.6.tar.gz
第四步:进入 zookeeper-3.4.10 目录,创建 data 文件夹。
mkdir data
第五步:进入conf目录 ,把 zoo_sample.cfg 改名为 zoo.cfg
cd conf
mv zoo_sample.cfg zoo.cfg
第六步:打开zoo.cfg , 修改 data 属性:dataDir=/root/zookeeper-3.4.10/data
3.2.3 Zookeeper 服务启动
进入bin目录,启动服务输入命令
./zkServer.sh start
输出以下内容表示启动成功
关闭服务输入命令
./zkServer.sh stop
输出以下提示信息
查看状态:
./zkServer.sh status
如果启动状态,提示
如果未启动状态,提示:
配置zookeeper的path变量:
vim /etc/profile
export JAVA_HOME=/opt/jdk1.8.0_171
export CLASSPATH=.:
J
A
V
A
H
O
M
E
/
l
i
b
/
d
t
.
j
a
r
:
JAVA_HOME/lib/dt.jar:
JAVAHOME/lib/dt.jar:JAVA_HOME/lib/tools.jar
export PATH=/opt/redis-3.2.1/src:/opt/zookeeper-3.4.10/bin:
J
A
V
A
H
O
M
E
/
b
i
n
:
JAVA_HOME/bin:
JAVAHOME/bin:PATH
source /etc/profile
zkServer集群搭建
首先准备三台虚拟机,按照以上方式进行按照zookeeper。 参考网址:
https://www.cnblogs.com/linuxprobe/p/5851699.html
修改zookeeper的文件
One: 192.168.73.129
Two:192.168.73.130
Three:192.168.73.131
修改每个机器zookeeper的配置文件:
server.1= 192.168.73.129:2888:3888
server.2= 192.168.73.130:2888:3888
server.3= 192.168.73.131:2888:3888
并且在data目录下创建myid文件
myid文件内容 分别对应Server.1 server.2 server.3 的 1,2,3 分别对应每个机器。
配置zookeeper的环境变量:vi /etc/profile
进入数据目录/var/sxt/zk,执行:echo 1 > myid echo 2 > myid echo 3 > myid 分别在node02 node03 node04操作
也就是创建myid文件在服务器1,2,3分别追加1,2, 3, 代表各自zookeeper的id,跟上边zookeeper配置文件一一对应。
从node02向node03/node04分发:scp -r zookeeper-3.4.6/ node04:pwd
(发动到当前目录,即目标目录与源目录相同;也可以自定 以/开始)
还需要注意,分发的目录后一定要加(zookeeper-3.4.6/),否则就是把该目录的内容发过去,目录名称不会分发!!!
启动zookeeper集群:
zkServer.sh start node02、node03、node04分别操作
查看zookeeper集群个节点的启动状态:
zkServer.sh status
zkServer.sh stop
注意:在使用zookeeper时我们要保证防火墙是关闭的
7.zookeeper的理解:
(1)配置文件:zoo.cfg中
server.1 = node1:2888:3888
server.2 = node22:2888:3888
server.3 = node3:2888:3888
2888端口:提供zookeeper对外通信
3888端口:当leader挂掉之后,重新选择leader的时候提供对外通信
(2)zookeeper的角色:
(3)zookeeper的机制和协议:
------1.选举机制:
(1) 当有一个写入请求时,将请求传给一个follower,(2)follower将请求转发给leader,(3)leader将请求下发到各个follower,进行投票,(4)follower将自己大的想法返回给leader
注意:其中(3)和(4)就是原子广播
还有一个就是少数服从多数,
遵循的原则:过半原则-----------我们的zookeeper节点最好是单数
------------2.zab协议
(1)广播模式—已经选举出来的leader,开始对外提供服务----------原子广播
(2)恢复模式—还没有leader(集群刚启动,leader死了新的还没起来)
looking—观望
flowing—跟从但是有想法 flower
leading—继承人(准备继承)leader
observing—监听 observer
---------------3.监听机制:
follower查看leader的状态,然后将状态信息进行更新和发送
8.znode-----zookeeper的文件节点
启动客户端:zkCli.sh -server 192.168.192.130:2181
操作文件的命令:
ls , ls2 , set , get , create(-s -e)
znode的类型:
持久节点
临时节点 -e
持久顺序节点 -s
临时顺序节点