2019独角兽企业重金招聘Python工程师标准>>>

背景

前段时间看了S4流计算引擎,里面使用到了zookeeper进行集群管理,所以也就花了点时间研究了下zookeeper,不求看懂所有源码,但求了解其实现机制和原理,清楚其基本使用。这也是为后续hadoop,gridgain的分布式计算的产品。

学习

首先就是收集一些前人的一些学习资料和总结内容,方便自己快速入门。

这里罗列了几篇不错的文章:

  • http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/   (介绍了zookeeper能用来干嘛)

  • http://zookeeper.apache.org/doc/r3.3.2/zookeeperOver.html  (官方文档,大致介绍zookeeper)

看了这两篇文章,基本可以对zookeeper有了一个感性的认识,它是一个什么?

zookeeper功能点:

  • 统一命名空间(Name Service)

  • 配置推送 (Watch)

  • 集群管理(Group membership)

统一命名空间

在zookeeper中实现了一个类似file system系统的数据结构,比如/zookeeper/status。 每个节点都对应于一个znode节点。

znode节点的数据结构模型:

znode的数据结构内容:

  • czxid

    The zxid of the change that caused this znode to be created.

  • mzxid

    The zxid of the change that last modified this znode.

  • ctime

    The time in milliseconds from epoch when this znode was created.

  • mtime

    The time in milliseconds from epoch when this znode was last modified.

  • version

    The number of changes to the data of this znode.

  • cversion

    The number of changes to the children of this znode.

  • aversion

    The number of changes to the ACL of this znode.

  • ephemeralOwner

    The session id of the owner of this znode if the znode is an ephemeral node. If it is not an ephemeral node, it will be zero.

  • dataLength

    The length of the data field of this znode.

  • numChildren

    The number of children of this znode.

说明: zxid (ZooKeeper Transaction Id,每次请求对应一个唯一的zxid,如果zxid a < zxid b ,则可以保证a一定发生在b之前)。

针对树状结构的处理,来看一下客户端使用的api :

String create(String path, byte data[], List<ACL> acl, CreateMode createMode)
void   create(String path, byte data[], List<ACL> acl, CreateMode createMode, StringCallback cb, Object ctx)void delete(String path, int version)
void delete(String path, int version, VoidCallback cb, Object ctx)Stat setData(String path, byte data[], int version)
void setData(String path, byte data[], int version, StatCallback cb, Object ctx)Stat setACL(String path, List<ACL> acl, int version)
void setACL(String path, List<ACL> acl, int version, StatCallback cb, Object ctx)Stat exists(String path, Watcher watcher)
Stat exists(String path, boolean watch)
void exists(String path, Watcher watcher, StatCallback cb, Object ctx)
void exists(String path, boolean watch  , StatCallback cb, Object ctx)byte[] getData(String path, Watcher watcher, Stat stat)
byte[] getData(String path, boolean watch  , Stat stat)
void   getData(String path, Watcher watcher, DataCallback cb, Object ctx)
void   getData(String path, boolean watch  , DataCallback cb, Object ctx)List<String> getChildren(String path, Watcher watcher)
List<String> getChildren(String path, boolean watch  )
void  getChildren(String path, Watcher watcher, ChildrenCallback cb, Object ctx)
void  getChildren(String path, boolean watch  , ChildrenCallback cb, Object ctx)List<String> getChildren(String path, Watcher watcher, Stat stat)
List<String> getChildren(String path, boolean watch  , Stat stat)
void getChildren(String path, Watcher watcher, Children2Callback cb, Object ctx)
void getChildren(String path, boolean watch  , Children2Callback cb, Object ctx)

说明:每一种按同步还是异步,添加指定watcher还是默认watcher又分为4种。默认watcher可以在ZooKeeper zk = new ZooKeeper(serverList, sessionTimeout, watcher)中进行指定。如果包含boolean watch的读方法传入true则将默认watcher注册为所关注事件的watch。如果传入false则不注册任何watch

CreateMode主要有几种:

  • PERSISTENT (持续的,相比于EPHEMERAL,不会随着client session的close/expire而消失)

  • PERSISTENT_SEQUENTIAL

  • EPHEMERAL (短暂的,生命周期依赖于client session,对应session close/expire后其znode也会消失)

  • EPHEMERAL_SEQUENTIAL  (SEQUENTIAL意为顺序的)

AsyncCallback异步callback,根据操作类型的不同,也分几类:

  • StringCallback

  • VoidCallback

  • StatCallback

  • DataCallback  (getData请求)

  • ChildrenCallback

  • Children2Callback

对应的ACL这里有篇不错的文章介绍,http://rdc.taobao.com/team/jm/archives/947

配置推送(Watcher)

zookeeper为解决数据的一致性,使用了Watcher的异步回调接口,将服务端znode的变化以事件的形式通知给客户端,主要是一种反向推送的机制,让客户端可以做出及时响应。比如及时更新后端的可用集群服务列表。

这里有篇文章介绍Watcher/Callback比较详细,可以参考下:

  • http://luzengyi.blog.163.com/blog/static/529188201064113744373/

  • http://luzengyi.blog.163.com/blog/static/529188201061155444869/

如果想更好的理解Watcher的使用场景,可以了解下使用Watcher机制实现分布式的Barrier , Queue , Lock同步。

Barrier例子:

public class Barrier implements Watcher {private static final String addr = "10.20.156.49:2181";private ZooKeeper           zk   = null;private Integer             mutex;private int                 size = 0;private String              root;public Barrier(String root, int size){this.root = root;this.size = size;try {zk = new ZooKeeper(addr, 10 * 1000, this);mutex = new Integer(-1);Stat s = zk.exists(root, false);if (s == null) {zk.create(root, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);}} catch (Exception e) {e.printStackTrace();}}public synchronized void process(WatchedEvent event) {synchronized (mutex) {mutex.notify();}}public boolean enter(String name) throws Exception {zk.create(root + "/" + name, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);while (true) {synchronized (mutex) {List<String> list = zk.getChildren(root, true);if (list.size() < size) {mutex.wait();} else {return true;}}}}public boolean leave(String name) throws KeeperException, InterruptedException {zk.delete(root + "/" + name, 0);while (true) {synchronized (mutex) {List<String> list = zk.getChildren(root, true);if (list.size() > 0) {mutex.wait();} else {return true;}}}}}

测试代码:

public class BarrierTest {public static void main(String args[]) throws Exception {for (int i = 0; i < 3; i++) {Process p = new Process("Thread-" + i, new Barrier("/test/barrier", 3));p.start();}}
}class Process extends Thread {private String  name;private Barrier barrier;public Process(String name, Barrier barrier){this.name = name;this.barrier = barrier;}@Overridepublic void run() {try {barrier.enter(name);System.out.println(name + " enter");Thread.sleep(1000 + new Random().nextInt(2000));barrier.leave(name);System.out.println(name + " leave");} catch (Exception e) {e.printStackTrace();}}
}

通过该Barrier,可以协调不同任务之间的同步处理,这里主要还是利用了Watcher机制的反向推送,避免客户端的循环polling动作,只要针对有事件的变化做一次响应。

集群管理

我不罗嗦,taobao有几篇文章已经介绍的很详细。

  • http://rdc.taobao.com/blog/cs/?p=162  (paxos 实现)

  • http://rdc.taobao.com/blog/cs/?p=261  (paxos算法介绍续)

  • http://rdc.taobao.com/team/jm/archives/448  (zookeeper代码解析)

zookeeper集群对server进行了归类,可分为:

  • Leader

  • Follower

  • Obserer

说明:

1. Leader/Follower会通过选举算法进行选择,可以看一下http://zookeeper.apache.org/doc/r3.3.2/recipes.html 里的Leader Election章节。

2. Observer主要是为提升zookeeper的性能,observer和follower的主要区别就是observer不参与Leader agreement vote处理。只提供读节点的处理,类似于master/slave的读请求。 (http://zookeeper.apache.org/doc/r3.3.2/zookeeperObservers.html)

server.1:localhost:2181:3181:observer

3. 可通过命令行,查看当前server所处的状态

[ljh@ccbu-156-49 bin]$ echo stat | nc localhost 2181
Zookeeper version: 3.3.3--1, built on 06/24/2011 13:12 GMT
Clients:/10.16.4.30:34760[1](queued=0,recved=632,sent=632)/127.0.0.1:43626[0](queued=0,recved=1,sent=0)/10.16.4.30:34797[1](queued=0,recved=2917,sent=2917)Latency min/avg/max: 0/0/33
Received: 3552
Sent: 3551
Outstanding: 0
Zxid: 0x200000003
Mode: follower  ##当前模式
Node count: 8

使用zookeeper,我们能干些什么?

官方文档中,有举了几个应用场景,就是使用zookeeper提供分布式锁机制,从而实现分布式的一致性处理。

典型的几个场景:

  • Barrier

  • Queue

  • Lock

  • 2PC

可以参看一下: http://zookeeper.apache.org/doc/r3.3.2/recipes.html

其他

zookeeper基本是基于API和console进行znode的操作,并没有一个比较方便的操作界面,这里也发现了taobao 伯岩写的一个工具,可以比较方便的查询zookeeper信息。

工具的开发语言主要是node.js(最近比较火),其标榜的是无阻塞的api使用。其原理主要是基于google的V8(chrome的javascript的解析器,C语言编写),node.js本身是基于js语法进行开发,通过V8解析为C语言的执行代码

其标榜的无阻塞I/O实现,那可想而知就是linux系统下的select/poll的I/O模型。有兴趣的可以看下node.js的官网,下载一个玩玩。

文档地址: http://www.blogjava.net/killme2008/archive/2011/06/06/351793.html

代码地址:  https://github.com/killme2008/node-zk-browser

通过git下载源码后,需要安装下node.js的几个模块express, express-namespace, zookeeper。 node.js下有个比较方便的模块管理器npm,类似于redhat的rpm,ubuntu的apt-get。

安装模块:

npm install -g express

几个界面:

转载于:https://my.oschina.net/u/1419751/blog/394726

zookeeper学习记录相关推荐

  1. Zookeeper 3.5.7学习记录(一)——集群的坑

    Zookeeper 3.5.7学习记录(一)--集群的坑 目录 Zookeeper 3.5.7学习记录(一)--集群的坑 对应课程 概述 基础 安装Zookeeper 3.5.7 基本操作 配置文件z ...

  2. ZooKeeper学习第七期--ZooKeeper一致性原理

    ZooKeeper学习第六期---ZooKeeper机制架构 ZooKeeper学习第一期---Zookeeper简单介绍 ZooKeeper学习第二期--ZooKeeper安装配置 ZooKeepe ...

  3. ZooKeeper学习第四期---构建ZooKeeper应用

    ZooKeeper学习第一期---Zookeeper简单介绍 ZooKeeper学习第二期--ZooKeeper安装配置 ZooKeeper学习第三期---Zookeeper命令操作 ZooKeepe ...

  4. Zookeeper学习笔记

    Zookeeper学习笔记 概念 Zookeeper工作机制 特点 数据结构 应用场景 统一命名服务 统一配置管理 统一集群管理 软负载均衡 Zookeeper本地安装 本地模式安装 安装前准备 配置 ...

  5. kubernetes 学习记录

    Kubernetes 学习记录 一.`kubernetes` 入门学习 1.1 部署第一个 `Deployment` 1.2 查看资源的命令 1.3 发布应用程序 1.3.1 暴漏服务的三种模式 1. ...

  6. Kafka学习记录(三)——Broker

    Kafka学习记录(三)--Broker 目录 Kafka学习记录(三)--Broker 对应课程 Zookeeper存储的Kafka信息 Broker总体工作流程 Broker的服役和退役 Kafk ...

  7. dubbo + zookeeper学习

    title: dubbo + zookeeper学习 基础知识 什么是分布式 分布式系统是若干独立计算机的集合: 对用户来说像单个系统. 系统垂直拆分面临的问题 (1)界面,业务逻辑实现分离 (2)应 ...

  8. 大数据之spark学习记录二: Spark的安装与上手

    大数据之spark学习记录二: Spark的安装与上手 文章目录 大数据之spark学习记录二: Spark的安装与上手 Spark安装 本地模式 Standalone 模式 基本配置 步骤1: 复制 ...

  9. Kafka学习记录(四)——消费者

    Kafka学习记录(四)--消费者 目录 Kafka学习记录(四)--消费者 对应课程 Kafka消费者工作流程 消费方式和流程 消费者组原理 消费者组初始化流程 消费者组详细消费流程 重要参数 ka ...

最新文章

  1. 各种排序算法的js实现
  2. 云计算之路-阿里云上-幸福总是很突然:“黑色1秒”问题解决啦
  3. php switch 函数,PHP丨PHP基础知识之条件语SWITCH判断「理论篇」
  4. getBoundingClientRect的用法
  5. [C++]怎么样实现一个较快的Hash Table
  6. 模板 - 数据结构 - ST表 + 二维ST表
  7. Android NFC开发
  8. 为什么byte取值-128~127??
  9. 前端学习(3212):解决类中的this问题
  10. 2021大数据1班《Python程序设计基础》学生学期总结
  11. 以后再也不用看“教程”!概括【配置环境】的原理,小白也能举一反三的python配置环境过程!
  12. webAppbuilder微件使用教程2 常用微件介绍
  13. linux非root用户添加rzsz,Linux rz sz 安装
  14. 2012第二届GIS制图大赛——赛前培训资料(上篇)
  15. Apache Tomcat 文件包含漏洞(CNVD-2020-10487,对应 CVE-2020-1938)
  16. 用sql获取当前年月日YEAR(GETDATE()), MONTH(GETDATE()),DAY(GETDATE())
  17. AutoSAR系列讲解(实践篇)7.1-DaVinci Developer使用初探
  18. python 爬虫登录
  19. Ubuntu配置网络代理
  20. Mysql中的事务详解

热门文章

  1. 最新版IntelliJ IDEA 15开发Java Maven项目
  2. Linux环境编程--fflush(stdout)有什么作用
  3. Request.ServerVariables获取环境变量
  4. gridview列 数字、货币和日期 显示格式
  5. vue更新data中的数据页面不渲染_vue更新obj类data的属性无效,页面data没刷新解决方法vue.set...
  6. git 强制推送_Git 常用命令清单,掌握这些,轻松驾驭版本管理
  7. Java项目:药店信息管理系统(java+SSM+JSP+layui+maven+mysql)
  8. Java项目:仿小米电子产品售卖商城系统(java+SpringBoot+Vue+MySQL+Redis+ElementUI)
  9. 军用软件概算计价规范_工程造价五算:估算、概算、预算、结算、决算
  10. led显示屏建设标准_户外LED显示屏3大防护标准_显示屏应对恶劣天气?