最全最详细的Zookeeper学习总结

Zookeeper简介

分布式系统定义及⾯临的问题

Zookeeper最为主要的使用场景是作为分布式系统的分布式协同服务 。

我们将分布式系统定义为:分布式系统是同时跨越多个物理主机,独立运行的多个软件所组成系统。

分布式系统的协调工作就是通过某种方式,让每个节点的信息能够同步和共享。这依赖于服务进程之间的通信。通信方式有两种:

  • 通过网络进行信息共享
    这就像现实中,开发leader在会上把任务传达下去,组员通过听leader命令或者看leader的邮件知道自己要干什么。当任务分配有变化时,leader会单独告诉组员,或者再次召开会议。信息通过人与人之间的直接沟通,完成传递。
  • 通过共享存储
    这就好比开发eader按照约定的时间和路径,把任务分配表放到了svn 上,组员每天去svn 上拉取最新的任务分配表,然后干活。其中svn就是共享存储。更好一点的做法是, 当svn文件版本更新时,触发邮件通知,每个组员再去拉取最新的任务分配表。文样做更好,因为每次更新,组员都能第一时间得到消息,从而让自己手中的任务分配表永远是最新的。此种方式依赖于中央存储。整个过程如下图所示∶
    在这里插入图片描述

Zookeeper如何解决分布式系统面临的问题

ZooKeeper对分布式系统的协调,使用的是第二种方式,共享存储。其实共享存储,分布式应用也需要和存储进行网络通信。
实际上,通过ZooKeeper实现分布式协同的原理,和项目组通过SVN同步工作任务的例子是一样的。ZooKeeper就像是SVN。存储了任务的分配、完成情况等共享信息。每个分布式应用的节点就是组员. 订阅这些共享信息。当主节点(组leader),对某个从节点的分工信息作出改变时,相关订阅的从节点得到|zookeeper的通知,取得自口最新的任务分配。完成工作后。把完成情况存储到lzookeeper。主节点订阅了该任务的完成情况信息。所以将得到zookeeper的完工的通知。参考下图,是不是和前面项目组通过svn分配工作的例子一模一样? 仅仅是把svn和邮件系统合二为一,以ZooKeeper代替
在这里插入图片描述
注∶Slave节点要想获取ZooKeeper的更新通知,需事先在关心的数据节点上设置观察点。

大多数分布式系统中出现的问题,都源于信息的共享出了问题。如果各个节点间信息不能及时共享和同步,那么就会在协作过程中产生各种问题。ZooKeeper解决协同问题的关键,就是在于保证分布式系统信息的一致性。

ZooKeeper的基本概念

Zookeeper是一个开源的分布式协调服务,其设计目标是将那些复杂的且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一些简单的接口提供给用户使用。zookeeper是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据订阅/发布、负载均衡、命名服务、集群管理、分布式锁和分布式队列等功能

基本概念

  • 集群角色
    通常在分布式系统中,构成一个集群的每一台机器都有自己的角色,最典型的集群就是Master/Slave模式(主备模式),此情况下把所有能够处理写操作的机器称为Master机器,把所有通过异步复制方式获取最新数据,并提供读服务的机器为Slave机器。

    而在Zookeeper中,这些概念被颠覆了。它没有沿用传递的Master/Slave概念,而是引入了Leader、Follower、Observer三种角色。Zookeeper集群中的所有机器通过Leader选举来选定一台被称为Leader的机器,Leader服务器为客户端提供读和写服务,除Leader外,其他机器包括Follower和Observer,Follower和Observer都能提供读服务,唯一的区别在于Observer不参与Leader选举过程,不参与写操作的过半写成功策略,因此Observer可以在不影响写性能的情况下提升集群的性能。

  • 会话(session)
    Session指客户端会话,一个客户端连接是指客户端和服务端之间的一个TCP长连接,Zookeeper对外的服务端口默认为2181,客户端启动的时候,首先会与服务器建立一个TCP连接,从第一次连接建立开始,客户端会话的生命周期也开始了,通过这个连接,客户端能够心跳检测与服务器保持有效的会话,也能够向Zookeeper服务器发送请求并接受响应,同时还能够通过该连接接受来自服务器的Watch事件通知。

  • 数据节点(Znode)
    在谈到分布式的时候,我们通常说的"节点"是指组成集群的每一台机器。然而,在ZooKeeper中,"节点"分为两类,
    第一类同样是指构成集群的机器,我们称之为机器节点;
    第二类则是指数据模型中的数据单元,我们称之为数据节点一ZNode。
    ZooKeeper将所有数据存储在内存中,数据模型是一棵树(ZNode Tree),由斜杠(/)进行分割的路径,就是一个Znode,例如/app/path1。每个ZNode上都会保存自己的数据内容,同时还会保存一系列属性信息。

  • 版本
    刚刚我们提到,Zookeeper的每个Znode上都会存储数据,对于每个ZNode,Zookeeper都会为其维护一个叫作Stat的数据结构,Stat记录了这个ZNode的三个数据版本,分别是version (当前ZNode的版本)、cversion(当前ZNode子节点的版本)、aversion(当前ZNode的ACL版本)。

  • Watcher(事件监听器)
    Wathcer(事件监听器),是Zookeeper中一个很重要的特性,Zookeeper允许用户在指定节点上注册一些Watcher,并且在一些特定事件触发的时候,Zookeeper服务端会将事件通知到感兴趣的客户端,该机制是Zookeeper实现分布式协调服务的重要特性

  • ACL
    Zookeeper采用ACL(Access Control Lists)策略来进行权限控制,其定义了如下五种权限∶

    • CREATE∶创建子节点的权限。
    • READ∶获取节点数据和子节点列表的权限。
    • WRITE∶更新节点数据的权限。
    • DELETE∶删除子节点的权限。
    • ADMIN∶设置节点ACL的权限。
      其中需要注意的是,CREATE和DELETE这两种权限都是针对子节点的权限控制

Zookeeper环境搭建

Zookeeper的搭建方式

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

  • 单机模式∶Zookeeper只运行在一台服务器上,适合测试环境;
  • 集群模式∶Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个"集合体"
  • 伪集群模式∶就是在一台服务器上运行多个Zookeeper实例;
单机模式搭建∶

Zookeeper安装以linux环境为例∶

  1. 下载
    首先我们下载稳定版本的zookeeper, http://zookeeper.apache.org/releases.html

  2. 上传
    下载完成后,将zookeeper压缩包zookeeper-3.4.14.tar.gz上传到inux系统

  3. 解压缩压缩包

    tar -zxVf zookeeper-3.4.14.tar.gZ
    
  4. 进入 zookeeper-3.4.14目录,创建 data文件夹

    cd zookeeper-3.4.14 mkdir data
    
  5. 修改配置文件名称

    cd conf
    mv zoo_sample.cfg zoo.cfg
    
  6. 修改zoo.cfg中的data属性

    dataDir=/root/zookeeper-3.4.14/data
    
  7. zookeeper服务启动
    进入bin目录,启动服务,输入命令。

    ./zkServer.sh start
    

    输出以下内容标识启动成功
    在这里插入图片描述
    关闭服务输入命令

    ./zkServer.sh stop
    

    输出以下提示信息
    在这里插入图片描述
    查看状态

    ./zkServer.sh status
    

    如果启动状态,提示
    在这里插入图片描述
    如果未启动状态,提示∶
    在这里插入图片描述

伪集群模式∶

Zookeeper不但可以在单机上运行单机模式Zookeeper,而且可以在单机模拟集群模式 Zookeeper的运行,也就是将不同实例运行在同一台机器,用端口进行区分,伪集群模式为我们体验Zookeeper和做一些尝试性的实验提供了很大的便利。比如,我们在测试的时候,可以先使用少量数据在伪集群模式下进行测试。当测试可行的时候,再将数据移植到集群模式进行真实的数据实验。这样不但保证了它的可行性,同时大大提高了实验的效率。这种搭建方式,比较简便,成本比较低。适合测试和学习

注意事项∶
一台机器上部署了3个server,,也就是说单台机器及上运行多个Zookeeper实例。这种情况下,必须保证每个配置文档的各个端口号不能冲突,除clientPort不同之外,dataDir也不同。另外,还要在dataDir所对应的目录中创建myid文件来指定对应的Zookeeper服务器实例

  • clientPort端口∶
    如果在1台机器上部署多个server,那么每台机器都要不同的 clientPort,比如 server1是2181,server2 是2182,server3是2183
  • dataDir和dataLogDir∶
    dataDir和dataLogDir也需要区分下,将数据文件和日志文件分开存放,同时每个server的这两变量所对应的路径都是不同的
  • server.X和myid∶
    server.X这个数字就是对应,data/myid中的数字。在3个server的myid文件中分别写入了1,2,3,那么每个server中的z00.cfg都配 server.1 server.2.server.3就行了。因为在同一台机器上,后面连着的2 个端口,3个server都不要一样,否则端口冲突。

开始搭建伪集群

  1. 下载
    首先我们下载最新稳定版本的zookeeper

  2. 上传
    下载完成后,将zookeeper压缩包 zookeeper-3.4.14.tar.gz上传到linux系统

  3. 解压 压缩包
    创建目录zkcluster

    mkdir zkcluster
    
  4. 解压 zookeeper-3.4.14.tar.gz到zkcluster目录下

    tar -zxvf zookeeper-3.4.14.tar.gz -C /zkcluster
    
  5. 改变名称

    mv zookeeper-3.4.14 zookeeper01
    
  6. 复制并改名

    cp -r zookeeper01/ zookeeper02 
    cp -r zookeeper01/ zookeeper03
    
  7. 分别在zookeeper01、zookeeper02、zookeeper03目录下创建data及logs目录

    mkdir data 
    cd data 
    mkdir logs
    
  8. 修改配置文件名称

    cd conf
    mv zoO_sample.cfg zoo.cfg
    
  9. 配置每一个Zookeeper 的dataDir(zo0.cfg)clientPort分别为218121822183

    clientPort=2181
    dataDir=/zkcluster/zookeeper01/data
    dataLogDir=/zkcluster/zookeeper01/data/logs
    
    clientPort=2182
    dataDir=/zkcluster/zookeeper02/data
    dataLogDir=/zkcluster/zookeeper02/data/logs
    
    clientPort=2183
    dataDir=/zkcluster/zookeeper03/data
    dataLogDir=/zkcluster/zookeeper03/data/logs
    
  10. 配置集群

    • 在每个zookeeper的 data 目录下创建一个myid 文件,内容分别是1、2、3。这个文件就是记录每个服务器的ID

      touch myid
      
    • 在每一个z0okeeper 的 zoo.cfg配置客户端访问端口(clientPort)和集群服务器IP列表。

    server.1=10.211.55.4:2881:3881 
    server.2=10.211.55.4:2882:3882 
    server.3=10.211.55.4:2883:3883
    #server.服务器ID=服务器IP地址∶服务器之间通信端口∶服务器之间投票选举端口
    
  11. 启动集群
    依次启动三个zk实例

Zookeeper基本使用

ZooKeeper系统模型

ZooKeeper数据模型Znode
在ZooKeeper中,数据信息被保存在一个个数据节点上,这些节点被称为znode。ZNode 是
ZooKeeper 中最小数据单位,在 ZNode下面又可以再挂ZNode,这样一层层下去就形成了一个层次化命名空间 ZNode 树,我们称为 ZNode Tree,它采用了类似文件系统的层级树状结构进行管理。见下图示例
在这里插入图片描述
在 Zookeeper中,每一个数据节点都是一个 ZNode,上图根目录下有两个节点,分别是∶ app1和app2,其中 app1 下面又有三个子节点,所有ZNode按层次化进行组织,形成这么一颗树,ZNode的节点路径标识方式和Unix文件系统路径非常相似,都是由一系列使用斜杠(/)进行分割的路径表示,开发人员可以向这个节点写入数据,也可以在这个节点下面创建子节点。

ZNode 的类型

Zookeeper的znode tree是由一系列数据节点组成的,那接下来,我们就对数据节点做详细讲解
Zookeeper 节点类型可以分为三大类∶

  • 持久性节点(Persistent)
  • 临时性节点(Ephemeral)
  • 顺序性节点(Sequential)

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

  • 持久节点∶
    是Zookeeper中最常见的一种节点类型,所谓持久节点,就是指节点被创建后会一直存在服务器,直到删除操作主动清除
  • 持久顺序节点∶
    就是有顺序的持久节点,节点特性和持久节点是一样的.只是额外特性表现在顺序上。顺序特性实质是在创建节点的时候,会在节点名后面加上一个数字后缀,来表示其顺序。
  • 临时节点∶
    就是会被自动清理掉的节点.它的生命周期和客户端会话绑在一起.客户端会话结束、节点会被删除掉。与持久性节点不同的是,临时节点不能创建子节点。
  • 临时顺序节点∶
    就是有顺序的临时节点,和持久顺序节点相同,在其创建的时候会在名字后面加上数字后缀

事务ID
事务是对物理和抽象的应用状态上的操作集合。狭义上的事务通常指的是数据库事务,一般包含了一系列对数据库有序的读写操作,这些数据库事务具有所谓的ACID特性,即原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。

而在ZooKeeper中,事务是指能够改变ZooKeeper服务器状态的操作,我们也称之为事务操作或更新操作,一般包括数据节点创建与删除、数据节点内容更新等操作。对于每一个事务请求,ZooKeeper都会为其分配一个全局唯一的事务ID,用 ZXID来表示,通常是一个64位的数字。每一个ZXID 对应一次更新操作,从这些ZXID中可以间接地识别出ZooKeeper处理这些更新操作请求的全局顺序

ZNode 的状态信息

在这里插入图片描述
整个ZNode 节点内容包括两部分∶节点数据内容和节点状态信息。图中quota 是数据内容,其他的属于状态信息。那么这些状态信息都有什么含义呢?
cZxid 就是Create zZXID,表示节点被创建时的事务ID。ctime 就是 Create Time,表示节点创建时间。

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

Zookeeper使用Watcher机制实现分布式数据的发布/订阅功能

一个典型的发布/订阅模型系统定义了一种 一对多的订阅关系,能够让多个订阅者同时监听某一个主题对象,当这个主题对象自身状态变化时,会通知所有订阅者,使它们能够做出相应的处理。

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

整个Watcher注册与通知过程如图所示。
在这里插入图片描述
Zookeeper的Watcher机制主要包括客户端线程、客户端WatcherManager、Zookeeper服务器三部分。

具体工作流程为∶客户端在向Zookeeper服务器注册的同时,会将Watcher对象存储在客户端的WatcherManager当中。当Zookeeper服务器触发Watcher事件后,会向客户端发送通知,客户端线程从WatcherManager中取出对应的Watcher对象来执行回调逻辑。

ACL保障数据的安全

Zookeeper作为一个分布式协调框架,其内部存储了分布式系统运行时状态的元数据,这些元数据会直接影响基于Zookeeper进行构造的分布式系统的运行状态,因此,如何保障系统中数据的安全,从而避免因误操作所带来的数据随意变更而导致的数据库异常十分重要。在Zookeeper中,提供了一套完善的ACL(Access Control List)权限控制机制来保障数据的安全。

我们可以从三个方面来理解ACL机制∶权限模式(Scheme)、授权对象(ID)、权限(Permission),通常使用"scheme∶ id∶permission"来标识一个有效的ACL信息。

  • 权限模式∶Scheme
    权限模式用来确定权限验证过程中使用的检验策略,有如下四种模式∶

    1. IP
      IP模式就是通过IP地址粒度来进行权限控制,如"ip∶192.168.0.110"表示权限控制针对该IP地址,同时IP模式可以支持按照网段方式进行配置,如"ip∶192.168.0.1/24"表示针对192.168.0.*这个网段进行权限控制。
    2. Digest
      Digest是最常用的权限控制模式,要更符合我们对权限控制的认识.其使
      用"username∶password"形式的权限标识来进行权限配置,便于区分不同应用来进行权限控制。当我们通过"username∶password"形式配置了权限标识后,Zookeeper会先后对其进行SHA-1加密和BASE64编码。
    3. World
      World是一种最开放的权限控制模式,这种权限控制方式几乎没有任何作用,数据节点的访问权限对所有用户开放,即所有用户都可以在不进行任何权限校验的情况下操作ZooKeeper上的数据。另外,World模式也可以看作是一种特殊的Digest模式,它只有一个权限标识,即"world∶anyone"。
    4. Super
      Super模式,顾名思义就是超级用户的意思,也是一种特殊的Digest模式。在Super模式下,超级用户可以对任意ZooKeeper上的数据节点进行任何操作。
  • 授权对象∶ID
    授权对象指的是权限赋予的用户或一个指定实体,例如IP地址或是机器等。在不同的权限模式下,授权对象是不同的,表中列出了各个权限模式和授权对象之间的对应关系。

    权限模式 授权对象
    IP 通常是一个IP地址或IP段∶例如∶192.168.10.110或192.168.10.1/24
    Digest 自定义,通常是username∶BASE64(SHA-1username∶password)例如∶zm:sdfndslIndlksfn7c=
    Digest 只有一个ID∶ anyone
    Super 超级用户
  • 权限
    权限就是指那些通过权限检查后可以被允许执行的操作。在ZooKeeper中,所有对数据的操作权限分为以下五大类∶

    1. CREATE((C)∶数据节点的创建权限,允许授权对象在该数据节点下创建子节点。
    2. DELETE(D)∶子节点的删除权限,允许授权对象删除该数据节点的子节点。
    3. READ(R)数据节点的读取权限,允许授权对象访问该数据节点并读取其数据内容或子节点列表等。
    4. WRITE(W)∶数据节点的更新权限,允许授权对象对该数据节点进行更新操作。
    5. ADMIN(A)∶ 数据节点的管理权限,允许授权对象对该数据节点进行 ACL 相关的设置操作。

ZooKeeper命令行操作

现在已经搭建起了一个能够正常运行的zookeeper服务了,所以接下来,就是来借助客户端来对zookeeper的数据节点进行操作

首先,进入到zookeeper的bin目录之后

通过zkClient进入zookeeper客户端命令行

./zkcli.sh 连接本地的zookeeper服务器
./zkCli.sh -server ip∶port 连接指定的服务器

连接成功之后,系统会输出Zookeeper的相关环境及配置信息等信息。输入help之后,屏幕会输出可用的Zookeeper命令,如下图所示
在这里插入图片描述

创建节点
使用create命令,可以创建一个Zookeeper节点,如

create [-s][-e] path data acl
其中,-s或-e分别指定节点特性,顺序或临时节点,若不指定,则创建持久节点;acl用来进行权限控制。
  1. 创建顺序节点
    使用create-s /zk-test 123命令创建zk-test顺序节点

    Create -s/zk-test 123
    

    在这里插入图片描述
    执行完后,就在根节点下创建了一个叫做/zk-test的节点,该节点内容就是123,同时可以看到创建的zk-test节点后面添加了一串数字以示区别

  2. 创建临时节点
    使用 create-e /zk-temp 123命令创建zk-templ临时节
    在这里插入图片描述
    临时节点在客户端会话结束后,就会自动删除,下面使用quit命令退出客户端
    在这里插入图片描述

    再次使用客户端连接服务端,并使用Is/命令查看根目录下的节点
    在这里插入图片描述
    可以看到根目录下已经不存在zk-temp临时节点了

  3. 创建永久节点
    使用 create /zk-permanent 123命令创建zk-permanent永久节点
    在这里插入图片描述
    可以看到永久节点不同于顺序节点,不会自动在后面添加一串数字

  4. 读取节点
    与读取相关的命令有ls 命令和get 命令

    Is命令可以列出Zookeeper指定节点下的所有子节点.但只能查看指定节点下的第一级的所有子节点;

    1s path
    其中,path表示的是指定数据节点的节点路径
    

    get命令可以获取Zookeeper指定节点的数据内容和属性信息。

    get path
    

    若获取根节点下面的所有子节点,使用ls/命令即可
    在这里插入图片描述
    若想获取/zk-permanent的数据内容和属性,可使用如下命令∶get /zk-permanent
    在这里插入图片描述
    从上面的输出信息中,我们可以看到,第一行是节点/zk-permanent 的数据内容,其他几行则是创建该节点的事务ID(cZxid)、最后一次更新该节点的事务ID(mZxid)和最后一次更新该节点的时间(mtime)等属性信息

  5. 更新节点
    
使用set命令,可以更新指定节点的数据内容,用法如下

    

set path data [ version ]
    

    其中,data就是要更新的新内容,version表示数据版本,在zookeeper中,节点的数据是有版本概念的,这个参数用于指定本次更新操作是基于Znode的哪一个数据版本进行的,如将/zk-permanent节点的数据更新为456,可以使用如下命令∶
    

在这里插入图片描述

    现在dataVersion已经变为1了,表示进行了更新

  6. 删除节点
    
使用delete命令可以删除Zookeeper上的指定节点,用法如下

    delete path [version]
    

    其中version也是表示数据版本,使用delete /zk-permanent 命令即可删除/zk-permanent节点
    在这里插入图片描述
    可以看到,已经成功删除/zk-permanent节点。值得注意的是,若删除节点存在子节点,那么无法删除该节点,必须先删除子节点,再删除父节点

Zookeeper的api使用

Zookeeper作为一个分布式框架,主要用来解决分布式一致性问题,它提供了简单的分布式原语,并且对多种编程语言提供了API,所以接下来重点来看下Zookeeper的java客户端API使用方式
Zookeeper API共包含五个包,分别为∶

  1. org.apache.2ookeeper
  2. org.apache.zookeeper.data
  3. org.apache.zookeeper.server
  4. org.apache.zookeeper.server.quorum
  5. org.apache.zookeeper.server.upgrade
    其中org.apache.z0okeeper,包含Zookeeper类,他是我们编程时最常用的类文件。这个类是Zookeeper客户端的主要类文件。如果要使用Zookeeper服务,应用程序首先必须创建一个Zookeeper 实例,这时就需要使用此类。一旦客户端和Zookeeper服务端建立起了连接,Zookeeper系统将会给本次连接会话分配一个ID值,并且客户端将会周期性的向服务器端发送心跳来维持会话连接。只要连接有效,客户端就可以使用Zookeeper API来做相应处理了。

准备工作∶

  1. 导入依赖

    <dependency>
    	<groupId>org.apache.zookeeper</groupId>
    	<artifactId>zookeeper</artifactId>
    	<version>3.4.14</version>
    </dependency>
    
  2. 建立会话

    public class CreateSession implements Watcher {
         
    	//countDownLatch这个类使⼀个线程等待,主要不让main⽅法结束
    	private static CountDownLatch countDownLatch = new CountDownLatch(1);
    	
    	public static void main(String[] args) throws InterruptedException,IOException {
         
    		/*
    		客户端可以通过创建⼀个zk实例来连接zk服务器
    		new Zookeeper(connectString,sesssionTimeOut,Wather)
    		connectString: 连接地址:IP:端⼝
    		sesssionTimeOut:会话超时时间:单位毫秒
    		Wather:监听器(当特定事件触发监听时,zk会通过watcher通知到客户端)
    		*/
    		ZooKeeper zooKeeper = new ZooKeeper("10.211.55.4:2181", 5000, new CreateSession());
    		System.out.println(zooKeeper.getState());
    		countDownLatch.await();
    		//表示会话真正建⽴
    		System.out.println("=========Client Connected to
    		zookeeper==========");
    	}
    	// 当前类实现了Watcher接⼝,重写了process⽅法,该⽅法负责处理来⾃Zookeeper服务端的 watcher通知,在收到服务端发送过来的SyncConnected事件之后,解除主程序在CountDownLatch上的等待阻塞,⾄此,会话创建完毕
    	public void process(WatchedEvent watchedEvent) {
         
    		//当连接创建了,服务端发送给客户端SyncConnected事件
    		if(watchedEvent.getState() == Event.KeeperState.SyncConnected){
         
    			countDownLatch.countDown();
    		}
     	}
    }
    

注意,ZooKeeper 客户端和服务端会话的建立是一个异步的过程,也就是说在程序中,构造方法会在处理完客户端初始化工作后立即返回,在大多数情况下,此时并没有真正建立好一个可用的会话.在会话的生命周期中处于"CONNECTING"的状态。 当该会话真正创建完毕后ZooKeeper服务端会向会话对应的客户端发送一个事件通知,以告知客户端,客户端只有在获取这个通知之后,才算真正建立了会话。

  1. 创建节点

    public class CreateNote implements Watcher {
         
    	//countDownLatch这个类使⼀个线程等待,主要不让main⽅法结束
    	private static CountDownLatch countDownLatch = new CountDownLatch
  • 15
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论
大数据(Big Data)是指规模庞大、复杂度高且难以用传统数据处理方法进行捕捉、管理和处理的数据集合。它通常具有以下三个特征: 数据量大:大数据指的是数据集的规模非常庞大,远远超出了传统数据处理工具的能力范围。这些数据集可能包含数十亿甚至数万亿的记录。 复杂度高:大数据往往包含多种类型和格式的数据,例如结构化数据(如关系型数据库中的数据)、半结构化数据(如XML文件)和非结构化数据(如文本、图像和音频等)。这些数据的复杂性使得处理和分析变得更加困难。 处理速度快:大数据处理要求在短时间内处理和分析大规模的数据。传统的数据处理方法往往无法满足实时或近实时处理的需求。 大数据的出现主要是由于以下几个因素的影响: 数据的爆发性增长:随着互联网的普及和各种传感器、设备的广泛应用,数据的产生和积累呈现爆发式增长的趋势。 新型数据源的涌现:除了传统的结构化数据,越来越多的非结构化和半结构化数据源涌现,例如社交媒体数据、日志文件、传感器数据、地理位置数据等。 技术的进步:大数据处理的技术工具和技术方法得到了快速发展,例如分布式计算、云计算、并行处理、机器学习和人工智能等技术的应用,使得大数据的存储、管理和分析变得可行和高效。 大数据的处理和分析可以带来许多潜在的好处,包括更深入的洞察力、更准确的决策支持、更精细的个性化服务、更高效的资源利用和创新等。在各个领域,如商业、医疗、金融、交通、科学研究等,大数据正发挥着重要的作用,并为我们带来了新的机遇和挑战。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Captain Leo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值