1.简介
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。提供了分布式独享锁、选举、队列的接口。
Zookeeper特性
-
读写分离: Zookeeper 是一个由多个 server 组成的集群,一个 leader,多个 follower,分布式读由 follower,写由 leader 实施。
-
顺序一致性:从同一客户端发起的事务请求,最终将会严格地按照顺序被应用到 ZooKeeper 中去。
-
原子性:所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的,也就是说,要么整个集群中所有的机器都成功应用了某一个事务,要么都没有应用。
单一视图:无论客户端连到哪一个 ZooKeeper 服务器上,其看到的服务端数据模型都是一致的。
-
可靠性: 一旦服务端成功地应用了一个事务,并完成对客户端的响应,那么该事务所引起的服务端状态变更将会被一直保留下来。
-
实时性(最终一致性): Zookeeper 仅仅能保证在一定的时间段内,客户端最终一定能够从服务端上读取到最新的数据状态。
Znode数据模型
zookeeper的数据节点可以视为树状结构的目录,树中的各节点被称为znode(即zookeeper node),一个znode可以有多个子节点,可以说 zookeeper 中的所有存储的数据是由 znode 组成的,并以 key/value 形式存储数据。整体结构类似于 linux 文件系统的模式以树形结构存储,其中根路径以 / 开头。
znode节点类型
-
PERSISTENT: 持久类型,如果不手动删除 是一直存在的
-
PERSISTENT:_SEQUENTIAL: 持久有序,自增
-
EPHEMERAL: 临时 客户端 session 失效就会随着删除节点 没有子节点
-
EPHEMERAL_SEQUENTIAL: 临时有序,自增
创建 znode 时设置顺序标识,znode 名称后会附加一个值顺序号是一个单调递增的计数器,由父节点维护在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序。
下面是网上找的一张关于Zookeeper体系的图片。
2.环境准备
zookeeper集群节点数推荐为奇数(2n+1)个,因为如果为偶数个节点,当有一半节点发生故障时,由于没有足够的节点数来选举新的leader节点(要求半数以上节点选举,不包含半数),会导致整个集群无法工作。如果只能部署两个节点,则不如使用单节点,因为两个节点的集群,只要任意一个节点发生故障,则集群无法工作。
集群规则为:2N + 1 台,N > 0,即最少需要 3 台。本文的集群环境搭建用到了3台机器。
节点类型 |
节点主机名 |
节点IP地址 |
主节点 |
master |
192.168.239.128 |
从节点 |
slave1 |
192.168.239.129 |
从节点 |
slave2 |
192.168.239.130 |
修改3台机器的/etc/hosts文件
在启动集群时,主节点需要通过主机名远程访问从节点,所以需要让主节点能够识别从节点的主机名。
vi /etc/hosts
192.168.239.128 master
192.168.239.129 slave1
192.168.239.130 slave2
zookeeper官网下载地址: 点我跳转
本文用的版本是3.8.0,下载完上传文件到master节点服务器上面的/home/soft目录下并解压。
cd /home/soft
tar -zxvf apache-zookeeper-3.8.0-bin.tar.gz
3.修改Zookeeper配置文件
cd /home/soft/apache-zookeeper-3.8.0-bin/conf
#复制配置文件
cp zoo_sample.cfg zoo.cfg
#创建数据保存目录
mkdir /home/soft/apache-zookeeper-3.8.0-bin/data
#编辑配置文件
vi zoo.cfg
在zoo.cfg文件尾部添加下面4行属性,然后保存
dataDir=/home/soft/apache-zookeeper-3.8.0-bin/data
server.0=master:2888:3888
server.1=slave1:2888:3888
server.2=slave2:2888:3888
4.复制安装包到从节点并设置myid
从节点的/home/soft必须存在,zoo.cfg配置文件中的server参数后面指定的编号为节点的唯一Id,需要手动创建myid文件保存id
scp -rq /home/soft/apache-zookeeper-3.8.0-bin slave1:/home/soft
scp -rq /home/soft/apache-zookeeper-3.8.0-bin slave2:/home/soft
master机器
echo 0 > /home/soft/apache-zookeeper-3.8.0-bin/data/myid
slave1机器
echo 1 > /home/soft/apache-zookeeper-3.8.0-bin/data/myid
slave2机器
echo 2 > /home/soft/apache-zookeeper-3.8.0-bin/data/myid
5.启动集群
依次在3个节点上面都启动zk服务。
/home/soft/apache-zookeeper-3.8.0-bin/bin/zkServer.sh start
在3台机器上面分别使用jps都可以看到QuorumPeerMain服务表示集群启动正常了。
停止命令
/home/soft/apache-zookeeper-3.8.0-bin/bin/zkServer.sh stop
6.zkCli常用命令
zkCli是用来连接ZooKeeper服务器操作数据的脚本工具。
/home/soft/apache-zookeeper-3.8.0-bin/bin/zkCli.sh
zkCli常用的命令如下.
命令 |
描述 |
help |
查看命令帮助 |
ls |
查看目录 |
create |
创建节点 |
get |
获取节点数据 |
set: |
修改节点数据 |
delete |
删除节点数据 |
rmr |
递归删除带有子节点的节点 |
创建节点
格式: create [-e] [-s] path data(可选)
-e 创建临时节点,一旦会话结束,则节点自动删除
-s 创建带有序列号的节点,带有-s的create命令会自动为节点增加一个序列号,
递增后缀,可以通过这个判断节点创建的先后顺序。
-e和-s可以组合使用。
以下创建了config节点,并在config节点下创建db.username节点并赋值为root
create /config
create /config/db.username root
获取节点数据
格式: get [-s] [-w] path
-s 查看节点所有信息:数据信息+节点属性值
-w 查看节点数据信息(不加参数默认是-w)
get -s -w /config/db.username
第一行为这个节点的数据内容,其它的参考下面列表
参数 |
描述 |
cZxid |
节点创建时的zxid |
ctime |
节点创建时的时间戳 |
mZxid |
节点最新一次更新发生时的zxid |
mtime |
节点最新一次更新发生时的时间戳 |
pZxid |
该节点的子节点(或该节点)的最近一次 创建 / 删除 的时间戳对应 |
cversion |
其子节点的更新次数 |
dataVersion |
节点数据的更新次数 |
aclVersion |
节点ACL(授权信息)的更新次数 |
ephemeralOwner |
如果该节点为临时节点,ephemeralOwner值表示与该节点绑定的会话ID,如果该节点不是临时节点,ephemeralOwner值为0x0 |
dataLength |
数据长度 |
numChildren |
子节点的数量 |
修改节点数据
修改完数据后执行get查看节点控制台会打印admin
set /config/db.username admin
删除节点
递归删除包含子节点的节点
rmr /config
删除没有子节点的节点
delete /config/db.username
【Hadoop生态圈】其它文章如下,后续会继续更新。