ZooKeeper--分布式协调组件

09 Feb 2021

Zookeeper简介

Zookeeper是什么?

Zookeeper 是一个分布式协调服务的开源框架。 主要用来解决分布式集群中应用系统的一致性问题, 例如怎样避免同时操作同一数据造成脏读的问题。

zookeeper的架构组成

ZK也是Master/slave架构,但是与hadoop不同的是zk集群中的Leader不是指定而来,而是通过选举产 生。

Zookeeper 特点

  1. Zookeeper:一个领导者(leader:老大),多个跟随者(follower:小弟)组成的集群。
  2. Leader负责进行投票的发起和决议,更新系统状态(内部原理)
  3. Follower用于接收客户请求并向客户端返回结果,在选举Leader过程中参与投票
  4. 集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。
  5. 全局数据一致:每个server保存一份相同的数据副本,Client无论连接到哪个server,数据都是一 致的。
  6. 更新请求顺序进行(内部原理)
  7. 数据更新原子性,一次数据更新要么成功,要么失败。

Zookeeper集群模式搭建

Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。

1. 下载上传安装包

下载稳定版本的zookeeper : http://zookeeper.apache.org/releases.html

下载完成后,将zookeeper压缩包 zookeeper-3.4.14.tar.gz上传到linux系统/opt/lagou/software 解压 压缩包

tar -zxvf zookeeper-3.4.14.tar.gz -C ../servers/  

2. 修改配置文件创建data与log目录

#创建zk存储数据目录  
mkdir -p /opt/lagou/servers/zookeeper-3.4.14/data  
  
 #创建zk日志文件目录  
mkdir -p /opt/lagou/servers/zookeeper-3.4.14/data/logs   
  
#修改zk配置文件  
cd /opt/lagou/servers/zookeeper-3.4.14/conf  
  
#文件改名  
mv zoo_sample.cfg zoo.cfg  
vim zoo.cfg  
  
#更新datadir  
dataDir=/opt/lagou/servers/zookeeper-3.4.14/data  
  
#增加logdir   
dataLogDir=/opt/lagou/servers/zookeeper-3.4.14/data/logs   
  
#增加集群配置 ##server.服务器ID=服务器IP地址:服务器之间通信端口:服务器之间投票选举端口 
server.1=centos7-1:2888:3888  
server.2=centos7-2:2888:3888  
server.3=centos7-3:2888:3888  
  
#打开注释 
#ZK提供了自动清理事务日志和快照文件的功能,这个参数指定了清理频率,单位是小时 
autopurge.purgeInterval=1  

3. 添加myid配置

在zookeeper的 data 目录下创建一个 myid 文件,内容为1,这个文件就是记录每个服务器的ID

cd /opt/lagou/servers/zookeeper-3.4.14/data  
echo 1 > myid  

4. 同步zookeeper安装包到所有机器

安装包分发并修改myid的值

rsync-script /opt/lagou/servers/zookeeper-3.4.14  
# centos7-2  
echo 2 >/opt/lagou/servers/zookeeper-3.4.14/data/myid  
  
# centos7-3  
echo 3 >/opt/lagou/servers/zookeeper-3.4.14/data/myid  

5. 依次单独启动节点

启动命令(三个节点都要执行)

/opt/lagou/servers/zookeeper-3.4.14/bin/zkServer.sh start  
  
# 查看状态  
/opt/lagou/servers/zookeeper-3.4.14/bin/zkServer.sh status  
  
# 停止  
/opt/lagou/servers/zookeeper-3.4.14/bin/zkServer.sh stop  

6. 编写集群启动停止脚本

vim zk.sh  
  
#!/bin/sh  
echo "start zookeeper server..."  
if(($#==0));then  
echo "no params";  
exit;  
fi  
  
hosts="centos7-1 centos7-2 centos7-3"  
  
for host in $hosts  
do  
ssh $host "source /etc/profile; /opt/lagou/servers/zookeeper-3.4.14/bin/zkServer.sh $1"  
done  
zk.sh start  
zk.sh status  
zk.sh stop  

Zookeeper数据结构与监听机制

ZooKeeper数据模型Znode

在ZooKeeper中,数据信息被保存在一个个数据节点上,这些节点被称为znode。ZNode 是 Zookeeper 中最小数据单位,在 ZNode 下面又可以再挂 ZNode,这样一层层下去就形成了一个层次化 命名空间 ZNode 树,我们称为 ZNode Tree,它采用了类似文件系统的层级树状结构进行管理。

在 Zookeeper 中,每一个数据节点都是一个 ZNode,上图根目录下有两个节点,分别是:app1 和 app2,其中 app1 下面又有三个子节点,所有ZNode按层次化进行组织,形成这么一颗树,ZNode的节 点路径标识方式和Unix文件系统路径非常相似,都是由一系列使用斜杠(/)进行分割的路径表示,开 发人员可以向这个节点写入数据,也可以在这个节点下面创建子节点

ZNode 的类型

Zookeeper 节点类型可以分为三大类:
持久性节点(Persistent)
临时性节点(Ephemeral)
顺序性节点(Sequential)

在开发中在创建节点的时候通过组合可以生成以下四种节点类型:持久节点、持久顺序节点、临时节点、临时顺序节点。不同类型的节点则会有不同的生命周期

ZNode 的状态信息

整个 ZNode 节点内容包括两部分:节点数据内容和节点状态信息。数据内容是空,其他的属于状态信息

cZxid 就是 Create ZXID,表示节点被创建时的事务ID。  
ctime 就是 Create Time,表示节点创建时间。  
mZxid 就是 Modified ZXID,表示节点最后一次被修改时的事务ID。  
mtime 就是 Modified Time,表示节点最后一次被修改的时间。  
pZxid 表示该节点的子节点列表最后一次被修改时的事务 ID。只有子节点列表变更才会更新 pZxid,子节点内容变更不会更新。  
cversion 表示子节点的版本号。  
dataVersion 表示内容版本号。  
aclVersion 标识acl版本  
ephemeralOwner 表示创建该临时节点时的会话 sessionID,如果是持久性节点那么值为 0   
dataLength 表示数据长度。  
numChildren 表示直系子节点数。  

Watcher 机制

Zookeeper使用Watcher机制实现分布式数据的发布/订阅功能
在 ZooKeeper 中,引入了 Watcher 机制来实现这种分布式的通知功能。ZooKeeper 允许客户端向服 务端注册一个 Watcher 监听,当服务端的一些指定事件触发了这个 Watcher,那么Zk就会向指定客户端发送一个事件通知来实现分布式的通知功能。

Zookeeper的Watcher机制主要包括客户端线程、客户端WatcherManager、Zookeeper服务器三部 分。
具体工作流程为:

基本使用

ZooKeeper命令行操作

开源客户端ZkClient

ZkClient是Github上一个开源的zookeeper客户端,在Zookeeper原生API接口之上进行了包装,是 一个更易用的Zookeeper客户端,同时,zkClient在内部还实现了诸如Session超时重连、Watcher反复 注册等功能

Zookeeper内部原理

Leader选举

ZAB一致性协议

Zookeeper应用实践

ZooKeeper是一个典型的发布/订阅模式的分布式数据管理与协调框架,我们可以使用它来进行分布 式数据的发布与订阅。另一方面,通过对ZooKeeper中丰富的数据节点类型进行交叉使用,配合 Watcher事件通知机制,可以非常方便地构建一系列分布式应用中都会涉及的核心功能,如数据发布/订 阅、命名服务、集群管理、Master选举、分布式锁和分布式队列等

Zookeeper的两大特性:

  1. 客户端如果对Zookeeper的数据节点注册Watcher监听,那么当该数据节点的内容或是其子节点列表发生变更时,Zookeeper服务器就会向订阅的客户端发送变更通知。
  2. 对在Zookeeper上创建的临时节点,一旦客户端与服务器之间的会话失效,那么临时节点也会被自动删除

利用其两大特性,可以实现集群机器存活监控系统,若监控系统在/clusterServers节点上注册一个 Watcher监听,那么但凡进行动态添加机器的操作,就会在/clusterServers节点下创建一个临时节 点:/clusterServers/[Hostname],这样,监控系统就能够实时监测机器的变动情况。

服务器动态上下线监听

分布式系统中,主节点会有多台,主节点可能因为任何原因出现宕机或者下线,而任意一台客户端都要能实时感知到主节点服务器的上下线。

分布式锁

分布式锁的作用:在整个系统提供一个全局、唯一的锁,在分布式系统中每个系统在进行相关操作的时候需要获取到该锁,才能执行相应操作。

Hadoop HA

HA 概述

  1. 所谓HA(High Available),即高可用(7*24小时不中断服务)。
  2. 实现高可用最关键的策略是消除单点故障。Hadoop-HA严格来说应该分成各个组件的HA机制:
    HDFS的HA和YARN的HA。
  3. Hadoop2.0之前,在HDFS集群中NameNode存在单点故障(SPOF)。
  4. NameNode主要在以下两个方面影响HDFS集群
    • NameNode机器发生意外,如宕机,集群将无法使用,直到管理员重启
    • NameNode机器需要升级,包括软件、硬件升级,此时集群也将无法使用

HDFS HA功能通过配置Active/Standby两个NameNodes实现在集群中对NameNode的热备来解决上述 问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将NameNode很快的切 换到另外一台机器。

HDFS-HA 工作机制

通过双NameNode消除单点故障(Active/Standby)

HDFS-HA集群配置

https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html

YARN-HA配置

https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html