Zookeeper系统模型和工作原理

分布式协调技术

什么是分布式协调技术?

什么是分布式协调技术?
分布式协调技术主要用来解决分布式环境中多个进程之间的同步控制,让它们有序地访问某种临界资源,防止造成“脏数据”。为了防止分布式系统中的多个进程之间相互干扰,就需要一种分布式协调技术来对这些进程进行调度,而分布式协调技术的核心就是实现分布式锁。

如何实现分布式锁?

在分布式环境中,由于网络的不可靠,对一个服务调用的失败并不表示一定是失败的,可能是执行成功了,但是响应返回的时候失败了。另外,A和B都去调用C服务,在时间上A先调用,B后调用,那么最后的结果是不是一定A的请求就先于B。这些在同一台机器上的种种假设都要重新思考,还要思考这些问题给的设计和编码带来了哪些影响。还有,在分布式环境中为了提升可靠性,往往会部署多套服务,但是如何在多套服务中达到一致性,这在同一台机器上多个进程之间的同步相对来说是比较容易的,但在分布式环境中确实一个难题。
2.目前,已实现分布式协调技术的有Google Chubby,ApacheZooKeeper,它们都是分布式锁的实现者。

了解ZooKeeper

ZooKeeper简介

1.Apache ZooKeeper是一个分布式的、开放源码的分布式应用程序协调框架,是Google Chubby的开源实现,它为大型分布式系统中的各种协调问题提供了一个解决方案,主要用于解决分布式应用中经常遇到的一些数据管理问题,如配置管理、命名服务、分布式同步、集群管理等。
2.ZooKeeper易于编程,使用文件系统目录树作为数据模型,提供Java和C的编程接口。众所周知,协调服务非常容易出错,但却很难恢复正常,例如,协调服务很容易出现死锁。ZooKeeper的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。

ZooKeeper来源

1.ZooKeeper最早起源于雅虎研究院的一个研究小组。当时,研究人员发现,在雅虎内部很多大型系统基本都需要依赖一个类似的系统来进行分布式协调,但是这些系统往往都存在分布式单点问题。所以,雅虎的开发人员就试图开发一个通用的无单点问题的分布式协调框架,以便让开发人员将精力集中在处理业务逻辑上。
2.雅虎模仿Google Chubby开发出了ZooKeeper,实现了类似的分布式锁功能,并且将ZooKeeper捐献给了Apache,ZooKeeper于2010年11月正式成为了Apache的顶级项目。

选择ZooKeeper原因

1.随着分布式架构的出现,越来越多的分布式应用会面临数据一致性问
题。在解决分布式数据一致性问题上,除了ZooKeeper之外,目前还
没有其它成熟稳定且被大规模应用的解决方案。ZooKeeper无论从性
能、易用性还是稳定性上来说,都已经达到了一个工业级产品标准。
2.其次,ZooKeeper是开放源码的。所有人都可以贡献自己的力量,你
可以和全世界成千上万的ZooKeeper开发者们一起交流使用经验,共
同解决问题。
3.ZooKeeper是免费的。这点对于一个小型公司,尤其是初创团
队来说,无疑是非常重要的。ZooKeeper已经得到了广泛的应用。诸如Hadoop、HBase、
Storm、Solr、Kafka等越来越多的大型分布式项目都已经将
ZooKeeper作为其核心组件,用于分布式协调。

ZooKeeper基本概念

1 . 集群角色
(1) ZooKeeper并没有沿用传统的Master/Slave概念,而是引入了Leader、Follower、Observer三种角色。ZooKeeper集群中的所有机器通过选举机制来选定一台被称为“Leader”的机器,除Leader外,其它机器包括Follower和Observer。
(2)Leader服务器为客户端提供读和写服务,Leader不直接接受Client的请求,接受由其他Follower和Observer转发过来的Client请求,Leader还负责投票的发起和决议。
(3)Follower和Observer都能为客户端提供读服务,两者区别在于Observer不参与Leader选举过程,也不参与写操作的“过半写成功”策略,因此Observer可以在不影响写性能的情况下提升集群的读性能。

2 .会话(Session)
(1)Session是指客户端会话。在介绍会话前,先来了解一下客户端连接,在ZooKeeper中,一个客户端连接是指客户端和服务器之间的一个TCP长连接。ZooKeeper对外服务端口默认是2181,客户端启动的时候,首先会与服务器建立一个TCP连接,从第一次连接建立开始,客户端会话的生命周期也就开始了,通过这个连接,客户端能够通过心跳检测与服务器保持有效的会话,也能够向ZooKeeper服务器发送请求并接受响应,同时还能够通过该连接接收来自服务器的Watch事件通知。
(2)Session的sessionTimeout参数用于设置一个客户端会话的超时时间。当由于服务器压力太大、网络故障或是客户端主动断开连接等各种原因导致客户端连接断开时,只要在sessionTimeout规定时间内能够重新连
接上集群中任意一台服务器,那么之前创建的会话就仍然有效。

3.数据节点(ZNode)
(1)在谈到分布式的时候,通常说的“节点”是指组成集群的每一台机器。然而在ZooKeeper中,“节点”分为两类,第一类同样是指构成集群的机器,称之为机器节点;第二类则是指数据模型中的数据单元,称之为数据节点——ZNode。
(2)ZooKeeper将所有数据存储在内存中,数据模型是一棵树,由斜杠“/”进行分割的路径,就是一个ZNode,例如/app1/p_1。每个ZNode上都会保存自己的数据内容,同时还会保存一系列属性信息。

4.版本
ZooKeeper每个ZNode上会存储数据,对应于每个ZNode,ZooKeeper都会为其维护一个Stat的数据结构,Stat中记录了这个ZNode的上数据版本,分别是dataVersion(当前ZNode数据内容的版本号)、cversion(当前ZNode子节点的版本号)、aclVersion(当前ZNode的ACL版本号)。

5.事件监听器(Watcher)
Watcher是ZooKeeper中的一个很重要的特性。ZooKeeper允许用户在指定节点上注册一Watcher,并且在一些特定事件触发时,ZooKeeper服务端会将事件通知到感兴趣的客户端上去,该机制是ZooKeeper实现分布式协调服务的重要特性。

6.访问控制列表(ACL)
ZooKeeper采用ACL(Access Control Lists)即访问控制列表策略来进行权限控制,类似于但不同于UNIX/Linux文件系统的权限控制方式UGO,UGO是一种粗粒度的文件系统权限控制模式,利用UGO只能对三类用户进行权限控制,而ACL是一种相对来说细粒度的权限管理方式,可以针对任意用户和组进行细粒度的权限控制。

ZooKeeper系统模型

数据模型

1.ZooKeeper采用类似标准文件系统的数据模型,其节点构成了一个具有层次关系的树状结构。其中每个节点被称为数据节点ZNode,ZNode是ZooKeeper中数据的最小单元,每个节点上可以存储数据,同时也可以挂载子节点,因此构成了一个层次化的命名空间。

2.ZNode通过路径引用,如同Unix中的文件路径。路径必须是绝对的,因此它们必须由斜杠“/”来开头。在ZooKeeper中,路径由Unicode字符串组成,并且有一些限制。例如ZooKeeper系统的保留ZNode“/zookeeper”用以保存管理信息,比如关键配额信息。

节点特性

1.节点类型
在ZooKeeper中,每个数据节点都是有生命周期的,其生命周期的长短取决于数据节点的节点类型。ZNode类型在创建时即被确定,并且不能改变。节点可以分为持久节(PERSISTENT)、临时节点(EPHEMERAL)和顺序节点(SEQUENTIAL)三大类型。在节点创建过程中,通过组合使用,
可以生成以下四种组合型节点类型:

(1)持久节点PERSISTENT
持久节点是ZooKeeper中最常见的一种节点类型。所谓持久节点,是指此类节点的生命周期不依赖于会话,自节点被创建就会一直存在于ZooKeeper服务器上,并且只有在客户端显式执行删除操作时,它们才能被删除。

(2)持久顺序节点PERSISTENT_SEQUENTIAL
持久顺序节点的基本特性与持久节点相同,额外特性表现在顺序性上。在ZooKeeper中,每个父节点都会为它的第一级子节点维护一份顺序,用于记录每个子节点创建的先后顺序。基于这个顺序特性,在创建子节点的时候,可以设置这个标记,那么在创建节点过程中,ZooKeeper会自动为给定节点名加上一个数字后缀,作为一个新的、完整的节点名。不过ZooKeeper会给此类节点名称进行顺序编号,自动在给定节点名后加上一个数字后缀。这个数字后缀的上限是整型的最大值,其格式为“%10d”(10位数字,没有数值的数位用0补充,例如“0000000001”),当计数值大于232-1时,计数器将溢出。

(3)临时节点EPHEMERAL
与持久节点不同的是,临时节点的生命周期依赖于创建它的会话,也就是说,如果客户端会话失效,临时节点将被自动删除,当然也可以手动删除。注意,这里提到的是客户端会话失效,而非TCP连接断开。另外,ZooKeeper规定临时节点不允许拥有子节点。

(4)临时顺序节EPHEMERAL_SEQUENTIAL
临时顺序节点的基本特性和临时节点也是一致的,同样是在临时节点的基础上,添加了顺序的特性。

节点结构

ZooKeeper命名空间中的ZNode,兼具文件和目录两种特点,既能像文件一样维护着数据、元信息、ACL、时间戳等数据结构,又能像目录一样可以作为路径标识的一部分。每个ZNode由3部分组成:
(1)stat:状态信息,描述该ZNode的版本、权限等信息。
(2)data:与该ZNode关联的数据。
(3)children:该ZNode下的子节点。

2.ZooKeeper虽然可以关联一些数据,但并没有被设计为常规的数据库或者大数据存储,相反的是,它用来管理调度数据,比如分布式应用中的配置文件信息、状态信息、汇集位置等。这些数据的共同特性就是它们都是很小的数据,通常以KB为大小单位。ZooKeeper的服务器和客户端都被设计为严格检查并限制每个ZNode的数据大小至多1M,但常规使用中应该远小于此值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值