zookeepr--概览

zk 一个分布式应用协调服务

zk是一个分布式,开源的,分布式协调服务,他提供了一组简单的原生接口,分布式应用可以基于它实现,高水准的同步,集群,配置管理和命名服务。它基于开发,使用简单的原则而设计。使用类似于文件系统目录树结构的数据模型。它基于java实现,可以为c和java应用服务。

协调是个臭名昭著的活儿。很容易产生资源竞争和死锁的问题。zk的实现动机就是缓解分布式应用在解决彼此斜体问题而产生的抓狂行为。

zk的设计目标

zk 是个简单的玩意儿。zk通过分布式的处理流程来协调应用彼此,它是使用的是一种类似文件系统的分层名字空间。这些名字空间里,包含了数据的注册者,用zk的叫法,称之为znodes.它类似于文件和目录。不像传统的文件系统,是用来存储的,zk的数据都在内存中,所以意味着,zk的高吞吐量和底延时。zk 实现了一个优质的,高新能,高可用,严格访问顺序的服务。从zk的表现来看,它完全可以使用,大型,分布式系统。在可用上,也使它不会碰到单点故障的问题,严格的顺序性,也意味着可以在客户单实现非常复杂的同步操作。

zk 是可复制的。像它协调的应用一样,zk自身也复制到一系列主机上。他们是一个整体。如图 zk server

所有组成zk server的 severs 必须彼此能感知对方。他们在内存里维护一个所有机器的状态图,在磁盘里保存有实务日志和快照。只要大多数服务器可用。zk服务就可用。

客户端连接到单一的服务器,通过tcp协议,发送请求,获得反馈,获得监听事件,发送心跳包。如果连接的服务器挂掉,客户端会连接其他的服务机器。

zk 是顺序的。zk的每次更新都会用一个数字做标签,这个数字,代表了全部的zk事务顺序,接下来的操作用这个顺序来实现高水平的抽象,比如同步操作。

zk 是快速的。zk 在读为主的操作中,显得特别的快。zk 运行在上千台机器上,当读操作为主的请求中,表现会更好。读写比为10:1。

数据模型和命名层次

zk 提供的命名空间像一个标准的文件系统。一个名字,就是它的路径以(/)分隔的组合,在zk中每个节点,都已路径来唯一标识。zk的层次命名结构如图

Nodes 和短命的nodes

不像传统的文件系统,在zk里每个node和它的孩子node,都有数据和他们关联。他们像个这样一个文件系统,即每个文件也是目录。(zk节点里存储的数据,包括状态信息,配置,本地信息等,所以数据量都不大通常只有几字节或者几千字节),为了说清楚zk node.我们把它称作znode,znode 维护这一个数据结构,包括状态更改的版本号,acl 更改的信息和时间戳去用和套东西区验证和协调的更新。如果以个node的数据发生变化,它的版本号也会变化。比如一个客户端读取一个node数据,也会得到它的版本号。存储在node里的数据读写都是原子的。读会读所有关联的数据,写也会替换所有的数据,不会半途而废。每个节点都有个访问控制列表(acl),严格限制谁能干什么!

zk里还有个短命node的概念。这些node和创建这个节点的session生命一样长。当这个session关闭时,这个node也就自动删除了。短命node在你开发实现 【tbd】是很重要。

有条件的更新和监控

 zk 支持监控的概念客户端可以对一个节点进行监控当这个节点发生变化时,监控被触发同时被删除,当监控被触发,客户端收到一个数据更改的数据包。还有当客户端和服务端连接断开,客户端也会收到一个通知。这个在【tbd】中很有用。

保证

zk 简单快速,就像他的开始的目标一样,是构造复杂系统的基础,比如,同步系统。实际上它有一下保证:

时序一致性:更新操作会以客户端发送的顺序被执行。

原子性:更新要么失败,要么成功没有部分成功的状态。

状态图统一:一个客户端无论它连接到哪个机器,所有机器图谱一致。

可靠性:一个更新被应用,就会一直有效,直到有新的数据覆盖。

时间线:客户端某个时间段内看到的系统状态图,保证是最新的。

更多这些方面的应用,可以参看【tbd】

简单的api

zk设计之初就是提供简单的程序接口,所以,它仅仅支持一下操作:

create :在节点树上,创建一个节点

delete:删除一个节点

exists:检查一个节点是否存在

get data:从一个节点获取数据

set data:向一个节点写数据

get children:获取一个节点的孩子节点

sync:等待数据传播同步

关于这方面的更深的技术讨论,和在构建高水平应用方面的实践,可以参考【tbd】

技术实现

下面是zk 服务组件图,处理请求处理器外,每个zk组件都有复制的多份。

每个机器上的内存数据库,都包含整个数据,更新日志记录到磁盘,写操作被序列化到磁盘在它扩散同步到其他内存数据库之前。

每个zk 主机都对外提供服务,客户端连接某一个主机请求服务。读的服务从客户连接的机器本身内存里获取,写服务和改变服务状态的请求通过一个一致的协议处理。

这个一致的协议要求,所有写请求都统一发送到一个叫leader的主机。剩下的被称作followers的zk主机,通过leader 接收数据消息,消息层负责leaders的失败替换和leaders和followers之间的同步。

zk使用的是原子性的消息协议,因为消息是原子性的,所以能保证本地的信息与其他主机信息是一致没有分歧的。当leader收到一个写请求后,它会评估服务器状态,决定什么时候写,然后启动写事务,最后获取服务请的新状态。

应用

zk的使用接口尤其的简单,你可以通过他实现,顺序操作,比如同步,群组管理等,许多分布式应有使用它,想了解更多,关注【tbd】。

表现

zk被设计成高可用,是不是这样呢?在yahoo的开发组的调查说明了它是的。当读远大于写操作的时候,它表现的尤其的高性能,因为写操作要同步所有的服务器状态。(读远大于写是经典的协调服务案例),下图是zk读写比率变化的测试结果图表

这个图表的测试数据是,3.2版本的zk 运行在双核2Ghz Xeon处理器和两个15k转速的sata设备上的测试数据,一个磁盘专门做zk日志,一个写写数据快照,读写操作都是1k大小,servers 表示zk服务,组成主机数目,接近30个其他主机模拟客户机,zk服务被配置成,leader不允许从客户端连接。另外说明下,3.2读写性能是3.1版本的两倍。

测试结果也说明了zk的可靠性,下图显示了在各种错误下服务器的表现,这些错误包含以下几种:

1,follower 机器的当掉和恢复。

2,另外一个follower的当掉和恢复。

3,leader的当掉。

4,两个follower同时当掉。

5,另外一个leader的当掉。

可用性

这个图里显示了,我们有7个主机组成的zk服务器,在一段时间内我们注入错误的系统表现。这次测试我们和以前跑同样的访问饱和度,有一点们把写的比率维持在30%,这也是我们比较保守负载比例。

从张图里,可以看出一下重要的几点,当followers 挂掉并很快恢复是,zk能保持很高的吞吐量。更重要是,leader选举算法能让系统很快恢复,以保持它的高吞吐量。可以看到zk花了不到200ms选举新的leader.第三点,当follower恢复处理能力是,zk的吞吐量又开始维持在高水平。

zookeepr 项目

zk 已经成功的在多个工业系统中应用。比如在yahoo.它负责协调yahoo的失败恢复。上千个主题订阅高扩展的信使服务,和数据传输。yahoo的获取服务,crawler,也负责它的失败恢复协调。作为yahoo的一员,广告也是通过zk实现高可用性。

zk 社区欢迎所用的用户和开发者讨论和贡献他们的技能。参看 zookeeper.apahce.org

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏MongoDB中文社区

MongoDB 4.0 RC 版本强势登陆

MongoDB 因其灵活的文档模型、可扩展分布式设计广受开发者喜爱,在此基础上,MongoDB 4.0 推出了更强大的功能支持,目前4.0第一个RC版本已经发布...

13320
来自专栏WeTest质量开放平台团队的专栏

HTTP/2之服务器推送(Server Push)最佳实践

HTTP/1.X出色地满足互联网的普遍访问需求,但随着互联网的不断发展,其性能越来越成为瓶颈。IETF在2015年发布了HTTP/2标准, 着重于提高HTTP的...

14710
来自专栏BeJavaGod

SSO - 我们为何需要单点登录系统

SSO,Single Sign On,也就是单点登录,保证一个账户在多个系统上实现单一用户的登录 现在随着网站的壮大,很多服务会进行拆分,会做SOA服务,会使用...

34450
来自专栏腾讯移动品质中心TMQ的专栏

专治时间长 —5分钟测试Android覆盖安装

一、痛点 ? 覆盖安装测试,作为一项基本的测试类型是不可或缺的。它存在的主要价值: 验证老版本覆盖升级到新版本,用户和系统数据能够正确迁移,以及保障用户升级后的...

412100
来自专栏携程技术中心

干货 | 携程无线离线包增量更新方案实践

47830
来自专栏aCloudDeveloper

vhost-user 简介

什么是 vhost-user 在 vhost 的方案中,由于 vhost 实现在内核中,guest 与 vhost 的通信,相较于原生的 virtio 方式性能...

1.7K40
来自专栏Timhbw博客

Windows下iOS开发环境搭建教程

2016-06-1513:59:42 发表评论 2,027℃热度 1.下载工具 2.安装基本文件 3.开始主要步骤 4.总结 目录 可能许多初学者并没...

1.4K80
来自专栏JetpropelledSnake

Python入门之软件开发目录规范

本章重点:     理解在开发人标准软件时,如何布局项目目录结构,以及注意开发规范的重要性。     一、为什么要有好的目录结构     二、目录组织的方式  ...

56060
来自专栏分布式系统进阶

KafkaBridge - Kafka Client SDK 开源啦~~~

KafkaBridge 封装了对Kafka集群的读写操作,接口极少,简单易用,稳定可靠,支持c++/c、php、python、golang等多种语言,并特别针对...

11310
来自专栏网络

装逼必备:大型分布式网站术语分析

来自: 朱小厮的博客 程序猿自媒体已获转载授权 1、I/O优化 1、增加缓存,减少磁盘的访问次数。 2、优化磁盘的管理系统,设计最优的磁盘方式策略,以及磁盘的寻...

23190

扫码关注云+社区

领取腾讯云代金券