ZooKeeper系列(6):ZooKeeper的伸缩性和Observer角色

ZooKeeper系列文章:http://www.javashuo.com/article/p-waqydwdc-bt.htmlhtml

 


1.ZooKeeper中的角色

在比较老的ZooKeeper版本中,只有两种角色:leader和follower。后来引入了一种新角色Observer,Observer角色除了不能投票(以及和投票相关的能力)外,其它和follower功能同样。node

因此,在ZooKeeper中:数据库

  • 投票角色:leader、follower。
  • 无票角色:observer。

2.ZooKeeper如何处理请求?

ZooKeeper集群中的每一个server都能为客户端提供读、写服务。bash

对于客户端的读请求,server会直接从它本地的内存数据库中取出数据返回给客户端,这个过程不涉及其它任何操做,也不会联系leader。服务器

对于客户端的写请求,由于写操做会修改znode的数据、状态,因此必需要在ZooKeeper集群中进行协调。处理过程以下:性能

  1. 收到写请求的那个server,首先将写请求发送给leader
  2. leader收到来自follower(或observer)的写请求后,首先计算此次写操做以后的状态,而后将这个写请求转换成带有各类状态的事务(如版本号、zxid等等)。
  3. leader将这个事务以提议的方式广播出去(即发送proposal)。
  4. 全部follower收到proposal后,对这个提议进行投票,投票完成后返回ack给leader。follower的投票只有两种方式:(1)确认此次提议表示赞成;(2)丢弃此次提议表示不一样意。
  5. leader收集投票结果,只要投票数量达到了大多数的要求(例如,5个节点的集群,3个或3个以上的节点才算大多数),此次提议就经过。
  6. 提议经过后,leader向全部server发送一个提交通知。
  7. 全部节点将此次事务写入事务日志,并进行提交。
  8. 提交后,收到写请求的那个server向客户端返回成功信息。

下面是ZooKeeper集群处理写请求过程的一个简图:日志

当ZooKeeper集群中follower的数量不少时,投票过程会成为一个性能瓶颈,为了解决投票形成的压力,因而出现了observer角色。code

observer角色不参与投票,它只是投票结果的"听众",除此以外,它和follower彻底同样,例如能接受读、写请求。就这一个特色,让整个ZooKeeper集群性能大大改善。server

和follower同样,当observer收到客户端的读请求时,会直接从内存数据库中取出数据返回给客户端。htm

对于写请求,当写请求发送到某server上后,不管这个节点是follower仍是observer,都会将它发送给leader。而后leader组织投票过程,全部server都收到这个proposal(包括observer,由于proposal是广播出去的),可是leader和follower以及observer经过配置文件,都知道本身是否是observer以及谁是observer。本身是observer的server不参与投票。当leader收集完投票后,将那些observer的server去掉,在剩下的server中计算大多数,若是投票结果达到了大多数,此次写事务就成功,因而leader通知全部的节点(包括observer),让它们将事务写入事务日志,并提交。

3.Observer的优势

observer角色除了减轻了投票的压力,还带来了几个额外的优势。

1.提升了伸缩性。

伸缩性指的是经过添加服务器来负载请求,从而提升整个集群处理请求的能力。也就是"一头牛拉不动了,找更多牛来拉"。

在出现Observer以前,ZooKeeper集群的伸缩性由follower来实现。虽然对于读写操做来讲,follower是"无状态"的,这使得添加新的follower到集群(或者从集群中减小follower)很方便,能提升ZooKeeper集群负载能力。可是,对于投票来讲,follower是有状态的,增、减follower的数量,都直接影响投票结果,特别是follower的数量越多,投票过程的性能就越差。

而observer不管是读写请求仍是投票,都是无状态的,增、减observer的数量不会影响投票结果。这样就可让一部分server做为follower参与投票,另外一部分做为observer单纯地提供读写服务。这使得ZooKeeper的伸缩性大大提升。

2.部署跨地区的ZooKeeper数据中心更方便。

observer能直接从本地内存数据库中取出数据来响应读请求,因此提升了读的吞吐量。对于写请求,虽然它要发送给leader并接受leader的通知,但相比于投票过程当中传递的信息,它的数据量很小,因此即便在广域网也能有很好的性能。

实际上,不少跨机房、跨地区的数据中心就是经过observer来实现的。

4.如何配置Observer?

要配置observer,只需稍微修改一下配置文件便可。

首先,在想要成为observer的配置文件中,加上下面一行:

peerType=observer

这表示这个server以observer角色运行,即不参与投票。

再在全部 server的配置文件中,修改server.X配置项,在那些observer的节点上加上:observer后缀。

例如,server.1对应的server要做为observer:

server.1=IP:2181:3181:observer

这样配置后,ZooKeeper集群中的全部服务器节点都知道哪些节点扮演的是observer角色。

相关文章
相关标签/搜索