提示:笔者的zookeeper是在hadoop集群搭建完成后的基础上搭建的(包括虚拟机 jdk等)
一、Zookeeper介绍
zookeeper官网
1.1 概述
【1】zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目
【2】Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负 责存储和管理大家都关心的数据,然 后接受观察者的注 册,一旦这些数据的状态发生变化,Zookeeper就 将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。
【3】Zookeeper = 文件系统 + 通知机制
1.2 特点
【1】Zookeeper是一个领导者(leader),多个跟随者(follower)组成的集群
【2】集群中只要有半数以上的节点存活,zookeeper集群就能正常运行,所以Zookeeper适合安装奇数台服务器
【3】全局数据一致,每一个Serve保存一份相同的数据副本,Client无论连接到哪个Serve数据都是一致的
【4】更新请求顺序执行,来自同一个Client的更新请求按其发送顺序依次执行。
【5】数据更新的原子性:一次数据更新要么成功、要么失败
【6】实时性,在一定的时间范围内,Client能读到最新数值
1.3 zookeeper的数据结构
ZooKeeper 数据模型的结构与 Unix 文件系统很类似,整体上可以看作是一棵树,每个节点称做一个 ZNode。 每一个 ZNode 默认能够存储 1MB 的数据,每个 ZNode 都可以通过其路径唯一标识。
1.4 应用场景
Zookeeper提供的服务:
- ? 统一命名服务
- ? 统一配置管理
- ? 统一集群管理
- ? 服务器节点动态上下线
- ? 软负载均衡 …
二、安装Zookeeper
2.1 本地模式
1、环境准备 【1】环境准备 ????开启hadoop02虚拟机 (虚拟机安装以及jdk配置 参考hadoop专栏)
【2】将zookeeper上传到linux 使用xshell 【3】将zookeeper解压到/opt/module ????tar -zxvf apache-zookeeper-3.5.7-bin -C /opt/module/f 【4】修改名称 使其简短一点 ????mv apache-zookeeper-3.5.7-bin zookeeper-3.5.7
2、修改配置 【1】在/opt/module/zookeeper-3.5.7/这个目录上创建 zkData 文件夹 【2】将/opt/module/zookeeper-3.5.7/conf 这个路径下的zoo_sample.cfg 修改为 zoo.cfg; 【3】打开 zoo.cfg 文件,修改 dataDir 路径 ????dataDir=/opt/module/zookeeper-3.5.7/zkData
3、单点启动 【1】启动zookeeper服务 ????cd /opt/module/zookeeper-3.5.7
????bin/zkServer.sh start 【2】查看状态
bin/zkServer.sh status
【3】启动客户端
bin/zkCli.sh
【4】退出客户端 quit 注意这里不能使用exit exit无效
【5】停止zookeeper bin/zkServer.sh stop
2.2 zookeeper配置文件解读
????查看zookeeper的配置文件
【1】tick Time = 2000 通信心跳时间,zookeeper服务器与客户端心跳时间,单位毫秒 【2】initlimit = 10 LF初始通信时限 (leader和follower初始连接时能容忍的最大心跳数 tickTime的数量 即tickTime*10) 【3】syncLimit = 5 LF同步通信时限 (leader和follower·之间通信时间如果超过syncLimit * tickTime,leader则认为Follower挂掉) 【4】dataDir 保存zookeeper中的数据 注意:默认的tmp目录,容易被Linux系统定期删除,所以一般不用默认的tmp目录 【5】clientport 默认客户端连接的端口,通常不做修改
2.3 Zookeeper集群
2.3.1、集群安装
【1】集群规划 ??????zookeeper集群最少三个节点,在hadoop02 hadoop03 hadoop04 三个节点部署zookeeper 【2】解压安装zookeeper 前面已经在hadoop02上安装过 只需要在hadoop02进行集群配置,然后分发到其他机器上即可
xsync /opt/module/zookeeper-3.5.7
【3】配置服务器编号 (服务器的唯一标识) ??????(1)在/opt/module/zookeeper-3.5.7/zkData 目录下创建一个 myid 的文件 添加 2 保存退出 (上下不要有空行,左右不要有空格) 【4】拷贝配置好的zookeeper到其他机器 使用xsync同步分发脚本 【5】在hadoop03中奖myid改成3,在hadoop04中奖myid改成4 【6】配置zoo.cfg ??????vim zoo.cfg 添加以下内容
server.2=hadoop02:2888:3888
server.3=hadoop03:2888:3888
server.4=hadoop04:2888:3888
#配置参数解读 server.A=B:C:D
A 是一个数字,表示这个是第几号服务器; 集群模式下配置一个文件 myid,这个文件在 dataDir 目录下,这个文件里面有一个数据就是 A 的值Zookeeper 启动时读取此文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是哪个server B 是这个服务器的地址; C 是这个服务器 Follower 与集群中的 Leader 服务器交换信息的端口; D 是万一集群中的 Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader, 而这个端口就是用来执行选举时服务器相互通信的端口
2.3.2、启动zookeeper集群
三、选举机制
【1】半数机制:集群中半数以上的机器存活,集群可用,所以zookeeper适合安装奇数台服务器
【2】zookeeper虽然在配置文件中没有指定Master和slave.但是zookeeper工作时是有一个节点为leader,其他则为follower,leader是通过内部的选举机制临时产生的
3.1、第一次启动
即集群的第一次启动,zxid一致 【前提】:假设集群有五台机器,每台机器有自己的唯一编号 (myid)1 2 3 4 5 启动顺序为1 2 3 4 5 【1】服务器1启动,为自己投1票(zxid,myid)实际投的票为(0,1) 因为机器没有达到半数,选举失败 状态保持为·looking
【2】服务器2启动,再发起一次选举,服务器1和2分别投自己一票并交换选票信息:此时服务器1发现服务器2的myid比自己目前投票推举的(服务器1) 大,更改选票为推举服务器2。此时服务器1票数为0票,服务器2票数为2票,没有半数以上结果,选举无法完成,服务器1,2状态保持LOOKING
【3】服务器3启动,发起一次选举,。服务器3的myid比服务器1和服务器2都大,此时服务器1和2都会更改选票为服务器3。此次投票结果:服务器1为0票,服务器2为0票,服务器3为3票。此时服务器3的票数已经超过半数,服务器3当选Leader。服务器1,2更改状态为FOLLOWING,服务器3更改状态为LEADING
【4】服务器4启动,发起一次选举。此时服务器1,2,3已经不是LOOKING状态,不会更改选票信息。交换选票信息结果:服务器3为3票,服务器4为 1票。此时服务器4服从多数,更改选票信息为服务器3,并更改状态为FOLLOWING
【5】服务器5启动,跟4一样当小弟
3.2、非第一次启动
即集群工作情况下leader发生故障后需要重新选举leader zxid不一致 【1】当ZooKeeper集群中的一台服务器出现以下两种情况之一时,就会开始进入Leader选举:
????? 服务器初始化启动。
????? 服务器运行期间无法和Leader保持连接。
【2】当一台机器进入leader选举的情况,当前集群可能处于两种状态:
(1)集群中leader存在
? 对于第一种已经存在Leader的情况,机器试图去选举Leader时,会被告知当前服务器的Leader信息,对于该机器来说,仅仅需要和Leader机器建立连接,并进行状态同步即可
(2)集群中leader不存在(leader挂掉)
? 假设ZooKeeper由5台服务器组成,SID分别为1、2、3、4、5,ZXID分别为8、8、8、7、7,并且此时SID为3的服务器是Leader。某一时刻,3和5服务器出现故障,因此开始进行Leader选举。 先比EPOCh 再比zxid 再比myid
四、zookeeper的客户端操作
4.1、常用命令行
命令行基本语法 | 功能 |
---|
help | 显示所有操作命令提示 | ls [path] | 使用ls命令查看当前znode的子节点(-w 监听子节点 -s 附加次级信息) | get | 获得节点的信息【可监听】 -w 监听节点内容变化;-s 附加次级信息 | creat | 普通创建子节点 -s 含有序列 ; -e 临时 | set | 设置节点的值,修改节点的值 | stat | 查看节点的状态 | delete | 删除节点(空的) | deleteall | 递归删除节点 |
【1】启动客户端 bin/zkCli.sh -server hadoop02:2181 【2】help 查看帮助 【3】查看当前节点的内容信息 ls / 【4】查看当前节点的详细数据 ls -s / (1)czxid:创建节点的事务 zxid
每次修改 ZooKeeper 状态都会产生一个 ZooKeeper 事务 ID。事务 ID 是 ZooKeeper 中所有修改总的次序。每次修改都有唯一的 zxid,如果 zxid1 小于 zxid2,那么 zxid1 在 zxid2 之前发生
(2)ctime:znode 被创建的毫秒数(从 1970 年开始)
(3)mzxid:znode 最后更新的事务 zxid
(4)mtime:znode 最后修改的毫秒数(从 1970 年开始)
(5)pZxid:znode 最后更新的子节点 zxid
(6)cversion:znode 子节点变化号,znode 子节点修改次数
(7)dataversion:znode 数据变化号
(8)aclVersion:znode 访问控制列表的变化号
(9)ephemeralOwner:如果是临时节点,这个是 znode 拥有者的 session id。如果不是临时节点则是0。
(10)dataLength:znode 的数据长度
(11)numChildren:znode 子节点数量
4.2、节点类型
4.2.1、概述
节点类型分为两类四种 两大类:持久、短暂 ;四种:持久有序、持久无序、短暂有序、短暂无序
持久:客户端和服务器断开连接后,创建的节点不会被删除
短暂:客户端和服务器断开连接后,创建的节点会自己删除
【1】持久化目录节点:客户端与zookeeper断开连接后,该节点依旧存在
【2】持久化顺序编号目录节点:客户端与zookeeper断开连接后,该节点依旧存在,只是zookeeper给该节点进行了顺序编号
【3】临时目录节点:客户端与zookeeper断开连接后,该节点被删除
【4】临时顺序编号目录节点:客户端与zookeeper断开连接后,该节点被删除,只是zookeeper给该节点进行了顺序编号
4.2.2、实操
【1】创建永久节点 不带序号 【2】获得该节点的值 【3】创建永久节点+带序号
create -s /sanguo/weiguo/zhangliang "zhangliang"
create -s /sanguo/weiguo/zhangliang "zhangliang"
【4】创建短暂节点 + 不带序号 【5】查看当前节点 【6】退出客户端重连 再次查看 【7】修改节点数据
4.3、监听器原理
????客户端注册监听他关心的目录节点,当目录节点发生变化(数据改变、节点删除、自目录节点增加删除)时,zookeeper会通知客户端。监听机制保证了zookeeper保存的任何数据的任何改变都能快速的响应到监听了该节点的应用程序
4.3.1、监听节点数据变化
【1】在 hadoop04 主机上注册监听/sanguo 节点数据变化
get -w /sanguo
【2】在hadoop03主机上修改/sanguo节点的数据
set /sanguo "三国"
【3】观察hadoop04主机收到的数据变化的监听 【注意】在hadoop03再次修改数据,但是hadoop04不会再收到监听。因为注册一次只能监听一次。想要再次监听,需要再次注册
4.3.2、监听子节点增减的变化
【1】在hadoop04上注册监听/sanguo节点的子节点变化
ls -w /sanguo
【2】在hadoop03上创建子节点
create /sanguo/jin "simayi"
【3】观察hadoop04收到的子节点变化的监听
4.3.3、节点的查看与删除
【1】查看节点状态
stat /sanguo
【2】删除节点
delete /sanguo/jin
【3】递归删除节点
deleteall /sanguo
小结
【1】zookeeper是什么(分布式的,为分布式框架提供协调服务的apache项目) 【2】zookeeper的应用场景
- 统一命名服务
- 统一配置管理
- 统一集群管理
- 服务器动态上下线
- 软负载均衡
【3】zookeeper的安装
- 本地模式安装
- 单点启动
- 集群模式配置
【4】zookeeper的选举机制 【5】客户端常用操作命令
|