什么是ZooKeeper(一)(通俗易懂)

以前在做别的项目时用过zk,但没有过多深入的学习,本着通俗易懂、简单方便学习成本低的方式,建议大家耐心看完,如果文章中有不清楚的地方,可发私信进步探讨!

学习zk共分为二部分,第一部分主要以理论为主。讲解架构原理、数据结构等。 第二部分主要以操作为主。集群的搭建、API的操作,zk负载均衡、分布式锁的实现

本篇读完预计6分钟

一.Zookeeper 简介

1.简介(重点)

  zooKeeper是Hadoop的开源子项目(Google Chubby的开源实现),它是一个针对大型分布式系统的可靠协调系统。

提供的功能包括:统一命名服务、配置管理、分布式锁、集群节点状态协调(负载均衡/主从协调)

    统一命名服务:在zk上注册多个临时服务A,当有某个服务A出现故障时,会自动从zk中删除,停止对外提供服务,

    配置管理:当有配置文件发生变化时,可以通过设置事件监听的方式,通知client端进行配置的更新

    分布式锁:当多个应用服务同时访问1个共享资源时,应用服务应向zk注册自己临时有序的节点信息,当有client要访问共享资源时,先获取所有的应用服务注册信息,然后规定算法(例最小),让client端与自己的信息匹配时区取锁进行访问,访问结束时释放锁,重新注册,以便下次访问。

  集群的负载均衡:应用服务启动时向zk注册本机节点的配置信息,并在节点设置计数器,当有client连接时+1,断开时-1,每次当有client连接时会获取计数器最小的客户端进行访问

  其实zk本身并不能提供以上的服务协调,它只能帮我们在节点上存储一些简单的数据,当这些数据发生变化的时候通过异步的方式通知我们,我们再根据这些数据的状态进行相应的处理,其实现模式类似于观察者模式。

  zk本质的功能是:1.替客户端保管数据  2.为客户提供数据的监听服务

二.zookeeper 的数据模型

  其实zk中的节点上维护的数据模型,类似于我们windows 操作系统中盘符的路径:C:/Program Files/java ,只不过这种路径的节点可以存储数据,还具有原子性等一些特点。

  zk本身维护了一个基于内存的数据库,用来存储节点的数据信息,并且读的速度要比写的速度更快,这个数据结构是以树状的结构将数据进行存储的。

 1 数据模型 

  zookeeper 提供一种类似目录树结构的数据模型,每个节点(znode)具有唯一的路径标识,而路径是由斜线分隔开的路径名序列组成,和标准的文件系统非常类似,例

    

.znode 节点(重点)

  每一个节点称为znode,通过路径来访问

  每一个znode维护着:数据、stat数据结构(ACL、时间戳及版本号)

  znode维护的数据主要是用于存储协调的数据,如状态、配置、位置等信息,每个节点存储的数据量很小,KB级别

  znode的数据更新后,版本号等控制信息也会更新(增加)

  znode还具有原子性操作的特点:写--全部替换,读--全部(每个 znode 的数据将被原子性地读写,读操作会读取与 znode相关的所有数据,写操作会一次性替换所有数据.)

  znode有永久节点和临时节点之分:临时节点指创建它的session一结束,该节点即被zookeeper删除;(非常重要)

  另:zookeeper 并没有被设计为常规的数据库或者大数据存储, 相反的是,它用来管理调度数据,比如分布式应用中的配置文件信息、状态信息、汇集位置等等。这些数据的共同特性就是它们都是很小的数据,通常以 KB 为大小单位。 zooKeeper 的服务器和客户端都被设计为严格检查并限制每个 znode 的数据大小至多 1M。

.znode 节点的4种类型(重点)

  PERSISTENT:永久节点

  EPHEMERAL:临时节点

  PERSISTENT_SEQUENTIAL:永久节点、序列化

  EPHEMERAL_SEQUENTIAL:临时节点、序列化

二.Zookeeper 的架构和原理

  1 .服务器中的角色定义

    启动 zookeeper 服务器集群环境后,多个 Zookeeper 服务器在工作前会选举出一个 Leader。选举出 leader 前,所有 server 不区分角色,都需要平等参与投票(observer 除外,不参与投票);选主过程完成后,存在以下几种角色:

    leader   :  领导者,可以接受 client 请求,也接收其他 server 转发的写请求,负责更新系统状态。

    follower  : 可以接收 client 请求,如果是写请求将转发给 leader 来更新系统状态。

    observer 同 follower,唯一区别就是不参与选主过程。

  2.系统架构(了解)

    

    zookeeper 分为服务器端(server)和客户端(client),客户端可以连接到整个 zooKeeper服务所提供的任意zk服务器上,访问过程是当有客户端(client)访问服务端(leader服务器)时,leader服务器返回1个可访问的地址给客户端,然后客户端通过这个地址访问到zk服务器(follower)上。客户端使用并维护一个 TCP 连接,通过这个连接发送请求、接受响应、获取观察的事件以及发送心跳。如果这个 TCP 连接中断,客户端将自动尝试连接到另外的 zooKeeper 服务器。客户端第一次连接到 zooKeeper 服务时,接受这个连接的 zooKeeper 服务器会为这个客户端建立一个会话。当这个客户端连接到另外的服务器时,这个会话会被新的服务器重新建立。

  3.Session 机制原理(了解)

    在client 连接 server 成功后, server 赋予该 client 一个 sessionid,client 需要不断发送心跳维持 session 有效,在 session 有效期内,可以使用 Zookeeper 提供的 API 进行操作。如果因为某些原因导致 client 无法正常发送心跳,在超时时长后, server会判断该 client 的 session 失效,此时 client 发送的任何操作都会被拒绝,并触发ExpiredException (失效异常),此时 KeeperState 处于 Expired 状态。

  但 client 有自动重连 server 的机制, 如果 client 的心跳无法正常连接 server,会在 session 超时前尝试连接其他 server,连接成功后可以继续操作。 如果 client 取消当前连接并连接其他 server,已存在的 watches 会丢失,取而代之的是client 会生成一个特殊 WatchEvent 告诉本地 watcher 连接已经丢失,该 WatchEvent 是:EventType.None, KeeperState.DisConnected。 本地 watcher 接收到该 WatchEvent 后会怎样?

.Watcher 监听事件(重点)

  zk对Node节点的增、删、改、查都可触发监听

  Watch事件是一次性触发器,只有被Watch 监听的数据发生变化时才被触发,通过异步的方式通知该client端(观察者)。

  Watch是一次性触发的并且在获取Watch事件和设置新watch事件之间有延迟所以不能可靠的观察到节点的每一次变化,但这个变化是毫秒级的,基本上不影响

 客户端监视一个节点,总是先获取Watch事件,再发现节点的数据变化,Watch事件的顺序对应于zk服务所见的数据更新的顺序。

 如果你还不是很清楚,看第二部分API操作

  ----------------------------------------------------------------------

  创建监听的三个地方:

    判断该节点是否存在时 : exits(path,watcher);

    监听的事件是:该节点是否存在/删除/数据是否发生改变

    获取某节点的子节点时 : getChild(pathc,watcher);

    监听的事件是:该节点下是否有子节点创建/删除

    获取该节点的数据时  : getData(pathc,watcher);

    监听的事件是:该节点下的数据发生改变时

原文地址:https://www.cnblogs.com/MrRightZhao/p/10440995.html

时间: 2024-09-20 20:43:43

什么是ZooKeeper(一)(通俗易懂)的相关文章

ZooKeeper的API操作(二)(通俗易懂)

所需要6个jar包,都是解压zookeeper的tar包后里面的. zookeeper-3.4.10.jar    jline-0.094.jar    log4j-1.2.16.jar netty-3.10.5.jar    slf4j-api-1.6.1.jar  slf4j-log4j12-1.6.1.jar 1.建立连接 /** * connectString : zk服务器连接ip和端口,多个用逗号隔开 * sessionTimeout : 连接超时时间 * watcher : 监听器

zookeeper 只能本地访问的问题解决方法

当完成了zookeeper配置,发现只能在本地访问,不能在其他机器上指定通过hostname访问访问,原因是在/etc/hosts里面有这样的配置 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 10-149-11-146 原因是zookeeper监听hostname10-149-11-146,结果被/etc/hosts转换成了127.0.0.1, 因此只能接受本地访问. 解决这个问题的方法

读取zookeeper保存的topic元数据

读取zookeeper保存的topic元数据 Table of Contents 1. 有以下问题 2. 解决方法 3. 代码 3.1. KafkaHelper类 3.2. main.cc完整代码 1 有以下问题 需要使用producer才能获得元数据 当producer和consumer共用一些对象时会出现无法读取数据的问题 2 解决方法 用独立的类封装获取元数据的代码,避免共用变量 3 代码 3.1 KafkaHelper类 #ifndef KAFKA_HELPER_H_ #define K

全网最通俗易懂的Kafka入门!

摘自:https://www.cnblogs.com/Java3y/p/11982381.html 前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 在这篇之前已经写过两篇基础文章了,强烈建议先去阅读: 什么是ZooKeeper? 什么是消息队列? 众所周知,消息队列的产品有好几种,这里我选择学习Kafka的原因,无他,公司在用. 我司使用的是Kafka和自研的消息队列(Kafka和RocketMQ

【转帖】全网最通俗易懂的Kafka入门

全网最通俗易懂的Kafka入门 http://www.itpub.net/2019/12/04/4597/ 前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 众所周知,消息队列的产品有好几种,这里我选择学习Kafka的原因,无他,公司在用. 我司使用的是Kafka和自研的消息队列(Kafka和RocketMQ)改版,于是我就想学学Kafka这款消息队列啦.本篇文章对Kafka入门,希望对大家有所帮助

Spring Cloud ZooKeeper集成Feign的坑2,服务调用了一次后第二次调用就变成了500,错误:Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.n

错误如下: 2017-09-19 15:05:24.659 INFO 9986 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.spring[email protected]56528192: startup date [Tue Sep 19 15:05:24 CST 2017]; root of context hierarchy 2017-09-19 15:05:24.858 INFO 9986 --

浅谈分布式服务协调技术 Zookeeper

Google的三篇论文影响了很多很多人,也影响了很多很多系统.这三篇论文一直是分布式领域传阅的经典.根据MapReduce,于是我们有了Hadoop:根据GFS,于是我们有了HDFS:根据BigTable,于是我们有了HBase.而在这三篇论文里都提及Google的一个Lock Service -- Chubby,哦,于是我们有了Zookeeper. 随着大数据的火热,Hxx们已经变得耳熟能详,现在作为一个开发人员如果都不知道这几个名词出门都好像不好意思跟人打招呼.但实际上对我们这些非大数据开发

zookeeper原理(转)

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等.Zookeeper是hadoop的一个子项目,其发展历程无需赘述.在分布式应用中,由于工程师不能很好地使用锁机制,以及基于消息的协调机制不适合在某些应用中使用,因此需要有一种可靠的.可扩展的.分布式的.可配置的协调机制来统一系统的状态.Zookeeper的目的就在于此.本文简单分析zookeeper的工作原理,对于如何使用zookeeper不是本

zookeeper集群部署手册

一.  准备 1.  硬件 三台装好RHEL6.7_x64的x86服务器,机器名如下 zookeeper01 zookeeper02 zookeeper03 2.  软件 jdk-7u80-linux-x64.rpm zookeeper-3.4.8.tar.gz 二.  安装JDK(root用户执行) 1.  拷贝jdk-7u80-linux-x64.rpm到/data01/software/jdk 2.  用root登录 3.  执行以下命令 cd /data01/software/jdk r