Zookeeper简介

来源:互联网 发布:java如何引用别的类 编辑:程序博客网 时间:2024/05/01 12:06

定义:

Zookeeper是维护配置信息,命名,构建复杂同步和提供组服务的优质服务,是google的chubby项目的开源实现,Hadoop的子项目。

解决的问题:

一、配置管理

zookeeper提供里集中管理配置的方法,在集中管理配置的地方改了配置,所有对这个配置感兴趣的都可以获得变更,这样省去了手动配置,保证里可靠性与一致性。

二:名字服务

分布式环境下,经常需要对服务/应用做统一命名,便于识别不同的服务,通过名称来获取资源/服务的地址

三:分布式锁

单机程序的各个进程需要对互斥资源进行访问时需要加锁,分布式程序在各个主机上的进程对互斥资源进行访问的时候也需要加锁。很多分布式系统有多个客服务的窗口,但是在某个时刻只让一个服务去干活,当这台服务出问题的时候锁释放,立即fail over到另外的服务。这种设计叫 leader选举。例:银行取钱,有多个服务窗口,如果给我服务的窗口柜员急事走了,那找大堂经理(zookeeper),指定另外一个窗口继续为你服务。

四:集群管理

集群中的机器会有各种各样的问题,有的宕机、有的网络连接不上等等,这时候需要集中的的机器感知这种变化,然后根据变化做出决策。

Zookeeper的特点

1 最终一致性:为客户端展示同一视图,这是zookeeper最重要的功能。 
2 可靠性:如果消息被到一台服务器接受,那么它将被所有的服务器接受。 
3 实时性:Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。 
4 等待无关(wait-free):慢的或者失效的client不干预快速的client的请求。 
5 原子性:更新只能成功或者失败,没有中间状态。 
6 顺序性:所有Server,同一消息发布顺序一致。

用到Zookeeper的系统

HDFS中的HA方案 
YARN的HA方案 
HBase:必须依赖Zookeeper,保存了Regionserver的心跳信息,和其他的一些关键信息。 
Flume:负载均衡,单点故障

Zookpeeper的基本架构

这里写图片描述
1 每个Server在内存中存储了一份数据; 
2 Zookeeper启动时,将从实例中选举一个leader(Paxos协议); 
3 Leader负责处理数据更新等操作(Zab协议); 
4 一个更新操作成功,当且仅当大多数Server在内存中成功修改 
数据。 
这里写图片描述

Zookpeeper Server 节点的数目

Zookeeper Server数目一般为奇数 
Leader选举算法采用了Paxos协议;Paxos核心思想:当多数Server写成功,则任务数据写 
成功。也就是说: 
如果有3个Server,则两个写成功即可; 
如果有4或5个Server,则三个写成功即可。 
Server数目一般为奇数(3、5、7) 
如果有3个Server,则最多允许1个Server挂掉; 
如果有4个Server,则同样最多允许1个Server挂掉 
既然如此,为啥要用4个Server?

Observer节点

3.3.0 以后 版本新增角色Observer 
增加原因: 
Zookeeper需保证高可用和强一致性; 
当集群节点数目逐渐增大为了支持更多的客户端,需要增加更多Server,然而Server增多,投票阶段延迟增大,影响性能。为了权衡伸缩性和高吞吐率,引入Observer: 
Observer不参与投票; 
Observers接受客户端的连接,并将写请求转发给leader节点; 
加入更多Observer节点,提高伸缩性,同时不影响吞吐率。

Zookeeper写流程:

这里写图片描述 
客户端首先和一个Server或者Observe(可以认为是一个Server的代理)通信,发起写请求,然后Server将写请求转发给Leader,Leader再将写请求转发给其他Server,Server在接收到写请求后写入数据并相应Leader,Leader在接收到大多数写成功回应后,认为数据写成功,相应Client。

Zookeeper数据模型

这里写图片描述 
zookeeper采用层次化的目录结构,命名符合常规文件系统规范; 
每个目录在zookeeper中叫做znode,并且其有一个唯一的路径标识; 
Znode可以包含数据和子znode(ephemeral类型的节点不能有子znode); 
Znode中的数据可以有多个版本,比如某一个znode下存有多个数据版本,那么查询这个路径下的数据需带上版本; 
客户端应用可以在znode上设置监视器(Watcher) 
znode不支持部分读写,而是一次性完整读写 
Znode有两种类型,短暂的(ephemeral)和持久的(persistent); 
Znode的类型在创建时确定并且之后不能再修改; 
ephemeralzn ode的客户端会话结束时,zookeeper会将该ephemeral znode删除,ephemeralzn ode不可以有子节点; 
persistent znode不依赖于客户端会话,只有当客户端明确要删除该persistent znode时才会被删除; 
Znode有四种形式的目录节点,PERSISTENT、PERSISTENT_SEQUENTIAL、EPHEMERAL、PHEMERAL_SEQUENTIAL。