ZooKeeper分布式过程协同技术详解

英文版名称:ZooKeeper: Distributed Process Coordination

第1章 简介

当你决定使用ZooKeeper来设计应用时,最好将应用数据和协同数据独立开。

比如:网路邮箱服务的用户对自己邮箱中的内容感兴趣,但是并不关心由哪台服务器来处理特定邮箱的请求。在这个例子中,邮箱内容就是应用数据,而从邮箱到某一台邮箱服务器之间的映射关系就是协同数据(或称元数据)。整个ZooKeeper服务所管理的就是后者。

1.1 ZooKeeper的使命

  • Apache Hbase

    HBase是一个通常与Hadoop一起使用的数据存储仓库。在HBase中,ZooKeeper用于选举一个集群内的主节点,以便跟踪可用的服务器,并保存集群的元数据。

  • 关于ZooKeeper名字的来源

    ZooKeeper was developed at Yahoo! Research. We had been working on ZooKeeper for a while and pitching it to other groups, so we needed a name. At the time the group had been working with the Hadoop team and had started a variety of projects with the names of animals, Apache Pig being the most well known. As we were talking about different possible names, one of the group members mentioned that we should avoid another animal name because our manager thought it was starting to sound like we lived in a zoo. That is when it clicked: distributed systems are a zoo. They are chaotic and hard to manage, and ZooKeeper is meant to keep them under control.

    The cat on the book cover is also appropriate, because an early article from Yahoo! Research about ZooKeeper described distributed process management as similar to herding cats. ZooKeeper sounds much better than CatHerder, though.

  • 整个ZooKeeper的服务器集群管理着应用协作的关键数据。ZooKeeper不适合用作海量数据存储。

第2章 了解ZooKeeper

2.1 ZooKeeper基础

  • ZooKeeper并不直接暴露原语,取而代之,它暴露了由一小部分调用方法组成的类似文件系统的API,以便允许应用实现自己的原语。我们通常使用菜谱(recipes)来表示这些原语的实现。菜谱包括ZooKeeper操作和维护一个小型的数据节点,这些节点被称为znode,采用类似于文件系统的层级树状结构进行管理。
  • API
    • create /path data

      创建一个名为/path的znode节点,并包含数据data,-e参数标志创建的znode为临时节点。

    • delete /path

      删除名为/path的znode。

    • exists /path

      检查是否存在名为/path的节点。

    • setData /path data

      设置名为/path的znode的数据为data。

    • getData /path

      返回名为/path的节点的数据信息。

    • getChildren /path

      返回所有/path节点的所有子节点列表,注:不含子节点的子节点。

    • 注:ZooKeeper并不允许局部写入或读取znode节点的数据。当设置一个znode节点的数据或读取时,znode节点的内容会被整个替换或全部读取进来。
    • stat /path [true]

      stat命令可以得到一个znode节点/path的属性,并允许我们在已经存在的znode节点上设置监视点。通过在路径后面设置参数true来添加监视点。比如可以监控节点删除事件NodeDeleted事件。

    • ls /path [true]

      可以查看/path下的子节点,通过设置true这个参数,可以设置对应znode的子节点变化的监视点。

  • znode的不同类型
    • 持久(persistent)节点和临时(ephemeral)节点

      持久的znode只能通过调用delete来进行删除。临时的znode与之相反,当创建该节点的客户端崩溃或关闭了与ZooKeeper的连接时,整个节点就会被删除。通过-e参数创建临时节点。

    • 有序节点,通过-s参数创建有序节点
  • 监视与通知

    客户端向ZooKeeper注册需要接收通知的znode,通过对znode设置监视点(watch)来接收通知。监视点是一个单词触发的操作,意即监视点会触发一个通知。为了接收多个通知,客户端必须在每次通知后设置一个新的监视点。

  • 版本

    每一个znode 都有一个版本号,它随着每次数据变化而自增。两个API操作可以有条件地执行:setData和delete。这个两个调用以版本号作为传入参数,只有当传入参数的版本号与服务器上的版本号一致时调用才会成功。

2.2 ZooKeeper架构

ZooKeeper服务器端运行于两种模式下:独立模式(standalone)和仲裁模式(quorum)。

2.3 开始使用ZooKeeper

  • windows注意事项

    • 使用如下命令运行时报如下错误,解决方法,不带start参数,但是无法stop,只能通过Ctrl+c停止,仔细查看了windows脚本和Linux脚本,发现windows脚本太弱了,想深入学习的话还是转战Linux。

      D:\soft\zookeeper-3.4.8\bin>zkServer.cmd start

D:\soft\zookeeper-3.5.1-alpha\bin>zkServer.cmd start
系统找不到指定的路径。
Error: JAVA_HOME is incorrectly set.
  • 如果报上述错误(在zookeeper-3.5.1-alpha中出现),说明您的JAVA_HOME路径中有空格,只需修改bin/zkEnv.cmd文件,在%JAVA_HOME%外面增加双引号即可,如下所示:
if not exist "%JAVA_HOME%\bin\java.exe" (
  echo Error: JAVA_HOME is incorrectly set.
  @REM goto :eof
)

set JAVA="%JAVA_HOME%\bin\java"
  • 会话的状态和生命周期

  • 事务标识符zkid
  • 本节在Windows上开发,需要修改zkServer.cmd文件,将其中

    java "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %*

    改为

    java "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" -cp "%CLASSPATH%" %ZOOMAIN% %*

    即,去除"%ZOOCFG%",执行命令时手动指定配置文件*.cfg的路径。

  • 实现一个原语:通过ZooKeeper实现锁

2.4 一个主-从模式例子的实现

通过zkCli工具来实现主-从示例的一些功能。

主-从模式的模型中包括三个角色:

  • 主节点

    主节点负责监视新的从节点和任务,分配任务给可用的从节点。

  • 从节点

    从节点会通过系统注册自己,以确保主节点看到它们可以执行任务,然后开始监视新任务。

  • 客户端

    客户端创建新任务并等待系统的响应。

第3章 开始使用ZooKeeper的API

注意:顺序和ConnectionLossException异常

ZooKeeper会严格维护执行顺序,并提供强有力的有序保障,然而,在多线程下还是需要小心面对顺序问题。多线程下,当回调函数中包括重试逻辑的代码时,一些常见的场景都可能导致错误发生。当遇到ConnectionLossException异常而补发一个请求时,新建立的请求可能排序在其他线程中的请求之后,而实际上其他线程中的请求应该在原来的请求之后。

第4章 处理状态变化

时间: 2024-08-29 09:31:19

ZooKeeper分布式过程协同技术详解的相关文章

ZooKeeper分布式过程协同技术详解1——ZooKeeper的概念和基础

简介 分布式系统和应用,不仅能提供更强的计算能力,还能为我们提供更好的容灾性和扩展性. ZooKeeper是Google的Chubby项目的开源实现,它曾经作为Hadoop的子项目,在大数据领域得到广泛应用 ZooKeeper以Fast Paxos算法为基础,同时为了解决活锁问题,对Fast Paxos算法进行了优化,因此也可以广泛用于大数据之外的其他分布式系统,为大型分布式系统提供可靠的协作处理功能. Apache ZooKeeper旨在减轻构建健壮的分布式系统的任务.ZooKeeper基于分

ZooKeeper架构 :分布式过程协同技术详解

引言 构建分布式系统并不容易.然而,人们日常所使用的应用大多基于分布式系统,在短时间内依赖于分布式系统的现状并不会改变.ApacheZooKeeper旨在减轻构建健壮的分布式系统的任务.ZooKeeper基于 分布式计算的核心概念而设计,主要目的是给开发人员提供一套容易理解和开发的接口,从而简化分布式系统构建的任务.即使有了ZooKeeper,但开发中分布式处理的环节并不是微不足道的事情,因此我们编写了这本书,通过这本书可以让你快速熟悉如何通过Apache ZooKeeper构建分布式系统.我们

Zookeeper技术:分布式架构详解、分布式技术详解、分布式事务

一.分布式架构详解 1.分布式发展历程 1.1 单点集中式 特点:App.DB.FileServer都部署在一台机器上.并且访问请求量较少 1.2? 应用服务和数据服务拆分 ?特点:App.DB.FileServer分别部署在独立服务器上.并且访问请求量较少 1.3? 使用缓存改善性能 ?特点:数据库中频繁访问的数据存储在缓存服务器中,减少数据库的访问次数,降低数据库的压力 1.4 应用服务器集群 ?特点:多台应用服务器通过负载均衡同时对外提供服务,解决单台服务器处理能力上限的问题 1.5 数据

实现高性能纠删码引擎 | 纠删码技术详解(下)

作者介绍: 徐祥曦,七牛云工程师,独立开发了多套高性能纠删码/再生码编码引擎.柳青,华中科技大学博士,研究方向为基于纠删码的分布式存储系统. 前言: 在上篇<如何选择纠删码编码引擎>中,我们简单了解了 Reed-Solomon Codes(RS 码)的编/解码过程,以及编码引擎的评判标准.但并没有就具体实现进行展开,本篇作为<纠删码技术详解>的下篇,我们将主要探讨工程实现的问题. 这里先简单提炼一下实现高性能纠删码引擎的要点:首先,根据编码理论将矩阵以及有限域的运算工程化,接下来主

CDN技术详解及实现原理

CDN技术详解 一本好的入门书是带你进入陌生领域的明灯,<CDN技术详解>绝对是带你进入CDN行业的那盏最亮的明灯.因此,虽然只是纯粹的重点抄录,我也要把<CDN技术详解>的精华放上网.公诸同好. 第一章    引言    “第一公里”是指万维网流量向用户传送的第一个出口,是网站服务器接入互联网的链路所能提供的带宽.这个带宽决定了一个 网站能为用户提供的访问速度和并发访问量.如果业务繁忙,用户的访问数越多,拥塞越严重,网站会在最需要向用户提供服务时失去用户.(还有“中间一公里” 和

基于柯西矩阵的Erasure Code技术详解

一.概述 Erasure Code可以应用于分布式存储系统中,替代多份数据拷贝的数据冗余方式,从而可以提高存储空间利用率.此外,Erasure code还可以应用于传统RAID系统中,增加数据冗余度,支持多块盘同时发生故障,从而可以提高数据可靠性. 采用范德蒙矩阵可以构建Erasure code(关于范德蒙矩阵的编解码方法,可以参考文章<基于范德蒙矩阵的Erasure code技术详解>),其生成矩阵表示如下: 采用范德蒙矩阵作为编码矩阵的问题在于算法复杂度太高,其解码算法复杂度为O(n^3)

【运维基本功】centos6.5下巧用netstat命令的参数分析TCP连接与关闭过程,图文详解

前言 使用centos6.5系统自带的 netstat,grep,watch等命令,来分析网络连接状态,要求对 TCP 有限状态机的概念有较深入的理解. 同时,这也是除了使用强大的专业第三方协议分析器,如 wireshark 以外,最有效的办法. 写本博文的目的其中之一就是要告诉大家,不使用 wireshark 等第三方工具,自己也能做到一定粒度的网络连接,状态分析,调试等等. 用到的命令总结如下: watch -n 1 -d 'netstat -antupeo | grep --color 8

hadoop应用开发技术详解

<大 数据技术丛书:Hadoop应用开发技术详解>共12章.第1-2章详细地介绍了Hadoop的生态系统.关键技术以及安装和配置:第3章是 MapReduce的使用入门,让读者了解整个开发过程:第4-5章详细讲解了分布式文件系统HDFS和Hadoop的文件I/O:第6章分析了 MapReduce的工作原理:第7章讲解了如何利用Eclipse来编译Hadoop的源代码,以及如何对Hadoop应用进行测试和调试:第8-9章 细致地讲解了MapReduce的开发方法和高级应用:第10-12章系统地讲

腾讯技术分享:GIF动图技术详解及手机QQ动态表情压缩技术实践

本文来自腾讯前端开发工程师" wendygogogo"的技术分享,作者自评:"在Web前端摸爬滚打的码农一枚,对技术充满热情的菜鸟,致力为手Q的建设添砖加瓦." 1.GIF格式的历史 GIF ( Graphics Interchange Format )原义是"图像互换格式",是 CompuServe 公司在1987年开发出的图像文件格式,可以说是互联网界的老古董了. GIF 格式可以存储多幅彩色图像,如果将这些图像((https://www.q