【zookeeper】zookeeper概述

来源:互联网 发布:手机淘宝所有宝贝链接 编辑:程序博客网 时间:2024/06/01 14:13

一、是什么?


    是java语言实现源代码开放分布式协调服务框架。分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。zookeeper是Hadoop的一个子项目。在分布式应用中,由于工程师不能够很好地使用所机制,以及基于消息的协调机制不适合在某些应用中使用,因此需要一种可靠的、可拓展的、分布式的、可以配置的协调机制来统一系统的状态。

    zookeeper是一个高性能的分布式数据一致性解决方案。能够将那些复杂的、容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并且提供一系列简单易用的接口给用户使用。


二、基本概念


  (1)角色

需要注意每个角色的职责,leader主要是负责投票的发起和决议,更新系统的状态。follovwe主要用于接收客户端并且向客户端返回结果,在选主过程中参与投票。Observer可以接收客户端的连接,但是Observer不参与投票的过程,只是同步leader的状态。


(2)数据模型


zookeeper会维护一个具有层次干洗的数据结构,非常类似于标准的文件系统。每一个ZNODE里都可以存放一段数据,ZNODE下还可以挂载零个或多个子ZNODE节点,从而组成一个树形结构。如下图:


(3)集群过半存活原则


问题:zookeeper集群一般搭建几台?为什么采用奇数台?
    第一点,集群中只要有过半的机器是正常工作的,那么整个集群对外就是可用的,可以概括为过半存活即可用。
    第二点,,基于过半存活即,建议是将ZK集群的机器数量控制为奇数较为合适。

    第三点,整个集群如果对外要可用的话,那么集群中必须要有过半的机器是正常工作并且彼此之间能够正常通信。基于这个特性,那么如果想搭建一个能够允许F台机器down掉的集群,那么就要部署一个由2xF+1 台机器构成的ZK集群。因此,一个由3台机器构成的ZK集群,能够在down掉一台机器后依然正常工作,而5台机器的集群,能够对两台机器down掉的情况容灾。注意,如果是一个6台机器构成的ZK集群,同样只能够down掉两台机器,因为如果down掉3台,剩下的机器就没有过半了。基于这个原因,ZK集群通常设计部署成奇数台机器。

    也就是说如果有2个zookeeper,那么只要有1个死了zookeeper就不能用了,因为1没有过半,所以2个zookeeper的死亡容忍度为0;同理,要是有3个zookeeper,一个死了,还剩下2个正常的,过半了,所以3个zookeeper的容忍度为1;同理你多列举几个:2->0;3->1;4->1;5->2;6->2会发现一个规律,2n和2n-1的容忍度是一样的,都是n-1,所以为了更加高效,何必增加那一个不必要的zookeeper呢

2n+1跟2n+2台机器的容灾能力是一样的,都是允许n台机器宕机,本着节约的总之,一般选择部署2n+1台机器。


(4)集群特性


• Zookeeper:一个leader,多个follower组成的集群
• 全局数据一致:每个server保存一份相同的数据副本,client无论连接到哪个server,数据都是一致的
• 分布式读写,更新请求转发,由leader实施
• 更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行
• 数据更新原子性,一次数据更新要么成功,要么失败

实时性,在一定时间范围内,client能读到最新数据。


二、典型应用场景


1.数据的发布订阅


数据的发布订阅,就是一方把数据帆布出来,另一方通过某种手段来得到这些数据。通常是有两种模式,一种是推模式,一种是拉模式。推模式,是服务器主动向客户端推送消息,拉模式,是客户端主动去服务器获取数据。

zk采用两种方式向结合,发布者将数据发布到zk集群节点上,订阅者通过一定的方法告诉服务器,我需要哪些数据,那么服务器这些节点的数据发生变化的时候,就会通知客户端,客户端得到通知之后,就去服务器获取数据。


2.负载均衡

推荐文章:http://www.cnblogs.com/shengkejava/p/5796112.html


3.命名服务


   命名服务是指通过名字来获取资源或者服务的地址,提供者的信息。利用zookeeper很容易创建一个全局的路径,而这个路径可以作为一个命名,它指向集群中提供的服务的地址,远程对象等。简单来说,使用zookeeper做命名服务就是用路径作为名字,路径上的数据,就是名字指向的实体。

dubbo中就是使用zookeeper来作为命名服务,维护全局的服务地址列表。在dubbo实现中:

服务提供者在启动的时候,向zk的指定节点/dubbo/${serviceName}/providers目录下写下自己的url地址,这个操作就完成了服务的发布。

服务消费者启动的时候,订阅/dubbo/${serviceName}/providers目录下的提供者url地址,并且向/dubbo/{serviceName}/consumers目录下写入自己的url地址。

注意,所有向zk注册的地址都是临时节点,这样就能够保证服务提供者和消费者,可以自动感应到资源的变化。


4.分布式协调、通知


在分布式系统中,我们要知道某个机器是否可用,传统的开发中,可以通过ping某个主机来实现。zk中我们让所有的机器都注册为一个临时节点,我们判断一个机器是否可用,只需要判断这个节点是否再zk中存在即可,不需要直接去连接需要检查的服务器,降低了系统的复杂度。


三、优势


1.源代码开发。

2.已经被证明是高性能,易用稳定的工业级产品。

3.有着广泛的应用,Hadoop,HBase等。


小结