AmosCloud

Library

Have a Question?

If you have any question you can ask below or enter what you are looking for!

Zookeeper

Zookeeper

是什么

ZooKeeper 是一个集中式服务,用于维护配置信息、命名、提供分布式同步和提供组服务

  • 集中式:在Hadoop生态集群中,通常只搭建一套zk集群,所有的分布式计算框架存储框架或者中间件,可以公用同一个zk集群

  • 维护配置信息:在分布式架构中,各类组件的配置文件在小规模集群时,可以每台机器分别管理,但随着集群规模增加,需要引入统一的资源管理方式,使用实现了观察者模式和回调机制的zk,作为分布式集群配置的统一管理方式,是Hadoop生态中推荐的实现方式

  • 命名、提供分布式同步:zk提供了自动命名的方式,用于分布式命名。分布式场景中,集群中所有机器都会启动若干个任务线程,每个线程之间只能在JVM内部完成同步,如果想实现集群内部跨机器全局的命名或者线程同步,需要是同类似zk第三方组件完成统一的管理。

  • 提供组服务:在绝大部分的Hadoop生态主从架构集群中,都可以使用zk实现集群主节点的高可用(HA)架构。HA架构中所有的主节点形成一个组,所有的从节点形成一组,集群主备切换和选举由zk完成,其他组负责接收zk的指令完成故障转移。

zk集群搭建

1. 单机模式

2. 分布式模式

  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
  1. 分发安装包

    • 每台机器单独添加myid文件
    • myid存储在zk的DataDir中 文件名叫myid,文件内容是当前机器对应的id号
  2. 添加环境变量

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存储模型

file

  • zk维护一个从/开始的类似文件系统的树形结构

  • 树的每个子叶可以也包含若干个子叶,树种的子叶称为znode

  • 每个znode

    1. 既包含一个从/开始的全局唯一的名称
    2. 还可以保存一部分数据(默认1MB)
    3. 还包含一部分元数据信息,包含数据版本以及事务ID
  • znode分为不同的类型

    • 生命周期:

      1. 永久znode:如果不主动删除,数据可以永久保存
      2. 短暂znode: 创建短暂znode的客户端断开连接后,短暂znode会自动消亡
        通常用于分布式服务上线后,注册自己的在线状态,当服务正常退出时,znode立即删除,非正常退出时,zk会在30s超时后对其进行清除
        zk的其他客户端可以通过监听znode的变化,得知服务的在线状态
    • 命名方式:

      1. 无序号:znode的名称由客户端定义
      2. 有序号:znode的名称再客户端定义的名称后自动追加单调递增的序号
        典型的,在平级服务或者线程需要使用zk进行统一的命名时,通常会使用相同的自定义名称添加有序号参数,使得创建出的znode可以加以区分