从零到一 之 ZooKeeper(一)

所有内容翻译自官网

Because Coordinating Distributed Systems is a Zoo

简介

ZooKeeper 提供了一种分布式应用程序的高性能协同服务。它封装了一些基础公共服务,例如:命名,配置管理,同步和组服务,并提供简单易用的开发接口。我们可以利用 ZooKeeper 来直接实现一致性,组管理,领导选举和存在协议等功能。当然,我们也可以利用它实现我们特殊的需求。

概览

ZooKeeper 是一种分布式、开源的协同服务。它暴露了一组简单的原语,分布式应用程序可以基于该原语组,实现更高级的服务,如同步、配置维护、组别和命名。它是一种编程友好型的设计,并采用大家熟悉的文件系统的目录树结构作为数据模型,可以用 Java 运行,也可以和 C 绑定。

协同服务很难正确运行,经常出现竞争危害和死锁。ZooKeeper 的目的就是降低协同服务实现与维护的成本。

设计目标

易用性,ZooKeeper 允许分布式进程通过与标准文件系统类似的共享层次命名空间互相协同。命名空间由数据节点(znodes)组成,类似于文件与目录。与专为存储设计的典型文件系统不同,ZooKeeper的数据都保存在内存中,以获得高吞吐和低时延的特性。

ZooKeeper实现了高性能、高可用和严格有序。高性能意味着可以被应用在大型分布式系统,高可用则避免了单点故障的风险,严格有序保证了复杂的同步原语可以在客户端实现。

可复制,就像它所协同的分布式进程一样,ZooKeeper 的组件也是可复制的

构成 ZooKeeper 服务的服务器必须互相感知,它们各自维护了一张相同的内存状态镜像,以及持久存储的事务日志与快照,只要大部分的服务器可用,ZooKeeper 的服务就可以正常运行。

客户端会维护与某一台 ZooKeeper 服务器的 TCP 长连接,并通过该连接进行请求发送,响应接收,监听事件获取与心跳检测。如果当前 TCP 长连接断开,客户端会向另一台服务器发起连接请求。

有序性,ZooKeeper 为每一次更新标记了一个序号,以反映所有事务的顺序。后续操作可以使用该序号实现更高级的抽象,例如同步原语。

速度快,ZooKeeper 在“读频繁”工作流中表现非常快,在数千台集群中运行,读写比为 10:1 时,性能最好。

数据模型与层次命名空间

ZooKeeper 提供的命名空间类似于标准文件系统,名称是以斜杠(/)分隔的路径元素序列。ZooKeeper 命名空间中的每个节点都有唯一的路径标识。

不同于标准文件系统,ZooKeeper 命名空间中的每个节点都可以持有数据与子节点(文件亦是目录)。ZooKeeper 被设计用于存储协同数据,如状态信息,配置,位置信息等,因此存储在每个节点上的数据量都比较小,一般不到1KB。接下来,我们采用术语 znode 表明我们正在谈论 ZooKeeper 中的数据节点。

znode 维护一了个统计结构,其中包含数据变更,ACL变更与时间戳的版本号,以允许缓存验证和协调更新。每次 znode 的数据发生变化时,它的版本号都会增加。例如,每当客户端检索数据时,它也会收到该数据的版本信息。

命名空间中每个 znode 存储的数据,都以原子方式进行读取与写入。读取将获得该 znode 关联的所有数据字节,写入则替换所有数据。每个节点都有一个访问控制列表(ACL),它限制谁可以做什么。

ZooKeeper 还提供了一种临时节点,它们的生命周期取决于创建它们的会话(session),当会话结束时,临时节点将会被删除。

条件更新与监听

ZooKeeper 支持监听功能。客户端可以在 znode 上设置一个监听器,当 znode 发生变更时,监听器将被触发并移除,与此同时,客户端将收到一个表示 znode 变更的数据包。此外,如果客户端与 ZooKeeper 服务器的 TCP 连接断开时,客户端将收到一个本地通知。

保证

ZooKeeper 既简单又快速,由于其目标是提供基础原语,以构建更为复杂的服务,因此,它提供了一系列的保证。

  • 顺序一致性,客户端的更新将按照他们发送的顺序执行;
  • 原子性,更新成功或失败,没有中间状态;
  • 单一系统映像,无论客户端连接的是哪一台服务器,它们看到的服务视图都是相同的;
  • 可靠性,一旦更新成功,它将一直持续到被下一个客户端更新覆盖;
  • 及时性,客户端看到的系统视图,在一定时间范围内保证是最新的。

简单 API

ZooKeeper 的设计目标之一是提供非常简单的可编程接口,因此,它只提供如下操作:

  • 创建(creat),在目录树中某个位置创建一个节点;
  • 删除(delete),删除一个节点;
  • 存在性检查(exists),测试节点是否存在于某个位置;
  • 获取数据(get data),从节点中读取数据;
  • 设置数据(set data),向节点中写入数据;
  • 获取子节点(get children),检索节点的子节点列表;
  • 同步(syc),等待数据传播。

实现

下图展示了 ZooKeeper 服务的高级组件。除了请求处理器之外,组成 ZooKeeper 服务的每个服务器都会对自身的组件进行复制备份。

复制数据库是包含完整数据树的内存数据库,它将更新记录到磁盘以获取可恢复性,并将写入数据也序列化到磁盘上,然后再更新内存数据库。

每个 ZooKeeper 服务器都为客户端提供服务。客户端需要连接到一个服务器上,才能提交请求。客户端的读请求,实际上是请求存储在本地的服务端数据库的备份。服务状态更改请求与写入请求则是通过一种一致性协议处理。

一致性协议规定了所有客户端写请求都将被转发至单个服务器,即领导节点(Leader)。其他的 ZooKeeper 服务器被称为 追随者(Followers),它们接收来自 Leader 的消息提议,然后对消息的传递进行表决。消息传递层负责将 Followers 同步给 Leader,并在 Leader 发生故障时暂代履责。

ZooKeeper 使用自定义的原子消息协议,由于消息层是原子的,因此可以保证 ZooKeeper 的本地副本不会发散(保持统一),当 Leader 收到写请求时,它会计算写请求执行时的系统状态是什么,并将其转换成捕获该新状态的事务操作。

时间: 2024-11-29 23:57:01

从零到一 之 ZooKeeper(一)的相关文章

涂鸦科技:支撑从零暴增数十亿数据的背后,竟无专职运维!

直播视频 (点击图片查看视频) 幻灯下载地址: https://oss.aliyuncs.com/yqfiles/76d3bb80d4a9da17ababada8f56ecd8b.pdf 3月23日在线实时分享顺利结束,本次由涂鸦科技技术总监柯都敏分享了涂鸦科技云上架构设计和借助阿里云实现轻运维高可用性监控的实战经验,同时也介绍了网络安全.权限控制等特定场景下如何利用阿里云产品解决特定的问题题.本次视频直播的整理文章.视频.幻灯片整理完毕,如下内容. 架构演变历程 初创公司的团队刚起步时一般规模

DockOne微信分享(一零九):中小型团队的容器化之路

本文讲的是DockOne微信分享(一零九):中小型团队的容器化之路[编者的话]GrowingIO是基于用户行为的新一代数据分析产品,提供全球领先的数据采集和分析技术.企业无需在网站或APP中埋点,即可获取并分析全面.用数据驱动用户和营收的增长.为了应对高速变化的业务增长,我们在系统设计之初就采用了微服务的架构,获得良好的可扩展性.随着时间的推移,微服务的缺点也渐渐体现,人肉运维的成本太高,导致研发效率下降.作为一个中小型团队,我们经过了半年的探索,使用容器相关技术来搭建团队内部的私有PaaS,取

从零到百亿互联网金融架构发展史---架构变迁

回想起从公司成立敲出的第一行代码算起到现在也快三年了,平台的技术架构,技术体系也算是经历了四次比较重大的升级转化(目前第四代架构体系正在进行中),临近年底也想抽出时间来回顾一下,一个小公司从最开始的零交易到现在交易量超过百亿背后的技术变迁.   总体介绍 在互联网金融行业一百多亿其实也算不上大平台,也就是二级阵营吧,其实每次的架构升级都是随着业务重大推进而伴随的,在前一代系统架构上遇到的问题,业务开发过程中积累一些优秀的开发案例,在下一代系统开发中就会大力推进架构升级.一方面可以平滑过度,一方面

从零到百亿互联网金融架构发展史

回想起从公司成立敲出的第一行代码算起到现在也快三年了,平台的技术架构,技术体系也算是经历了四次比较重大的升级转化(目前第四代架构体系正在进行中),临近年底也想抽出时间来回顾一下,一个小公司从最开始的零交易到现在交易量超过百亿背后的技术变迁. 总体介绍 在互联网金融行业一百多亿其实也算不上大平台,也就是二级阵营吧,其实每次的架构升级都是随着业务重大推进而伴随的,在前一代系统架构上遇到的问题,业务开发过程中积累一些优秀的开发案例,在下一代系统开发中就会大力推进架构升级.一方面可以平滑过度,一方面公司

DockOne微信分享(一零四):艺龙部署体系的演进

本文讲的是DockOne微信分享(一零四):艺龙部署体系的演进[编者的话]随着公司业务规模的逐渐扩大,传统的基于机器层面的部署系统在面对服务扩缩容.故障迁移.成本控制等方面已经越来越力不从心,于是,我们开始将容器技术与当前公司内部已有的自动化运维体系相结合,来实现一套艺龙的容器云平台,以期解决上述问题. 原有部署平台的架构设计 在讲解部署系统之前,我先给大家讲一下目前艺龙自动化运维的业务模型.早期艺龙的运维,因为规模较小,通常人工处理,当规模大了以后,就开始尝试基于Puppet等脚本的方式操作.

java使用zookeeper实现的分布式锁示例_java

使用zookeeper实现的分布式锁 分布式锁,实现了Lock接口 复制代码 代码如下: package com.concurrent; import java.io.IOException;import java.util.ArrayList;import java.util.Collections;import java.util.List;import java.util.concurrent.CountDownLatch;import java.util.concurrent.TimeU

sql-数据库视图里要创建一个计算的字段,如何避免被除数为零

问题描述 数据库视图里要创建一个计算的字段,如何避免被除数为零 数据库视图里要创建一个字段,是个除法,但被除数可能为零,我按照网上讲的CASE WHEN方法改了之后,总提示我表达式无效或缺少,我贴出来我的代码 ROUND(CASE WHEN V_RECOMMAND_CANDIDATE.vote_total > 0 THEN ((CAST(RECOMMAND_CANDIDATE_1.vote_agree AS FLOAT) / V_RECOMMAND_CANDIDATE.vote_total *

zookeeper集群搭建

因为公司的业务发展,需要搭建codis集群(一个由国内豌豆荚开发的redis集群解决方案),但是codis集群是依赖与zookeeper集群的.所以这篇文章,我们主要介绍有关zookeeper集群的搭建. 一.zookeeper介绍 zookeeper是一个分布式的开源框架,它能很好的管理集群,而且提供协调分布式应用的基本服务. 它向外部应用暴露一组通用服务--分布式同步(Distributed Synchronization).命名服务(Naming Service).集群维护(Group M

Zookeeper开源客户端框架Curator简介与示例

简介         Curator最初由Netflix的Jordan Zimmerman开发, Curator提供了一套Java类库, 可以更容易的使用ZooKeeper.         所谓ZooKeeper技巧(ZooKeeper Recipes),也可以称之为解决方案, 或者叫实现方案, 是指ZooKeeper的使用方法, 比如分布式的配置管理, Leader选举等         Curator作为Apache ZooKeeper天生配套的组件.ZooKeeper的Java开发者自然