个人分类: 分布式服务

目录 
  一 .Zookeeper功能简介 
  二 . ZooKeeper基本概念 
    2.1  集群角色 
    2.2 集群节点分工 
    2.3  session 
    2.4 数据节点 
    2.5 状态信息 
    2.6 事物操作 
    2.7  Watcher(事件监听器) 
  三 .zookeeper应用的典型场景 
    3.1 数据发布与订阅(配置中心) 
    3.2 命名服务 
    3.3 分布式协调服务/通知 
    3.4 Master选举 
    3.5 分布式锁 
  四 .总结

一 .Zookeeper功能简介

<span style="color:#000000"><code>    ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现。
分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协
调/通知、集群管理、Master 选举、配置维护,名字服务、分布式同步、分布式锁和分布式队列
等功能。
</code></span>

二 . ZooKeeper基本概念


本节将介绍 ZooKeeper 的几个核心概念 
因此有必要预先了解这些概念。

  1. 集群角色

一个 ZooKeeper 集群同一时刻只会有一个 Leader,其他都是 Follower 或 Observer。

ZooKeeper 配置很简单,每个节点的配置文件(zoo.cfg)都是一样的,只有 myid 文件不一样。myid 的值必须是 zoo.cfg中server.{数值} 的{数值}部分。

zoo.cfg配置文件示例 

<span style="color:#000000"><code>     在装有 ZooKeeper 的机器的终端执行 zookeeper-server status 可以看当前节点的 ZooKeeper是什么角色(Leader or Follower)。
</code></span>

ZooKeeper 默认只有 Leader 和 Follower 两种角色,没有 Observer 角色。为了使用 Observer 模式,在任何想变成Observer的节点的配置文件中加入:peerType=observer 并在所有 server 的配置文件中,配置成 observer 模式的 server 的那行配置追加 :observer

2 . 节点读写服务分工

<span style="color:#000000"><code>   1.ZooKeeper 集群的所有机器通过一个 Leader 选举过程来选定一台被称为『Leader』的机器,Leader服务器为客户端提供读和写服务。2.Follower 和 Observer 都能提供读服务,不能提供写服务。两者唯一的区别在于,Observer机器不参与 Leader 选举过程,也不参与写操作的『过半写成功』策略,因此 Observer 可以在不影响写性能的情况下提升集群的读性能。
</code></span>

3 . Session

<span style="color:#000000"><code>      Session 是指客户端会话,在讲解客户端会话之前,我们先来了解下客户端连接。在ZooKeeper 中,一个客户端连接是指客户端和 ZooKeeper 服务器之间的TCP长连接。ZooKeeper 对外的服务端口默认是2181,客户端启动时,首先会与服务器建立一个TCP连接,从第一次连接建立开始,客户端会话的生命周期也开始了,通过这个连接,客户端能够通过心跳检测和服务器保持有效的会话,也能够向 ZooKeeper 服务器发送请求并接受响应,同时还能通过该连接接收来自服务器的 Watch 事件通知。Session 的 SessionTimeout 值用来设置一个客户端会话的超时时间。当由于服务器压力太大、网络故障或是客户端主动断开连接等各种原因导致客户端连接断开时,只要在 SessionTimeout 规定的时间内能够重新连接上集群中任意一台服务器,那么之前创建的会话仍然有效。
</code></span>

4 . 数据节点

<span style="color:#000000"><code>    zookeeper的结构其实就是一个树形结构,leader就相当于其中的根结点,其它节点就相当于follow节点,每个节点都保留自己的内容。zookeeper的节点分两类:持久节点和临时节点- 持久节点:所谓持久节点是指一旦这个 树形结构上被创建了,除非主动进行对树节点的移除操作,否则这个 节点将一直保存在 ZooKeeper 上。- 临时节点:临时节点的生命周期跟客户端会话绑定,一旦客户端会话失效,那么这个客户端创建的所有临时节点都会被移除。
</code></span>

5 . 状态信息

<span style="color:#000000"><code>    每个 节点除了存储数据内容之外,还存储了 节点本身的一些状态信息。用 get 命令可以
同时获得某个 节点的内容和状态信息在 ZooKeeper 中,version 属性是用来实现乐观锁机制中的『写入校验』的(保证分布
式数据原子性操作)。
</code></span>

6 .事物操作

<span style="color:#000000"><code>    在ZooKeeper中,能改变ZooKeeper服务器状态的操作称为事务操作。一般包括数据节点
创建与删除、数据内容更新和客户端会话创建与失效等操作。对应每一个事务请求,ZooKeeper
都会为其分配一个全局唯一的事务ID,用 ZXID 表示,通常是一个64位的数字。每一个 ZXID
对应一次更新操作,从这些 ZXID 中可以间接地识别出 ZooKeeper 处理这些事务操作请求的
全局顺序。
</code></span>

7 .Watcher(事件监听器)

<span style="color:#000000"><code>    是 ZooKeeper 中一个很重要的特性。ZooKeeper允许用户在指定节点上注册一些 Watcher,
并且在一些特定事件触发的时候,ZooKeeper 服务端会将事件通知到感兴趣的客户端上去。该
机制是 ZooKeeper 实现分布式协调服务的重要特性。
</code></span>

三 .ZooKeeper应用的典型场景

<span style="color:#000000"><code>    ZooKeeper 是一个高可用的分布式数据管理与协调框架。基于对ZAB算法的实现,该框架
能够很好地保证分布式环境中数据的一致性。也是基于这样的特性,使得 ZooKeeper 成为了
解决分布式一致性问题的利器。
</code></span>

1 . 数据发布与订阅(配置中心)

<span style="color:#000000"><code>  数据发布与订阅,即所谓的配置中心,顾名思义就是发布者将数据发布到 ZooKeeper 节点上,
供订阅者进行数据订阅,进而达到动态获取数据的目的,实现配置信息的集中式管理和动态更新。对于:数据量通常比较小。数据内容在运行时动态变化。集群中各机器共享,配置一致。
这样的全局配置信息就可以发布到 ZooKeeper上,让客户端(集群的机器)去订阅该消息。发布/订阅系统一般有两种设计模式,分别是推(Push)和拉(Pull)模式。- 推模式服务端主动将数据更新发送给所有订阅的客户端- 拉模式客户端主动发起请求来获取最新数据,通常客户端都采用定时轮询拉取的方式ZooKeeper 采用的是推拉相结合的方式:客户端想服务端注册自己需要关注的节点,一旦该节点的数据发生变更,那么服务端就会向相应
的客户端发送Watcher事件通知,客户端接收到这个消息通知后,需要主动到服务端获取最新的数据
</code></span>

2 . 命名服务

<span style="color:#000000"><code>    命名服务也是分布式系统中比较常见的一类场景。在分布式系统中,通过使用命名服务,客户端
应用能够根据指定名字来获取资源或服务的地址,提供者等信息。被命名的实体通常可以是集群中的
机器,提供的服务,远程对象等等——这些我们都可以统称他们为名字。其中较为常见的就是一些分布式服务框架(如RPC)中的服务地址列表。通过在ZooKeepr里
创建顺序节点,能够很容易创建一个全局唯一的路径,这个路径就可以作为一个名字。ZooKeeper 的命名服务即生成全局唯一的ID。
</code></span>

3 . 分布式协调服务/通知

<span style="color:#000000"><code>    ZooKeeper 中特有 Watcher 注册与异步通知机制,能够很好的实现分布式环境下不同机器,
甚至不同系统之间的通知与协调,从而实现对数据变更的实时处理。使用方法通常是不同的客户端
如果 机器节点 发生了变化,那么所有订阅的客户端都能够接收到相应的Watcher通知,并做出相应
的处理。ZooKeeper的分布式协调/通知,是一种通用的分布式系统机器间的通信方式。
</code></span>

4 . Master选举

Master 选举可以说是 ZooKeeper 最典型的应用场景了。比如 HDFS 中 Active NameNode 的选举、YARN 中 Active ResourceManager 的选举和 HBase 中 Active HMaster 的选举等。

<span style="color:#000000"><code>    针对 Master 选举的需求,通常情况下,我们可以选择常见的关系型数据库中的主键特性来
实现:希望成为 Master 的机器都向数据库中插入一条相同主键ID的记录,数据库会帮我们进行
主键冲突检查,也就是说,只有一台机器能插入成功——那么,我们就认为向数据库中成功插入数据
的客户端机器成为Master。依靠关系型数据库的主键特性确实能够很好地保证在集群中选举出唯一的一个Master。但是,如果当前选举出的 Master 挂了,那么该如何处理?谁来告诉我 Master 挂了呢?
显然,关系型数据库无法通知我们这个事件。但是,ZooKeeper 可以做到!利用 ZooKeepr 的强一致性,能够很好地保证在分布式高并发情况下节点的创建一定能够
保证全局唯一性,即 ZooKeeper 将会保证客户端无法创建一个已经存在的 数据单元节点。也就是说,如果同时有多个客户端请求创建同一个临时节点,那么最终一定只有一个客户端
请求能够创建成功。利用这个特性,就能很容易地在分布式环境中进行 Master 选举了。成功创建该节点的客户端所在的机器就成为了 Master。同时,其他没有成功创建该节点的
客户端,都会在该节点上注册一个子节点变更的 Watcher,用于监控当前 Master 机器是否存
活,一旦发现当前的Master挂了,那么其他客户端将会重新进行 Master 选举。这样就实现了 Master 的动态选举。
</code></span>

5 . 分布式锁

分布式锁是控制分布式系统之间同步访问共享资源的一种方式 
分布式锁又分为排他锁和共享锁两种

  • 排它锁 
    ZooKeeper如何实现排它锁?

    • 定义锁 
      ZooKeeper 上的一个 机器节点 可以表示一个锁
    • 获得锁 
      把ZooKeeper上的一个节点看作是一个锁,获得锁就通过创建临时节点的方式来实现。 
      ZooKeeper 会保证在所有客户端中,最终只有一个客户端能够创建成功,那么就可以 
      认为该客户端获得了锁。同时,所有没有获取到锁的客户端就需要到/exclusive_lock 
      节点上注册一个子节点变更的Watcher监听,以便实时监听到lock节点的变更情况。
    • 释放锁 
      因为锁是一个临时节点,释放锁有两种方式

      • 当前获得锁的客户端机器发生宕机或重启,那么该临时节点就会被删除,释放锁
      • 正常执行完业务逻辑后,客户端就会主动将自己创建的临时节点删除,释放锁。

无论在什么情况下移除了lock节点,ZooKeeper 都会通知所有在 /exclusive_lock 节点上注册了节点变更 Watcher 监听的客户端。这些客户端在接收到通知后,再次重新发起分布式锁获取,即重复『获取锁』过程。

  • 共享锁

    共享锁在同一个进程中很容易实现,但是在跨进程或者在不同 Server 之间就不好实现了。Zookeeper 却很容易实现这个功能,实现方式也是需要获得锁的 Server 创建一个 EPHEMERAL_SEQUENTIAL 目录节点,然后调用 getChildren方法获取当前的目录节点列表中最小的目录节点是不是就是自己创建的目录节点,如果正是自己创建的,那么它就获得了这个锁,如果不是那么它就调用 exists(String path, boolean watch) 方法并监控 Zookeeper 上目录节点列表的变化,一直到自己创建的节点是列表中最小编号的目录节点,从而获得锁,释放锁很简单,只要删除前面它自己所创建的目录节点就行了。

总结

<span style="color:#000000"><code>    本文介绍的 Zookeeper 的基本知识,以及介绍了几个典型的应用场景。这些都是 Zookeeper的基本功能,最重要的是 Zoopkeeper 提供了一套很好的分布式集群管理的机制,就是它这种基于层次型的目录树的数据结构,并对树中的节点进行有效管理,从而可以设计出多种多样的分布式的数据管理模型,而不仅仅局限于上面提到的几个常用应用场景</code></span>

5分钟让你了解 ZooKeeper 的功能和原理相关推荐

  1. [ ZooKeeper]ZooKeeper 的功能和原理

    Zookeeper功能简介: ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现.分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅 ...

  2. [转]5分钟实现Android中更换头像功能

    5分钟实现Android中更换头像功能 写在前面: 更换头像这个功能在用户界面几乎是100%出现的.通过拍摄照片或者调用图库中的图片,并且进行剪裁,来进行头像的设置. 功能相关截图如下: 下面我们直接 ...

  3. 开发平台之美:10分钟内实现一个销售订单功能的增删改查

    IT技术发展了这么多年,早就应该抛弃那些copy&paste的工作了,毫无成就,毫无趣味,毫无好感.这直接催生了一大批快速开发平台的崛起,下面的视频讲述的就是通过一个开发平台如何在10分钟内实 ...

  4. 十分钟了解ZAB(Zookeeper Atomic Broadcast)协议

    十分钟了解ZAB(Zookeeper Atomic Broadcast)协议 Zookeeper基于ZAB(Zookeeper Atomic Broadcast),实现了主备模式下的系统架构,保持集群 ...

  5. 视频教程-10分钟实现微信小程序支付功能-微信开发

    10分钟实现微信小程序支付功能 码农一枚,非著名全栈开发人员.分享自己的一些经验,学习心得,希望后来人少走弯路,少填坑. 多年全栈开发经验,擅长小程序,java,安卓,web前端开发. 邱石 ¥19. ...

  6. 一直对zookeeper的应用和原理比较迷糊,今天看一篇文章,讲得很通透,分享如下(转)...

    本文转自http://blog.csdn.net/gs80140/article/details/51496925 一直对zookeeper的应用和原理比较迷糊,今天看一篇文章,讲得很通透,分享如下: ...

  7. 深信服aSV服务器虚拟化功能及原理

    10月14日,业内资深云计算专家在信服云<云集技术学社>系列直播课上进行了<深信服aSV服务器虚拟化功能及原理>的分享,介绍了服务器虚拟化的基本原理和深信服aSV服务器虚拟化特 ...

  8. IM要做手机扫码登录?先看看微信的扫码登录功能技术原理

    本文原文由作者Amazing10原创发布于公众号业余码农,收录时有改动,感谢原作者的技术分享. 1.引言 某天中午,吃完午饭,摊在自己的躺椅上,想趁吃饱喝足的午后时间静静享受独自的静谧. 干点什么好呢 ...

  9. 学习 launch-editor 源码整体架构,探究 vue-devtools「在编辑器中打开组件」功能实现原理...

    1. 前言 你好,我是若川[1],微信搜索「若川视野」关注我,专注前端技术分享,一个愿景是帮助5年内前端开阔视野走向前列的公众号.欢迎加我微信ruochuan12,长期交流学习. 这是学习源码整体架构 ...

最新文章

  1. 和12岁小同志搞创客开发:如何驱动各类型传感器?
  2. 外贸网络推广浅谈蜘蛛抓取频次的原则跟哪些有关?
  3. react使用 PropTypes 和 getDefaultProps()
  4. Activity动画效果笔记
  5. project项目管理案例_福清公司开展Project项目管理软件学习培训活动
  6. CAF(C++ actor framework)(序列化之结构体,任意嵌套STL)(一)
  7. C语言typedef关键字—伟大的缝纫师
  8. 基于uCOSII的LCD驱动实验
  9. matlab调用c函数语言,MATLAB调用C/C++函数的方法
  10. 【方便自己使用】KKT条件
  11. 由*.flo(光流)文件生成png图片
  12. 我的2016(16行走,17前行)
  13. echarts 生成 迁徙图_百度地图+echarts(迁徙图)
  14. qq手机助手连接服务器失败是什么原因,按键精灵手机助手教程,按键精灵手机助手连不上手机解决方法...
  15. 【记录】解决visio流程图复制到word中字符间距改变的问题
  16. 使用Microsoft Office Publisher制作海报Poster
  17. 商业插画师走尺印象:只为做生活的设计师
  18. 流程图设计教程和参考样例
  19. Keil5 MDK版本使用ST-LINK下载程序的方法及注意事项
  20. 智能驾驶是什么意思_智能驾驶当道,谁还在谈驾驶乐趣?

热门文章

  1. 1.IDA-基本操作(改变Image Base地址、打开、保存IDA的不同方式)
  2. __declspec(naked)详解
  3. cocos2d-x游戏开发(十五)游戏加载动画loading界面
  4. 使用MAP文件快速定位程序崩溃代码行
  5. Android 根证书管理与证书验证
  6. 二叉堆详解实现优先级队列
  7. 【城市沙龙】LiveVideoStack Meet | 长沙:多媒体与广电
  8. 音视频领域或将开启”外卷“之路
  9. 共享经济模式下的边缘计算——PPIO边缘云 laaS技术实践分享
  10. 标准常有,VVC不常有