文章目录
前言:
zookeeper是分布式应用程序协调服务,负责协调其他的大数据框架。学习要求:会用即可。因此本文主要简单阐述一下zookeeper是怎么用的,基本的原理是啥。
1 zookeeper概述
1.1 作用
zookeeper是一个基于观察者设计模式的分布式服务管理框架,负责存储和管理集群中几点的数据,接受观察者的注册,一旦这些数据状态发生改变,Zookeeper就将负责通知已经在zookeeper中注册的那些观察者做出相应的反映。zookeeper = 文件系统 + 通知机制
1.2 特点
zookeeper也是一个分布式的程序,具有多个节点,具有如下特点:
- 有一个领导者(Leader),多个跟随者(follower)组成的集群
- 集群中只要有半数以上节点活着,zookeeper就能正常服务,所以zookeeper适合安装奇数台服务器。
- 全局数据一致:每一个server爆粗那一份相同的副本,Client无论连接到哪一台Server,拿到的数据都是一致的。
- 更新请求顺序执行,来自同一个Client的更新请求按照其发送顺序依次执行
- 数据更新原子性,一个数据更新要么成功,要么失败
- 实时性,在一定时间范围内,Client能够读到最新的数据。
1.3 数据结构
zookeeper数据模型以节点树的数据结构构建,每个节点称为一个znode,每一个znode默认存储1MB的数据(可以看到数据量很小,只可以存储一些配置信息)。
1.4 应用场景
-
统一命名服务
-
统一配置管理(之前hadoop的学习使用的是分发功能)
-
统一集群管理
-
服务器节点动态上下线
-
软负载均衡(节点间的负载均衡)
官网:https://zookeeper.apache.org/
2 zookeeper安装
2.1 本地模式安装与配置
下载地址:https://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/
本文是基于3.5.7来进行安装的。
安装步骤:
1)下载、上传、解压、安装JDK
2)修改配置:
- 将安装目录下conf/zoo_sample.cfg改名为zoo.cfg
- 修改zoo.cfg文件的dataDir为自己创建的非tmp目录(默认值在/tmp目录中,linux系统隔一段时间会删除这些文件),修改后结果类似于下图。
3)zookeeper初步了解:
查看zookeeper的目录结构:
- bin:框架相关命令操作:启动、停止,客户端、服务端
- conf: 配置文件
- docs文档
- lib 配置文档的依赖
查看bin目录下的文件
用的多的有:
- 集群启动:
zkServer.sh start
- 集群关闭:
zkServer.sh stop
- 查看状态:
zkServer.sh status
- 客户端启动:
zkCli.sh
- 客户端退出:
quit
- 查看进程是否启动:
jps
第2步中修改了zookeeper配置文件,其主要参数除了dataDir之外还有:
其具体含义为:
-
tickTime = 2000
:zookeeper服务器与客户端心跳时间,单位毫秒 -
initLimit = 10
:初始化通信的时间,最多不能超过的时间(10*心跳时间),超过的话,通信失败 -
syncLimit = 5
:建立好连接后,下次的通信时间如果超过(5*心跳时间),通信失败 -
dataDir
:保存zookeeper的数据,默认是tmp会被系统定期清除 -
clientPort =2181
:客户端的连接端口,一般不需要修改
2.2 集群模式安装与配置
与hadoop需要在配置文件中指定谁是namenode、secondary NameNode、resourceMannager不同,zookeeper它能够自己选出leader,所以不需要进行相关配置。但是需要自己配置每台机器的myid(用来唯一标识每一台机器的ID,每台机器不能重复),并需要在zoo.cfg文件中配置一下,告诉所有机器zookeeper集群本应该在哪几台机器上运行。
接下来进入安装步骤:
1)按照本地模式安装与配置安装一台机器
2)在存储目录dataDir
中新建myid文件,并在其中写入惟一的编号。
3)将安装目录和存储目录分发到你要配置的机器上,然后分别为他们修改myid。
4)需要重新配置zoo.cfg文件:增加如下配置,之后分发个各个集群:
server.1=hadoop100:2888:3888
server.3=hadoop102:2888:3888
server.4=hadoop103:2888:3888
当前主要配置编号的参数是server.A=B:C:D
- A:标识第几台服务器(myid)。zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。
- B:标识服务器映射地址。
- C:标识服务器 Follower 与集群中的 Leader 服务器交换信息的端口。
- D:主要是用来选举,如果Leader 服务器挂了。这个端口就是用来执行选举时服务器相互通信的端口,通过这个端口进行重新选举leader。
5)制作批量启动、停止、查看状态的脚本
#!/bin/bash
case $1 in
"start"){
for i in hadoop100 hadoop102 hadoop103
do
echo ---------- zookeeper $i 启动 ------------
ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh start"
done
};;
"stop"){
for i in hadoop100 hadoop102 hadoop103
do
echo ---------- zookeeper $i 停止 ------------
ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh stop"
done
};;
"status"){
for i in hadoop100 hadoop102 hadoop103
do
echo ---------- zookeeper $i 状态 ------------
ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh status"
done
};;
esac
做一下说明:这个脚本能用前提是配置了主机名称映射和ssh免密登录和可执行权限。运行启动脚本,查看状态,得到如下图:
解释一下:hadoop100配置的myid = 1,hadoop102配置的myid = 3,hadoop103配置的myid = 4。为啥hadoop2是leader下面揭晓。
3 zookeeper选举机制
这个PPT讲的很清楚了:
唯一解释一下的是ZXID:
Zxid 是一个 64 位的数字,其中低 32位是一个简单的单调递增的计数器,针对客户端每一个事 务请求,计数器加 1;而高 32 位则代表Leader 周期 epoch 的编号。
每个当选产生一个新的 Leader服务器,就会从这个 Leader服务器上取出其本地日志中最大事务的 ZXID,并从中读取 epoch值,然后加 1,以此作为新的 epoch,并将低 32 位从 0 开始计数。
Zxid(Transaction id)类似于 RDBMS 中的事务 ID,用于标识一次更新操作的 Proposal(提议)
ID。为了保证顺序性,该 zkid 必须单调递增。
依据上面选举的原理,就不难理解为啥hadoop102是leader了而不是hadoop103。初始化谁是leader与启动顺序和myid都有关系。