zookeeper是一个开放源码的分布式应用程序协调服务,是 google的chubby一个开源的实现,是 hadoop和 hbase的重要组件。主要解决分布式应用一致性问题。
分布式应用可以在给定时间(同时)在网络中的多个系统上运行,通过协调它们以快速有效的方式完成特定任务。通常来说,对于复杂而耗时的任务,非分布式应用(运行在单个系统中)需要几个小时才能完成,而分布式应用通过使用所有系统涉及的计算能力可以在几分钟内完成。
通过将分布式应用配置为在更多系统上运行,可以进一步减少完成任务的时间。分布式应用正在运行的一组系统称为集群,而在集群中运行的每台机器被称为节点。
分布式应用有两部分, server(服务器) 和 client(客户端) 应用程序。服务器应用程序实际上是分布式的,并具有通用接口,以便客户端可以连接到集群中的任何服务器并获得相同的结果。 客户端应用程序是与分布式应用进行交互的工具。
分布式应用的优点
分布式应用的挑战
分布式应用程序提供了很多好处,但它们也抛出了一些复杂和难以解决的挑战。zookeeper框架提供了一个完整的机制来克服所有的挑战。
zookeeper是一个能够高效开发和维护分布式的开放源码的应用协调服务。是google的 chubby一个开源的实现,是 hadoop和 hbase的重要组件。zookeeper是一个为分布式应用提供一致性服务的软件,提供的功能包括维护配置信息、名字服务、分布式同步、组服务等。zookeeper框架最初是在“yahoo!"上构建的,用于以简单而稳健的方式访问他们的应用程序。 后来,apache zookeeper成为hadoop,hbase和其他分布式框架使用的有组织服务的标准。
首先我们对上一个段落做一个解释。
zookeeper可以实现立刻的数据一致性,即强一致性。
大家知道,hadoop生态系统中的组件,都喜欢起动物的名称。如hadoop、hive、pig等。而zookeeper中文意思是动物园管理员,就是管理hadoop生态系统。
5. zookeeper的好处
以下是使用zookeeper的好处:
看看下面的图表。它描述了zookeeper的“客户端-服务器架构”。
配置多个实例共同构成一个zookeeper集群对外提供服务以达到水平扩展的目的,集群中的每一台电脑都称为服务器(server),每个服务器上的数据是相同的,每一个服务器均可以对外提供读和写的服务,这点和redis是相同的,即对客户端来讲每个服务器都是平等的。zookeeper集群一般需要奇数台服务器,为什么是奇数台服务器?因为我们需要通过选举机制选出领导者(leader),所以必须是奇数台服务器。
zookeeper提供了三种选举机制:
默认的算法是fastleaderelection,所以这篇主要分析它的选举机制。
客户端(client)是请求发起方。服务器分为不同的角色,有领导者(leader),也有学习者(learner)。角色的不同是在选举中产生的,下面是选举的流程。
目前有5台服务器,每台服务器均没有数据,它们的编号分别是a,b,c,d,e按编号依次启动,它们的选择举过程如下:
这里的小弟就是学习者(learner)。学习者(learner)分为两类,能够参与投票的就是跟随者(follower),否则就是观察者(observer)。
服务器有以下状态。
下面是选举的简易流程图。
以下是选举状态图
描述leader选择过程中的状态变化,这是假设全部实例中均没有数据,假设服务器启动顺序分别为:a,b,c。
角色 |
描述 |
||
服务器(server) |
领导者(leader) |
服务器节点,负责进行投票的发起和决议,更新系统状态。 |
|
学习者(learner) |
跟随者(follower) |
服务器节点,用于接收客户端请求并向客户端返回结果,在选举过程中能参与投票。 |
|
观察者(observer) |
当集群节点数目逐渐增大为了支持更多的客户端,需要增加更多server,然而server增多,投票阶段延迟增大,影响性能。为了权衡伸缩性和高吞吐率,引入observer。 服务器节点,可以接收客户端连接,将写请求转发给leader节点。但observer不能参与投票,只同步leader的状态。observer的目的是为了扩展系统,提高读取速度。 |
||
客户端(client) |
请求发起方 |
zookeeper是分布式应用程序的协调程序。分布式应用程序运行在集群上,客户端对一台服务器的请求完成后修改了数据并将数据同步到其他备份,并且需要将结果告知集群中所有电脑,这个由分布式应用程序自身实现吗?可以,但是也可以由另一个协调程序完成这个功能,zookeeper就是这么一个协调程序。下面我们介绍以下zookeeper写流程。下面我们见下图。
客户端首先和一个server或者observer(可以认为是一个server的代理)通信,发起写请求,然后server将写请求转发给leader,leader再将写请求转发给其他server,server在接收到写请求后写入数据并回应leader,leader在接收到大多数写成功回应后,认为数据写成功,回应client。
|
zookeeper读取由特定连接的server在内部执行,因此不需要与集群进行交互。
zookeeper的数据保存在一个类似于文件系统的一个树形结构中,每个数据节点只能携带少量的数据。为什么只能携带少量的数据呢?因为zookeeper用于进行协调服务的,所以不需要携带大量数据。
每个数据节点(树中的每一个分支节点或者叶子节点)称之为znode。每一个znode节点既是目录又是文件(是文件的含义是它可以带少量数据,是目录的含义是它有可能还有子目录),这和我们普通看到的文件系统不一样。
每个目录在zookeeper中叫做znode,并且其有一个唯一的路径标识,如/services/myservice/servers/stuidname1
创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护 。
如存一个/stu/name值mike,会对路径上加序列化,如/name000001
再存一个/stu/name值jack,会对路径上加序列化, 如/name000002
上面的znode就有两个版本
zookeeper以节点的方式存储一些关键信息,默认情况下,所有应用都可以读写任何节点,在复杂的应用中,这不太安全,zookeeper通过acl(access controll list)机制来解决访问权限问题。
总体来说,zookeeper的节点有5种acl(access controller list)权限:
这5种权限简写为crwda(即:每个单词的首字符缩写)。注意这5种权限中,delete是指对子节点的删除权限,其它4种权限指对自身节点的操作权限。
zookeeper的节点是可以被监控,目录中存储数据的修改、子节点目录的变化,都可以触发事件并通知监听的客户端,这是 zookeeper重要的特性。通过此特性可以实现的功能个监听事件是一个有配置的集中管理、集群管理、分布式锁等。监听机制官方说明为次性的监听器,当被设置了监听的数据发生变化时,服务器就会将这个改变发送给负责设置 watch的客户端。
zookeeper中的watch是只能触发一次。也就是说,如果客户端在指定的znode设置了watch,如果该znode数据发生变更,zookeeper会发送一个变更通知给客户端,同时触发设置的watch事件。如果znode数据又发生了变更,客户端在收到第一次通知后没有重新设置该znode的watch,则zookeeper就不会发送一个变更通知给客户端。
zookeeper的特点是
如对本文有疑问, 点击进行留言回复!!
去 HBase,Kylin on Parquet 性能表现如何?
如何找到Hive提交的SQL相对应的Yarn程序的applicationId
如何在 HBase Shell 命令行正常查看十六进制编码的中文?哈哈~
网友评论