1.ZooKeeper基本概念
(1)是一个集中的服务,用于维护配置信息、命名、提供分布式同步和提供组服务
(2) 是Hadoop下的一个子项目,它是一个针对大型分布式系统的可靠协调系统
2.ZooKeeper的目标
就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户
3.ZooKeeper提供的功能
(1)配置维护管理
<1>在应用中除了代码外,还有一些就是各种配置(比如数据库连接等)
<2>一般都是使用配置文件的方式,在代码中引入这些配置文件
<3>当只有一种配置,只有一台服务器,并且不经常修改的时候,使用配置文件是一个很好的做法
<4>分布式环境下,配置文件管理和同步是一个常见问题
1.一个集群中,所有节点的配置信息是一致的,比如 Hadoop 集群
2.对配置文件修改后,希望能够快速同步到各个节点上
<5>配置管理可交由ZooKeeper实现,它使用Zab这种一致性协议来提供一致性
1.可将配置信息写入ZooKeeper上的一个Znode
2.各个节点监听这个Znode
3.一旦Znode中的数据被修改,ZooKeeper将通知各个节点
<7>现在有很多开源项目使用Zookeeper来维护配置:
1.在HBase中,客户端连接一个Zookeeper,获得必要的HBase集群的配置信息,然后才可以进一步操作
2.开源的消息队列Kafka中,也使用Zookeeper来维护broker的信息
3.在Alibaba开源的SOA框架Dubbo中也广泛的使用Zookeeper管理一些配置来实现服务治理
(2)分布式同步(分布式锁)
<1>处于不同节点上不同的服务,它们可能需要顺序的访问一些资源,这里需要一把分布式的锁
<2>可以利用Zookeeper来协调多个分布式进程之间的活动
<3>分布式锁:在某个时刻只让一个服务去干活,当这台服务出问题的时候锁释放,立即fail over到另外的服务
<4>分布式锁具有以下特性:
1.ZooKeeper是强一致的:
1.1.各个节点上运行一个ZooKeeper客户端,
1.2.它们同时创建相同的Znode,但是只有一个客户端创建成功
2.实现锁的独占性:
2.1.创建Znode成功的那个客户端才能得到锁,其它客户端只能等待
2.2.当前客户端用完这个锁后,会删除这个Znode
2.3.其它客户端再尝试创建Znode,获取分布式锁
3.控制锁的时序:
3.1.各个客户端在某个Znode下创建临时Znode
3.2.这个类型必须为CreateMode.EPHEMERAL_SEQUENTIAL,这样该Znode可掌握全局访问时序
<4>这种设计有一个更好听的名字叫Leader Election(leader选举)
(3)名字服务
<1>在分布式环境下,经常需要对应用/服务进行统一命名,便于识别不同服务
1.类似于域名与ip之间对应关系,ip不容易记住,而域名容易记住
2.通过名称来获取资源或服务的地址,提供者等信息
<2>按照层次结构组织服务/应用名称
1.可将服务名称以及地址信息写到ZooKeeper上
2.客户端通过ZooKeeper获取可用服务列表类
(4)集群管理
<1>分布式环境中,实时掌握每个节点的状态是必要的
1.可根据节点实时状态做出一些调整
<2>可交由ZooKeeper实现
1.可将节点信息写入ZooKeeper上的一个Znode
2.监听这个Znode可获取它的实时状态变化
<3>典型应用
1.Alibaba开源的SOA框架Dubbo就采用了Zookeeper作为服务发现的底层机制
2.开源的Kafka队列就采用了Zookeeper作为Cosnumer的上下线管理
3.Hbase中Master状态监控与选举
(5)分布式通知与协调
<1>分布式环境中,经常存在一个服务需要知道它所管理的子服务的状态
1.NameNode需知道各个Datanode的状态
2.JobTracker需知道各个TaskTracker的状态
<2>心跳检测机制可通过ZooKeeper来实现
<3>信息推送可由ZooKeeper来实现,ZooKeeper相当于一个发布/订阅系统
(6)分布式队列分为两种
<1>同步队列:当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达
1.一个job由多个task组成,只有所有任务完成后,job才运行完成
2.可为job创建一个/job目录,
2.1.在该目录下,为每个完成的task创建一个临时的Znode
2.2.一旦临时Znode数目达到task总数,则表明job运行完成
<2>队列按照FIFO方式进行入队和出队操作,例如实现生产者和消费者模型
4.ZooKeeper主要特点
(1)最终一致性:为客户端展示同一视图,这是 ZooKeeper 最重要的性能
(2)可靠性:如果消息被一台服务器接受,那么它将被所有的服务器接受
(3)实时性:ZooKeeper 不能保证两个客户端同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口
(4)等待无关(wait-free):慢的或者失效的 client 不干预快速的client的请求
(5)原子性:更新只能成功或者失败,没有中间其它状态
(6)顺序性:对于所有Server,同一消息发布顺序一致
<1>这里一个Server代表一个kafka服务器
<2>ZooKeeper上的一个Znode:代表一个kafka服务器
<3>ZooKeeper可以用来管理所以的kafka服务器
<4>当Kafka系统中新增了代理或者某个代理故障失效时,ZooKeeper服务将通知生产者和消费者
<5>生产者和消费者据此开始与其它代理协调工作