Zookeeper总结

觉得有帮助的,请多多支持博主,点赞关注哦~

文章目录

  • Zookeeper
    • 一、Zookeeper概述
      • 1、概述
      • 2、特点
      • 3、数据结构
      • 4、应用场景
      • 5、下载地址
    • 二、Zookeeper 安装
      • 1、本地模式安装部署
        • 1.1、前置准备
        • 1.2、安装配置
        • 1.3、启动Zookeeper
      • 2、zoo.cfg 文件中配置参数解读
    • 三、Zookeeper 内部原理
      • 1、选举机制
      • 2、节点类型
      • 3、stat 结构体
      • 4、监听器原理
        • 4.1、监听原理详解
        • 4.2、常见的监听
      • 5、写数据流程
    • 四、Zookeeper分布式安装部署
      • 1、集群规划
      • 2、解压安装
      • 3、配置 zoo.cfg 文件
      • 4、集群操作
      • 5、启动zookeeper集群
      • 6、查看状态
    • 五、客户端命令行操作
      • 1、stat获取指定节点的状态信息 status
      • 2、Is某节点下的所有子节点
      • 3、Is2是Is和stat两个命令的结合
      • 4、create新建节点
      • 5、修改节点上的数据内容
      • 6、删除节点
      • 7、deleteall递归删除节点
      • 8、Znode节点的ACL权限
    • 六、Zookeeper API应用
      • 1、引入依赖
      • 2、代码测试

Zookeeper

一、Zookeeper概述

1、概述

  1. Zookeeper 是一个开源的分布式的,为分布式应用提供协调服务的 Apache 项目。
  2. Zookeeper 从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper 就将负责通知已经在 Zookeeper 上注册的那些观察者做出相应的反应,从而实现集群中类似 Master/Slave 管理模式
  3. 主要有:主从模式、监听模式。
  4. Zookeeper=文件系统+通知机制
  5. Zookeeper维护一个类似文件系统的数据结构。

2、特点

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

3、数据结构

​ ZooKeeper 数据模型的结构与 Unix 文件系统很类似,整体上可以看作是一棵树,每个节点称做一个 ZNode。
​ 很显然 zookeeper 集群自身维护了一套数据结构。这个存储结构是一个树形结构,其上的每一个节点,我们称之为"znode",每一个 znode 默认能够存储 1MB 的数据,每个 ZNode都可以通过其路径唯一标识

Zookeeper总结_第1张图片

4、应用场景

提供的服务包括:分布式消息同步和协调机制、服务器节点动态上下线、统一配置管理、负载均衡、集群管理等。

Zookeeper总结_第2张图片

Zookeeper总结_第3张图片

Zookeeper总结_第4张图片

5、下载地址

官方网站:https://zookeeper.apache.org/

Zookeeper总结_第5张图片

Zookeeper总结_第6张图片

直接下载推荐链接: https://ftp.riken.jp/net/apache/zookeeper/

Zookeeper总结_第7张图片

https://ftp.riken.jp/net/apache/zookeeper/

Zookeeper总结_第8张图片

二、Zookeeper 安装

1、本地模式安装部署

1.1、前置准备

安装JDK,不多说了。。之前的文章有很多遍。

1.2、安装配置

# 上传到Linux
[hadooptest@biubiubiu model]$ rz
# 解压到model
[hadooptest@biubiubiu model]$ tar -zxvf apache-zookeeper-3.5.7-bin -C ../model
# 重命名
[hadooptest@biubiubiu model]$ mv apache-zookeeper-3.5.7-bin/ zookeeper-3.5.7

# 修改配置文件zoo.cfg(类似mapred-site.xml)
# 1、新建目录
[hadooptest@biubiubiu zookeeper-3.5.7]$ mkdir data
# 2、进入conf
[hadooptest@biubiubiu zookeeper-3.5.7]$ cd conf
# 3、复制zoo_sample.cfg
[hadooptest@biubiubiu conf]$ cp zoo_sample.cfg zoo.cfg 
# 4、修改zoo.cfg
[hadooptest@biubiubiu conf]$ vi zoo.cfg 
	dataDir=/opt/model/zookeeper-3.5.7/data

Zookeeper总结_第9张图片

# 配置环境变量
[hadooptest@biubiubiu conf]$ sudo vim /etc/profile
[hadooptest@biubiubiu conf]$ source /etc/profile
[hadooptest@biubiubiu conf]$ echo $ZOOKEEPER_HOME
/opt/model/zookeeper-3.5.7

Zookeeper总结_第10张图片

1.3、启动Zookeeper

# 启动zookeeper
[hadooptest@biubiubiu bin]$ zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/model/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

# 查看进程是否启动
[hadooptest@biubiubiu bin]$ jps
2251 QuorumPeerMain
2317 Jps

# 查看zookeeper状态
[hadooptest@biubiubiu bin]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/model/zookeeper-3.5.7/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: standalone

# 启动客户端操作
[hadooptest@biubiubiu bin]$ zkCli.sh 
# 创建node2节点
[zk: localhost:2181(CONNECTED) 0] create /node2
Created /node2
# 查看/下节点
[zk: localhost:2181(CONNECTED) 1] ls /
[node2, zookeeper]
# 退出客户端
[zk: localhost:2181(CONNECTED) 2] quit

# 停止zookeeper
[hadooptest@biubiubiu bin]$ zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /opt/model/zookeeper-3.5.7/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED

2、zoo.cfg 文件中配置参数解读

  1. tickTime:通信心跳数,Zookeeper服务器心跳时间,单位毫秒
    Zookeeper使用的基本时间,服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳,时间单位为毫秒。
    它用于心跳机制,并且设置最小的session超时时间为两倍心跳时间。(session的最小超时时间是2*tickTime)
  2. initLimit:LF初始通信时限
    集群中的follower跟随者服务器(F)与leader领导者服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量),用它来限定集群中的Zookeeper服务器连接到Leader的时限。
    投票选举新leader的初始化时间
    Follower在启动过程中,会从Leader同步所有最新数据,然后确定自己能够对外服务的起始状态。
    Leader允许F在initLimit时间内完成这个工作。
  3. syncLimit:LF 同步通信时限
    集群中Leader与Follower之间的最大响应时间单位,假如响应超过syncLimit * tickTime,Leader认为Follwer死掉,从服务器列表中删除Follwer。
    在运行过程中,Leader负责与ZK集群中所有机器进行通信,例如通过一些心跳检测机制,来检测机器的存活状态。
    如果L发出心跳包在syncLimit之后,还没有从F那收到响应,那么就认为这个F已经不在线了。
  4. dataDir:数据文件目录+数据持久化路径
    保存内存数据库快照信息的位置,如果没有其他说明,更新的事务日志也保存到数据库。
  5. clientPort:客户端连接端口
    监听客户端连接的端口

三、Zookeeper 内部原理

1、选举机制

  1. 半数机制(Paxos 协议):集群中半数以上机器存活,集群可用。所以 zookeeper适合装在奇数台机器上。
  2. Zookeeper 虽然在配置文件中并没有指定 master 和 slave。但是,zookeeper 工作时,是有一个节点为 leader,其他则为 follower,Leader 是通过内部的选举机制临时产生的。
  3. 以一个简单的例子来说明整个选举的过程。
    假设有五台服务器组成的 zookeeper 集群,它们的 id 从 1-5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上,都是一样的。假设这些服务器依序启动,来看看会发生什么。
    Zookeeper总结_第11张图片
  • 服务器 1 启动,此时只有它一台服务器启动了,它发出去的报没有任何响应,所以它的选举状态一直是 LOOKING 状态。
  • 服务器 2 启动,它与最开始启动的服务器 1 进行通信,互相交换自己的选举结果,由于两者都没有历史数据,所以 id 值较大的服务器 2 胜出,但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是 3),所以服务器 1、2 还是继续保持LOOKING 状态。
  • 服务器 3 启动,根据前面的理论分析,服务器 3 成为服务器 1、2、3 中的老大,而与上面不同的是,此时有三台服务器选举了它,所以它成为了这次选举的 leader。
  • 服务器 4 启动,根据前面的分析,理论上服务器 4 应该是服务器 1、2、3、4 中最大的,但是由于前面已经有半数以上的服务器选举了服务器 3,所以它只能接收当小弟的命了。
  • 服务器 5 启动,同 4 一样当小弟。

2、节点类型

1、Znode 有两种类型:

  1. 短暂(ephemeral):客户端和服务器端断开连接后,创建的节点自己删除
  2. 持久(persistent):客户端和服务器端断开连接后,创建的节点不删除

2、Znode 有四种形式的目录节点(默认是 persistent )

  1. 持久化目录节点(PERSISTENT)
    客户端与 zookeeper 断开连接后,该节点依旧存在
  2. 持久化顺序编号目录节点(PERSISTENT_SEQUENTIAL)
    客户端与 zookeeper 断开连接后,该节点依旧存在,只是 Zookeeper 给该节点名称进行顺序编号
  3. 临时目录节点(EPHEMERAL)
    客户端与 zookeeper 断开连接后,该节点被删除
  4. 临时顺序编号目录节点(EPHEMERAL_SEQUENTIAL)
    客户端与 zookeeper 断开连接后,该节点被删除,只是 Zookeeper 给该节点名称进行顺序编号

Zookeeper总结_第12张图片

3、创建 znode 时设置顺序标识,znode 名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护

4、在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序

3、stat 结构体

  • 1)czxid- 引起这个 znode 创建的 zxid,创建节点的事务的 zxid每次修改 ZooKeeper 状态都会收到一个 zxid 形式的时间戳,也就是 ZooKeeper 事务 ID。
    事务 ID 是 ZooKeeper 中所有修改总的次序。每个修改都有唯一的 zxid,如果 zxid1 小于 zxid2,那么 zxid1 在 zxid2 之前发生。
  • 2)ctime - znode 被创建的毫秒数(从 1970 年开始)
  • 3)mzxid - znode 最后更新的 zxid
  • 4)mtime - znode 最后修改的毫秒数(从 1970 年开始)
  • 5)pZxid-znode 最后更新的子节点 zxid
  • 6)cversion - znode 子节点变化号,znode 子节点修改次数
  • 7)dataversion - znode 数据变化号
  • 8)aclVersion - znode 访问控制列表的变化号
  • 9)ephemeralOwner- 如果是临时节点,这个是 znode 拥有者的 session id。如果不是临时节点则是 0。
  • 10)dataLength- znode 的数据长度
  • 11)numChildren - znode 子节点数量

4、监听器原理

Zookeeper总结_第13张图片

4.1、监听原理详解

  1. 首先要有一个 main()线程
  2. 在 main 线程中创建 Zookeeper 客户端,这时就会创建两个线程,一个负责网络连接通信(connet),一个负责监听(listener)。
  3. 通过 connect 线程将注册的监听事件发送给 Zookeeper。
  4. 在 Zookeeper 的注册监听器列表中将注册的监听事件添加到列表中。
  5. Zookeeper 监听到有数据或路径变化,就会将这个消息发送给 listener 线程。
  6. listener 线程内部调用了 process()方法。

4.2、常见的监听

  1. 监听节点数据的变化:get path [watch](过时);get -s -w path(推荐)
  2. 监听子节点增减的变化:ls path [watch](过时);ls -w path(推荐)

5、写数据流程

Zookeeper总结_第14张图片
ZooKeeper 的写数据流程主要分为以下几步:

  1. 比如 Client 向 ZooKeeper 的 Server1 上写数据,发送一个写请求。
  2. 如果 Server1 不是 Leader,那么 Server1 会把接受到的请求进一步转发给 Leader,因为每个 ZooKeeper 的 Server 里面有一个是 Leader。这个 Leader 会将写请求广播给各个Server,比如 Server1 和 Server2, 各个 Server 写成功后就会通知 Leader。
  3. 当 Leader 收到大多数 Server 数据写成功了,那么就说明数据写成功了。如果这里三个节点的话,只要有两个节点数据写成功了,那么就认为数据写成功了。写成功之后,Leader 会告诉 Server1 数据写成功了。
  4. Server1 会进一步通知 Client 数据写成功了,这时就认为整个写操作成功。ZooKeeper整个写数据流程就是这样的。

四、Zookeeper分布式安装部署

1、集群规划

在 biubiubiu01、biubiubiu02和 biubiubiu03三个节点上部署 Zookeeper。

首先只在biubiubiu01上部署,完毕后,分发到biubiubiu02、biubiubiu03。

2、解压安装

# 操作biubiubiu01
# 上传zookeeper文件
[hadoop01@biubiubiu01 software]$ rz
# 解压到model下
[hadoop01@biubiubiu01 software]$ tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C ../model
# 重命名
[hadoop01@biubiubiu01 model]$ mv apache-zookeeper-3.5.7-bin.tar.gz zookeeper-3.5.7
# 创建文件夹data
[hadoop01@biubiubiu01 zookeeper-3.5.7]$ mkdir data

3、配置 zoo.cfg 文件

# 复制/opt/model/zookeeper-3.5.7/conf 这个目录下的 zoo_sample.cfg 为 zoo.cfg
[hadoop01@biubiubiu01 conf]$ cp zoo_sample.cfg zoo.cfg 
# 修改zoo.cfg
[hadoop01@biubiubiu01 conf]$ vi zoo.cfg 
dataDir=/opt/model/zookeeper-3.5.7/data
# zookeeper集群配置
server.1=biubiubiu01:2888:3888
server.2=biubiubiu02:2888:3888
server.3=biubiubiu03:2888:3888

Zookeeper总结_第15张图片
配置参数解读:
Server.A=B:C:D。

  • A 是一个数字,表示这个是第几号服务器;
  • B 是这个服务器的 ip 地址;
  • C 是这个服务器与集群中的 Leader 服务器交换信息的端口;
  • D 是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。

集群模式下配置一个文件 myid,这个文件在 data目录下,这个文件里面有一个数据就是 A 的值,Zookeeper 启动时读取此文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是哪个 server。

4、集群操作

# 在data下创建myid文件并添加数据1(重要!数据可以随便写,
# 但是必须与文件中添加的server对应的编号:如1相同,必须有序123、246...)
[hadoop01@biubiubiu01 data]$ vi myid
1

# 将biubiubiu01配置好的zookeeper下发到biubiubiu02、biubiubiu03
[hadoop01@biubiubiu01 model]$ scp -r zookeeper-3.5.7/ biubiubiu02:/opt/model
[hadoop01@biubiubiu01 model]$ scp -r zookeeper-3.5.7/ biubiubiu03:/opt/model
# 注意:必须分别修改 myid 文件中内容为 2、3
# 启动前,可以分别配置一下环境变量,方便使用。
# 不要忘了source

Zookeeper总结_第16张图片

5、启动zookeeper集群

# 分别启动zookeeper
[hadoop01@biubiubiu01 model]$ zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/model/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

[hadoop01@biubiubiu02 data]$ zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/model/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

[hadoop01@biubiubiu03 data]$ zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/model/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

# 分别jsp
[hadoop01@biubiubiu01 model]$ jps
3361 Jps
3318 QuorumPeerMain

6、查看状态

# 查看状态:谁是leader,谁是follower
[hadoop01@biubiubiu01 model]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/model/zookeeper-3.5.7/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower

[hadoop01@biubiubiu02 data]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/model/zookeeper-3.5.7/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leader

[hadoop01@biubiubiu03 data]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/model/zookeeper-3.5.7/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower

五、客户端命令行操作

详细了解参数,见上边 stat 结构体。

命令基本语法 功能描述
help 显示所有操作命令
ls [-w] path 使用 ls 命令来查看当前路径下所有子节点[-w:监听]
ls2 path [watch] (旧)
== ls -s -w path(新)
查看当前节点数据并能看到更新次数等数据[-w监听]
create [-s] [-e] path data 普通创建:-s 顺序节点;-e 临时节点;path 路径;data 数据
get path [watch] (旧)
==get -s -w path (新)
获得节点的数据值[-w监听节点数据的变化]
set path data 设置节点的具体值
stat path 查看节点状态
delete path [version] 删除指定路径节点,若有子节点,必须先删子节点
rmr path(旧)==deleteall path 递归删除

1、stat获取指定节点的状态信息 status

Zookeeper总结_第17张图片

2、Is某节点下的所有子节点

在这里插入图片描述

3、Is2是Is和stat两个命令的结合

Zookeeper总结_第18张图片

4、create新建节点

Zookeeper总结_第19张图片

5、修改节点上的数据内容

Zookeeper总结_第20张图片

6、删除节点

Zookeeper总结_第21张图片

7、deleteall递归删除节点

在这里插入图片描述

8、Znode节点的ACL权限

传统的linux文件操作:文件操作的命令+权限命令(chmod、chown)
zookeeper的权限操作(ACL:access  control   list):
1)节点能进行什么操作:create、read、write、delete(前4个是对当前节点) 、admin(子节点)
2)身份的认证(4种方式):
	wor1d:默认方式,相当于全世界都能访问
	auth:代表已经认证通过的用户
	digest:即用户名:密码这种方式认证
	ip:使用Ip地址认证

查看某个节点的数据信息:    get   path
查看某个节点的权限信息:  getAcl  path

基于auth的方式授权:2步
1)创建用户
     addauth  digest   用户名:密码
2)给对应的path赋权限:
	 setAcl  路径   auth:用户名:密码:crdwa

基于ip:setAcl /node03 ip: 127.0.0.1:cdrwa,192.168.159.191:cr,192.168.159.192:rw

Zookeeper总结_第22张图片
Zookeeper总结_第23张图片

六、Zookeeper API应用

1、引入依赖

    
        
            junit</groupId>
            junit</artifactId>
            4.11</version>
            test</scope>
        </dependency>
        
            org.apache.logging.log4j</groupId>
            log4j-core</artifactId>
            2.12.1</version>
        </dependency>
        
            org.apache.zookeeper</groupId>
            zookeeper</artifactId>
            3.5.7</version>
        </dependency>

    </dependencies>

2、代码测试

package com.biubiubiu;

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;

import java.util.List;

public class TestZookeeper {
    public static void main(String[] args) throws Exception {
        //1)创建ZookeeperClient
        //sessionTimeout容忍时间,如果超过这个时间没有连接到zk集群,则会报异常,可以根据机器配置适当延长时间。
        ZooKeeper zkClient = new ZooKeeper("192.168.153.231:2181,192.168.153.232:2181,192.168.153.233:2181", 5000, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                //根据实际情况
                System.out.println("执行watcher:" + event.getType() + ",path:" + event.getPath() + ",stat:" + event.getState().toString());
            }
        });
        //2)执行操作
        //2.1)测试查看节点是否存在   //znode01
//        Stat stat = zkClient.exists("/znode01", false);
//        if (stat == null) {
//            System.out.println("znode01节点不存在");
//        } else {
//            System.out.println("znode01节点存在");
//        }

        //2.2)创建节点
//        zkClient.create("/znode01", "hello".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
//        System.out.println("创建znode01成功");
//
        //2.3)查看子列表: ls /
//        List nodes = zkClient.getChildren("/", false);
//        for (String node : nodes) {
//            System.out.println(node);
//        }

        //2.4)查看某节点的数据
//        byte [] data=zkClient.getData("/znode01",true,null);//null是数据的最新版本
//        System.out.println("修改之前的数据是:"+new String(data));
//
//        //进行修改数据
//        zkClient.setData("/znode01","newDatadata".getBytes(),-1);
//
//
//        byte [] data2=zkClient.getData("/znode01",true,null);//null是数据的最新版本
//        System.out.println("修改之后的数据是:"+new String(data2));


        //删除节点
        zkClient.delete("/znode01", -1);
        System.out.println("删除成功!");


        zkClient.close();
    }
}

觉得有帮助的,请多多支持博主,点赞关注哦~

你可能感兴趣的:(大数据BigData)