引用百度百科的话  

  ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

  乍一看,又是啃概念的东西,用通俗的方式来认识Zookeeper。

  先看看我们的12306,前两年,我们会发现,平时使用时基本上没什么问题,但是一到春运,12306就会很卡,网站甚至崩溃,因为流量太大,一台服务器扛不住这么大的压力,毕竟一台服务器的资源是有限的。怎么解决这个问题呢,后人想了很多办法,分布式是其中最有效的一个,既然一台服务器不够,那就两台,三台,甚至更多,这样多个服务器就形成了一个集群,虽然解决了网站的流量压力,但是是却增加了维护的难度,比如这个集群有100台服务器,如果我们要修改其中一个配置,难道我们就要去每台服务器上去改么?当然要另辟新径。Zookeeper是一个分布式的协调服务,它可以很好的解决这样的问题。

  Zookeeper集群

  既然是分布式,必然我们需要多台服务器(当然也可以一台服务器开不同的端口,或者使用虚拟技术,或者使用docker之类的容器),最好是同一网段下,方便服务器之间要可以相互访问。然后在每个服务器上安装Zookeeper,并进行相关配置,这样,这些就形成了一个Zookeeper集群,集群节点之间可以相互连接访问。Zookeeper集群可以进行分布式数据同步,你通过集群的某个节点写入数据,Zookeeper会自动将数据同步到其他节点。

  Leader和Follower

  假如我们有一个Zookeeper集群,集群中有三台服务器,如果这三台是一样的拥有读写权限,那么会导致读写并发的问题(因为Zookeeper节点数据会同步,假如A、B两节点同时写入,那么C节点是同步取A的数据还是B的数据),因此Zookeeper规定,集群中只能有一个节点拥有写权限,这个节点就是Leader节点,其他的全部都是Follower节点,Follower节点只拥有读权限,而Leader节点拥有读写权限,因此如果应用通过Follower节点写入数据,Follower节点会先将数据转发到Leader节点,再由Leader节点写入。如果集群中没有Leader节点或者Leader节点故障了,那么集群内部会自动通过选举确定新Leader节点(选举算法主要有三个:leaderElection、AuthFastLeaderElection、FastLeaderElection,其中FastLeaderElection 是zookeeper 默认的一种算法)。

  

  Zookeeper节点状态一般认为有4个:  

  LOOKING:表示正在进行选举的节点,处于该状态需要进入选举流程
  LEADING:领导者状态,处于该状态的节点说明是角色已经是Leader
  FOLLOWING:跟随者状态,表示Leader已经选举出来,当前节点角色是follower
  OBSERVER:观察者状态,表明当前节点角色是observer,observer表示不会进入选举,仅仅只是接受选举结果,也就是说不会成为Leader节点,但是是follower节点一样提供服务。
  Zookeeper集群中可以是一个节点或者两个节点,但是一般认为,Zookeeper集群中至少需要3个节点,这是因为Zookeeper规定,当集群中达到一半的节点故障时,就表示集群出现故障,将不再对外服务,当正常服务节点超过一半时又会自动恢复服务状态。
  1、一台服务器体现不出Zookeeper的优势,如果故障了,就表示集群故障了
  2、二台服务器时,如果一台发生故障,则故障节点数达到了集群节点数据的一半,也就表示集群故障了
  3、三台服务器时,当两个节点故障时才表示集群故障
  4、四台服务器时,当两个节点故障时才表示集群故障
  于是乎,一个节点和两个节点的集群是不允许有故障节点的,而三个和四个节点的集群最多都是只能运行一个节点故障。
  一般认为,Zookeeper集群中的节点是奇数,因为2n-1个节点的集群和2n个节点的集群运行的故障节点数都是n,这样2n个节点的集群就可以节省一个节点的开销了

  Znode

  Zookeeper维护一个树形结构的数据集合,这个与我们的文件系统路径相似,这个树形结构中的每个节点称为znode节点,从根节点(/)开始,默认情况下,znode节点可以拥有子节点,而且每个znode节点可以保存数据,因此我们开发者可以认为,对Zookeeper的操作其实就是对znode的读写操作。

  

  znode节点可以分为三种:  

  PERSISTENT:持久节点,即使在创建该特定znode的客户端断开连接后,持久节点仍然存在。默认情况下,除非另有说明,否则所有znode都是持久的。
  EPHEMERAL:临时节点,客户端是连接状态时,临时节点就是有效的。当客户端与ZooKeeper集合断开连接时,临时节点会自动删除。临时节点不允许有子节点。临时节点在leader选举中起着重要作用。
  SEQUENTIAL:顺序节点,可以是持久的或临时的。当一个新的znode被创建为一个顺序节点时,ZooKeeper通过将10位的序列号附加到原始名称来设置znode的路径,顺序节点在锁定和同步中起重要作用。

  或者说znode节点有四种:    

   PERSISTENT:持久节点
   PERSISTENT_SEQUENTIAL:持久顺序节点
   EPHEMERAL:临时节点
   EPHEMERAL_SEQUENTIAL:临时顺序节点

  每个znode都维护着一个 stat 结构。一个stat仅提供一个znode的元数据。它由版本号,操作控制列表(ACL),时间戳和数据长度组成,也就是记录znode节点的状态等等信息。

  版本号:每个znode都有版本号,这意味着每当与znode相关联的数据发生变化时,其对应的版本号也会增加。当多个zookeeper客户端尝试在同一znode上执行操作时,版本号的使用就很重要。
  操作控制列表(ACL):ACL基本上是访问znode的认证机制。它管理所有znode读取和写入操作。
  时间戳:时间戳表示创建和修改znode所经过的时间。它通常以毫秒为单位。
  数据长度:存储在znode中的数据总量是数据长度。你最多可以存储1MB的数据。

  Watcher

  Zookeeper允许客户当往znode中注册watcher,当对znode进行修改删除,或者对znode的子节点进行修改删除时,会通过注册的watcher通知客户端。

  watcher只会触发一次,如果需要再次触发,则需要再次注册watcher。

  另外,当客户端连接断开时,watcher将自动被删除。

  总结:

  用图形象的表示:

  结构:

  

  操作:

  

Zookeeper基础教程(一):认识Zookeeper的更多相关文章

  1. Zookeeper基础教程(六):.net core使用Zookeeper

    Demo代码已提交到gitee,感兴趣的更有可以直接克隆使用,地址:https://gitee.com/shanfeng1000/dotnetcore-demo/tree/master/Zookeep ...

  2. Zookeeper基础教程(五):C#实现Zookeeper分布式锁

    分布式锁 互联网初期,我们系统一般都是单点部署,也就是在一台服务器完成系统的部署,后期随着用户量的增加,服务器的压力也越来越大,响应速度越来越慢,甚至出现服务器崩溃的情况. 为解决服务器压力太大,响应 ...

  3. zookeeper基础教程

    一.关于zookeeper Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储, Zookeeper 作用 ...

  4. Zookeeper基础教程(四):C#连接使用Zookeeper

    Zookeeper作为分布式的服务框架,虽然是java写的,但是强大的C#也可以连接使用. C#要连接使用Zookeeper,需要借助第三方插件,而现在主要有两个插件可供使用,分别是ZooKeeper ...

  5. Zookeeper基础教程(三):Zookeeper连接使用—zkCli

    上一篇介绍Zookeeper的安装,并介绍了使用ZooInspector连接Zookeeper,这里主要介绍以命令行的形式介绍Zookeeper 假如我们已经安装了Zookeeper集群,集群中的安装 ...

  6. Zookeeper基础教程(二):Zookeeper安装

    上一篇说了,一个Zookeeper集群一般认为至少需要3个节点,所以我们这里安装需要准备三台虚拟机: # 192.168.209.133 test1 # 192.168.209.134 test2 # ...

  7. Zookeeper 基础、工作流、ZAP协议

    ZooKeeper 基础 在深入了解ZooKeeper的运作之前,让我们来看看ZooKeeper的基本概念.[1] 我们将在本章中讨论以下主题:1.Architecture(架构)2.Hierarch ...

  8. ActiveMQ基础教程(二):安装与配置(单机与集群)

    因为本文会用到集群介绍,因此准备了三台虚拟机(当然读者也可以使用一个虚拟机,然后使用不同的端口来模拟实现伪集群): 192.168.209.133 test1 192.168.209.134 test ...

  9. Kafka基础教程(二):Kafka安装

    因为kafka是基于Zookeeper的,而Zookeeper一般都是一个分布式的集群,尽管kafka有自带Zookeeper,但是一般不使用自带的,都是使用外部安装的,所以首先我们需要安装Zooke ...

随机推荐

  1. Vue 标签中的ref属性和refs

    ref: ref 被用来给元素或子组件注册引用信息.引用信息将会注册在父组件的 $refs 对象上.如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素:如果用在子组件上,引用就指向组件. ...

  2. 【编程思想】【设计模式】【行为模式Behavioral】Publish_Subscribe

    Python版 https://github.com/faif/python-patterns/blob/master/behavioral/publish_subscribe.py #!/usr/b ...

  3. 令无数程序员加班的 Log4j2 远程执行漏洞复现

    前情提要 Apache 存在 Log4j 远程代码执行漏洞,将给相关企业带来哪些影响?还有哪些信息值得关注? 构建maven项目引入Log4j2 编写 pom 文件 <?xml version= ...

  4. Spring框架源码干货分享之三级缓存和父子工厂

    记录并分享一下本人学习spring源码的过程,有什么问题或者补充会持续更新.欢迎大家指正! 环境: spring5.X + idea 建议:学习过程中要开着源码一步一步过 Spring中对象的创建宏观 ...

  5. NSData NSDate NSString NSArray NSDictionary 相互转化

    //    NSData  NSDate NSString NSArray NSDictionary json NSString *string = @"hello word"; ...

  6. Apache Log4j2,RASP 防御优势及原理

    Apache Log4j2 远程代码执行漏洞已爆发一周,安全厂商提供各类防御方案和检测工具,甲方团队连夜应急. 影响持续至今,网上流传的各种利用和绕过姿势还在层出不穷,影响面持续扩大.所有安全人都开始 ...

  7. [BUUCTF]PWN11——get_started_3dsctf_2016

    [BUUCTF]PWN11--get_started_3dsctf_2016 题目网址:https://buuoj.cn/challenges#get_started_3dsctf_2016 步骤: ...

  8. Windows线程控制

    多线程无疑带来了很多方便,提高了很多开发效率,但是同时也带来了很多问题. 举个栗子: DWORD WINAPI ThreadProc(LPVOID lPParameter); int m = 0; i ...

  9. idea删除同一个模块后新建模块显示被占用

    当我们某个模块因为什么原因需要删除重建的时候 ,输入完模块名称并不能创建出来,这是因为模块已经被注册 解决办法: 1.右键点击项目名称---选择Load/Unload Modules 2.将已经删除的 ...

  10. 复杂SQL案例:用户退款信息查询

    供参考: select t3.course_id 课程id, t3.user_id 用户ID, u.user_full_name 姓名, -- u.phone, concat(u.company,' ...