ZooKeeper系列文章:https://www.cnblogs.com/f-ck-need-u/p/7576137.html#zk


ZooKeeper: 分布式协调服务

ZooKeeper是一个开源的为分布式应用提供分布式协调的服务。它公开了一组简单的原语,分布式应用程序可以基于这些原语实现更高级别的服务,包括同步、维护配置、组和命名。它的设计易于编程,它使用一个遵循文件系统中常见的目录树结构的数据模型。它在Java环境中运行,对Java和C都有绑定。

协调服务是出了名的难。它们特别容易出错,如竞态条件和死锁。ZooKeeper背后的动机是让分布式应用从零开始实现一站式协调服务。

设计目标

ZooKeeper很简单。通过共享一个类似于标准文件系统结构的层次名称空间,Zookeeper允许分布式进程进行各自的协调。名称空间中包含了注册数据——即所谓的znodes,它们类似于文件和目录。Zookeeper不像文件系统,目的是数据存储,Zookeeper的数据存放在内存中,这意味着zookeeper具有高吞吐量和低延迟的优点。

ZooKeeper非常注重高性能、高可用性、严格有序的访问。ZooKeeper的性能方面意味着它可以在大型分布式系统中使用。可靠性方面使它不会出现单点故障。严格有序意味着可以在客户端实现复杂的同步原语。

ZooKeeper是复制的。与它所协调的分布式进程一样,ZooKeeper本身也打算在一组主机上进行复制。

组成ZooKeeper的每个server之间都必须互相了解。每个server都维护状态信息(state)的内存映像,以及持久存储中的事务日志和快照。只要ZooKeeper中的大多数server可用,ZooKeeper服务就可用。

每个client连接到ZooKeeper集群中的某个server。客户端会与之建立TCP连接,通过该TCP连接来发送请求、获取响应、获取观察事件(watch events)以及发送心跳。如果TCP连接中断,客户端将连接到另一个server。

ZooKeeper是有序的。ZooKeeper给每次更新都贴上一个数字,这个数字反映了所有ZooKeeper事务的顺序。后续操作可以使用这个顺序来实现高级抽象,例如同步原语。

ZooKeeper速度很快,特别是在"以读为主"的工作负载中尤其快速。ZooKeeper应用程序可用在数千台机器上运行,在多读少写(比率在10:1左右)的环境中表现最好。

数据模型和有层次的名称空间

ZooKeeper提供的名称空间非常类似于标准文件系统。名称是由斜线(/)分隔的路径元素序列。在ZooKeeper名称空间中的每一个节点都是通过一条路径来标识的。

节点和临时节点

与标准文件系统不同的是,ZooKeeper名称空间中的每个节点(路径)都可以有与之关联的数据,子节点也如此(译注:即节点的路径自身携带数据)。这就像是一个既文件也目录的文件系统。(ZooKeeper的目的是存储协调数据:状态信息、配置、位置信息等,所以每个节点存储的数据通常都很小,一般都是kb级别的)。我们使用术语znode来明确说明我们正在讨论ZooKeeper数据节点。

znode维护一个包含数据更改版本号、ACL更改版本号和时间戳版本号的stat结构,以便能够做缓存验证和协调更新。每当znode的数据发生变化,版本号就会增加。例如,客户端每次检索数据的同时,也会接收数据的版本信息。

名称空间中,每个znode上存储的数据的读、写操作都是原子性的。读操作会获取与znode关联的所有数据,写操作会替换所有数据。每个节点都有一个访问控制列表(ACL),限制谁可以做什么。

ZooKeeper也有临时节点(ephemeral nodes)的概念。只要创建这些znode的会话(session)是活动的,这些znode就存在。当会话结束时,znode被删除。当您想要实现[tbd]时,临时节点非常有用。

协调更新和watch

ZooKeeper支持观察(watch)的概念。客户端可以在znode上设置一个watch。当znode更改时,将触发并删除一个watch。当watch被触发时,客户端会收到一个通知znode已更改的数据包。如果客户端和ZooKeeper server之间的TCP连接中断了,客户端将收到本地通知。这些可用于[tbd]。

ZooKeeper的保证

ZooKeeper快速又简单。但由于它的目标是作为构建更复杂服务(如同步)的基础,所以它要实现一些保证。包括:

  • 序列的一致性:(Sequential Consistency)来自客户端的更新将按照发送的顺序进行应用。
  • 原子性:(Atomicity)更新要么成功,要么失败。没有部分成功、失败的结果。
  • 单系统映像:(Single System Image)无论连接到ZooKeeper中的哪个server,客户端都将看到相同的服务视图。
  • 可靠性:(Reliability)一旦应用了更新,它将一直持续到有客户端对它做了覆盖更新。
  • 时效性:(Timeliness)保证客户端看到的视图在一定的时间范围内是最新的。

更多信息,以及如何使用它们,请参见[tbd]。

Simple API

ZooKeeper的一个设计目标是提供非常简单的编程接口。因此,它只支持以下几个操作:

  1. create:在树中的某个位置创建一个节点。
  2. delete:删除一个节点。
  3. exists:测试一个节点是否存在。
  4. get data:读取节点数据。
  5. set data:向节点中写入数据。
  6. get children:检索某节点的子节点列表。
  7. sync:等待要传播的数据。

更深入内容,以及如何使用它们实现更高级别的操作,请参阅[tbd]。

Implementation

下图显示了ZooKeeper服务的高层组件。除了request processor,构成ZooKeeper Service的每个server都复制自己的每个组件副本。

replicated database是包含整个数据树(data tree)的内存数据库。每次发起的更新都会将其记录到磁盘中的日志,以便以后能够进行恢复(recovery),在更新真正应用到内存数据库之前,还会先将更新序列化到磁盘中。

每个ZooKeeper server都会为客户端提供服务。客户端连接到一个server来提交request。对于read request,每个server会从本地database的副本中提供服务。对于write request,这些请求会更改服务状态,它们由协商协议(agreement procotol)来处理。

作为协商协议(agreement procotol)的一部分,所有来自客户端的write request都被转发到一个称为leader的server上。ZooKeeper中的其它server,都称为follower,它们接收来自leader的消息,并传递那些达成一致的消息。消息层(messaging layer)负责在leader故障时选举新的leader,并剩余的follower和新的leader保持同步。

ZooKeeper使用一个自定义的原子消息传递协议。由于该消息层是原子性的,ZooKeeper可以保证本地副本永远不会出现分歧。当leader收到write request时,它会计算当写操作被执行时系统状态,并将其转换为带有该状态的事务

ZooKeeper的使用

ZooKeeper的编程接口很简单。但有了它,您可以实现更高级的操作,比如同步原语、组成员关系(group membership)、所有权(ownership)等等。更多信息请参阅[tbd]。

ZooKeeper性能

ZooKeeper具有高性能。真的如此吗?雅虎ZooKeeper的开发团队的研究结果已经表明确实如此。(参见下图)。当读操作比写操作更频繁时,ZooKeeper的性能非常高,因为写操作会调用所有节点的状态同步。(协调服务的典型情况就是多读少写)。

注意:在3.2版本中,r/w的性能比3.1版本提高了大约2倍。

翻译:ZooKeeper OverView的更多相关文章

  1. ZooKeeper官方文档翻译——ZooKeeper Overview 3.4.6

    ZooKeeper ZooKeeper: A Distributed Coordination Service for Distributed Applications (针对分布式应用的分布式调度服 ...

  2. 【一】H.264/MPEG-4 Part 10 White Paper 翻译之 Overview of H.264

    翻译版权所有,转载请注明出处~ xzrch@2018.09.14 ------------------------------------------------------------------- ...

  3. 翻译——1_Project Overview, Data Wrangling and Exploratory Analysis-checkpoint

    为提高提高大学能源效率进行建筑能源需求预测 本文翻译哈佛大学的能源分析和预测报告,这是原文 暂无数据源,个人认为学习分析方法就足够 内容: 项目概述 了解数据 探索性分析 使用不同的机器学习方法进行预 ...

  4. 翻译qmake文档(一) qmake指南和概述

    翻译qmake文档 目录 英文文档连接: http://qt-project.org/doc/qt-5/qmake-manual.html http://qt-project.org/doc/qt-5 ...

  5. [ZooKeeper] 1 基本概念

    ZooKeeper: A Distributed Coordination Service for Distributed Applications ZooKeeper is a distribute ...

  6. ViewPager 详解(二)---详解四大函数

    前言:上篇中我们讲解了如何快速实现了一个滑动页面,但问题在于,PageAdapter必须要重写的四个函数,它们都各有什么意义,在上节的函数内部为什么要这么实现,下面我们就结合Android的API说明 ...

  7. kafka Detailed Replication Design V3

    参考,https://cwiki.apache.org/confluence/display/KAFKA/kafka+Detailed+Replication+Design+V3 Major chan ...

  8. 【原】Zookeeper 概述 + 官网 Overview 翻译

    分布式应用 分布式应用 distributed application可以在给定时间(同时)在网络中的多个系统上运行,通过协调它们以快速有效的方式完成特定任务. (a), (b): a distrib ...

  9. 老李分享: Oracle Performance Tuning Overview 翻译

    老李分享: Oracle Performance Tuning Overview 翻译   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工 ...

随机推荐

  1. 摘录<小王子>——[法]安东·圣埃克苏佩里

    四 大人们都喜欢数字.你要是向他们说起一个新朋友,他们提出的问题从来问不到点子上. 他们绝不会问:"他的嗓音怎么样?他喜欢什么游戏?比如,他喜欢搜集蝴蝶标本吗?" 他们总是问你:& ...

  2. ajax轮询与长轮询

      刚刚网了关于轮询的知识,必须拿到自己这里来做个备份了! 其实以前用ajax轮询做个及时数据更新的,只是当时做了不知道那个就是轮询. 首先我们什么时候会想到用轮询技术呢? 一般而言,最多的是及时信息 ...

  3. DOM函数和jQuery函数的覆盖与执行顺序

    <script type="text/javascript"> window.onload = function () { alert(); } window.onlo ...

  4. 计算机网络四:网卡与MAC地址

    网卡与MAC地址 ㈠网卡 1.网卡定义 网卡是工作在OSI的数据链路层的网络组件,是局域网中连接计算机和传输介质(网线或WIFI信号)的接口,不仅能实现与局域网传输介质之间的物理连接和电信号匹配,还涉 ...

  5. python opencv 处理文件、摄像头、图形化界面

    转换成RGB import cv2 import numpy as ny img = ny.zeros( ( 3 , 3 ),ny.float32) img=cv2.cvtColor(img,cv2. ...

  6. hdu 1086 You can Solve a Geometry Problem too [线段相交]

    题目:给出一些线段,判断有几个交点. 问题:如何判断两条线段是否相交? 向量叉乘(行列式计算):向量a(x1,y1),向量b(x2,y2): 首先我们要明白一个定理:向量a×向量b(×为向量叉乘),若 ...

  7. centos7.2安装图文详解

    centos镜像下载地址  https://www.centos.org/download/ Install CentOS 7 ----直接安装Test this media & instal ...

  8. FPGA跨时钟域握手信号的结构

    FPGA跨时钟数据传输,是我们经常遇到的问题的,下面给出一种跨时钟握手操作的电路结构.先上图 先对与其他人的结构,这个结构最大的特点是使用 req 从低到高或者高到低的变化 来表示DIN数据有效并开始 ...

  9. 搭建node js的运行环境。

    第一步:首先安装一个NVM,就是一个node的版本管理器. nvm的下载地址::https://github.com/coreybutler/nvm-windows/releases,我选择下载的是n ...

  10. Java中的NIO基础知识

    上一篇介绍了五种NIO模型,本篇将介绍Java中的NIO类库,为学习netty做好铺垫 Java NIO 由3个核心组成,分别是Channels,Buffers,Selectors.本文主要介绍着三个 ...