Zookeeper
Zookeeper
是什么
ZooKeeper 是一个集中式服务,用于维护配置信息、命名、提供分布式同步和提供组服务
-
集中式:在Hadoop生态集群中,通常只搭建一套zk集群,所有的分布式计算框架存储框架或者中间件,可以公用同一个zk集群
-
维护配置信息:在分布式架构中,各类组件的配置文件在小规模集群时,可以每台机器分别管理,但随着集群规模增加,需要引入统一的资源管理方式,使用实现了观察者模式和回调机制的zk,作为分布式集群配置的统一管理方式,是Hadoop生态中推荐的实现方式
-
命名、提供分布式同步:zk提供了自动命名的方式,用于分布式命名。分布式场景中,集群中所有机器都会启动若干个任务线程,每个线程之间只能在JVM内部完成同步,如果想实现集群内部跨机器全局的命名或者线程同步,需要是同类似zk第三方组件完成统一的管理。
-
提供组服务:在绝大部分的Hadoop生态主从架构集群中,都可以使用zk实现集群主节点的高可用(HA)架构。HA架构中所有的主节点形成一个组,所有的从节点形成一组,集群主备切换和选举由zk完成,其他组负责接收zk的指令完成故障转移。
zk集群搭建
1. 单机模式
2. 分布式模式
-
解压
-
修改配置文件
- zoo.cfg
# 修改用于存储zk数据的文件夹
dataDir=/opt/zookeeper-3.4.14/data
# server.A=B:C:D
# A是一个集群内全局唯一的整数值, 表示每一台zk服务器的myid
# B是myid对应的服务器的ip或者主机名
# C是zk集群之前进行数据同步的端口号
# D是zk集群选举投票使用的端口号
server.1=bd1301:2888:3888
server.2=bd1302:2888:3888
server.3=bd1303:2888:3888
-
分发安装包
- 每台机器单独添加myid文件
- myid存储在zk的DataDir中 文件名叫myid,文件内容是当前机器对应的id号
-
添加环境变量
echo 'export ZK_HOME=/opt/zookeeper-3.4.14' >> /etc/profile
echo 'export PATH=$ZK_HOME/bin:$PATH' >> /etc/profile
source /etc/profile
zk操作
1. 命令行操作
# 启动zk命令行客户端
# zk客户端访问端口默认为2181
zkCli.sh [-server host:port]
# 打印对应路径下的?列表
ls path [watch]
# 新建?
create [-s] [-e] path data acl
# 获取某个?的数据
get path [watch]
##
[zk: localhost:2181(CONNECTED) 9] get /test1
test1111
cZxid = 0x400000006 # 创建操作的zk事务id
ctime = Tue Jun 07 08:57:30 CST 2022 # 创建时间
mZxid = 0x400000006 # 修改操作的zk事务id
mtime = Tue Jun 07 08:57:30 CST 2022 # 修改时间
pZxid = 0x400000008 # 父路径的zk事务id
cversion = 1 # 创建的数据版本号
dataVersion = 0 # 数据版本号
aclVersion = 0 # 权限访问列表的版本号
ephemeralOwner = 0x0 # 临时节点拥有者的客户端id,为0代表没有拥有者
dataLength = 8 # 数据的字节数
numChildren = 1 # 子路径的个数
# 更新某个?的数据
set path data [version]
# 删除某个?
rmr path
#退出终端
quit
2. 图形化工具操作
zk核心原理
1. zk选举机制
zk一般搭建奇数台节点
每台zk服务启动后会首先将选票投给自己,同时会通过配置文件种设置的投票通信端口(默认3888),向集群其他机器发送选票信息
如果收到其他机器发送的选票信息,那么当前已经上线的服务会将选票更新为当前在线的myid最大的节点
- 如果集群中上线节点数量超过半数,则选举完成,id最大的当选为leader
2. zk Zxid
Zxid是zk内部维护的一个单调递增的id号,通常称为事务id
客户端对zk进行增删改操作时,zk集群内部会将事务id进行更新
zk集群节点之间通过比较事务id的大小,确定数据的版本
3. zk存储模型
-
zk维护一个从
/
开始的类似文件系统的树形结构 -
树的每个子叶可以也包含若干个子叶,树种的子叶称为
znode
-
每个
znode
- 既包含一个从
/
开始的全局唯一的名称 - 还可以保存一部分数据(默认1MB)
- 还包含一部分元数据信息,包含数据版本以及事务ID
- 既包含一个从
-
znode分为不同的类型
-
生命周期:
- 永久znode:如果不主动删除,数据可以永久保存
- 短暂znode: 创建短暂znode的客户端断开连接后,短暂znode会自动消亡
通常用于分布式服务上线后,注册自己的在线状态,当服务正常退出时,znode立即删除,非正常退出时,zk会在30s超时后对其进行清除
zk的其他客户端可以通过监听znode的变化,得知服务的在线状态
-
命名方式:
- 无序号:znode的名称由客户端定义
- 有序号:znode的名称再客户端定义的名称后自动追加单调递增的序号
典型的,在平级服务或者线程需要使用zk进行统一的命名时,通常会使用相同的自定义名称添加有序号参数,使得创建出的znode可以加以区分
-