zookeeper是一个针对大型分布式系统的可靠协调系统。
1)它提供的功能包括:配置维护、名字服务、分布式同步、组服务等;
2)它的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户;
zookeeper的特点
1)最终一致性:为客户端展示同一视图。
2)可靠性:如果一条消息被一台服务器接受,那么它将被所有服务器接受。
3)实时性:zookeeper不能保证两个客户端同时得到刚刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。
4)等待无关(wait-free):慢的或者失效的client不干预快速的client的请求。
5)原子性:更新操作要么成功,要么失败,没有中间状态。
6)顺序性:对于所有server,同一消息发布顺序一致。
zookeeper角色
1)领导者(leader):领导者负责进行投票的发起和决议、更新系统状态。
2)学习者(learner):
a)跟随者(follower):follower用于接收客户端请求并向客户端返回结果,在选主过程中参与投票。
b)观察者(observer):observer可以接收客户端连接,将写请求转发给leader节点,但observer不参加投票过程,只同步leader的状态,observer的目的是为了扩展系统,提高读取速度。
3)客户端(client):应用程序客户端,请求发起方。
zookeeper-选举
1、leader选举算法采用了paxos协议
2、paxos核心思想是当多数server写成功,则任务数据写成功。
1)如果有3个server,则需2个写成功即表示任务数据写成功。
2)如果有4个server,则需3个写成功即表示任务数据写成功。
3.server数目一般为奇数、例如3、5、7等。
1)如果有3个server,则最多允许1个server挂掉。
2)如果有4个server,则最多允许1个server挂掉。
zookeeper-统一命名服务
1、在分布式环境下,经常要对应用/服务进行统一命名,便于识别不同服务。
1)类似于域名与ip之间对应关系。
2)通过名称来获取资源或服务的地址等信息。
2、按照层次结构组织服务/应用名称。
1)它可以将服务名称以及地址信息写到zookeeper,客户端通过zookeeper获取服务列表。
zookeeper-配置管理
1、分布式环境下,经常需要配置文件管理和同步。
1)一个集群中,所有节点的配置信息时一致的。
2)我们对配置文件修改后,希望能够快速同步到各个节点。
2、配置管理可交由zookeeper实现。
1)可将配置信息写入zookeeper上的一个znode。
2)各个节点监听这个znode
3)一旦znode中的数据被修改、znode将通知各个节点。
zookeeper-集群管理
1、分布式环境中,我们需要实时掌握每个节点的状态。
1)可根据节点实时状态做出一些调整。
2、可交由zookeeper实现。
1)可将节点信息写入zookeeper上的一个znode。
2)监听这个znode可获取它的实时状态变化。
3、典型应用
1)HBase中Master状态监控与选举。
zookeeper-分布式通知与协调
1、分布式环境中,经常存在一个服务需要知道它所管理的子服务的状态。
1)namenode需知道各个DataNode的状态。
2)resuourcemanager需知道各个nodemanager的状态。
2、zookeeper可以实现心跳检测机制、实现信息推送,它相当于一个发布/订阅系统。
zookeeper-分布式锁
1、zookeeper是强一致的。
2、实现锁的独占性。
3、控制锁的时序。
zookeeper-分布式队列
分布式队列分为两种:
1、当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达,这种事同步队列。
1)一个job由多个task组成,只有所有任务完成后,job才运行完成。
2)可为job创建一个/job目录,然后在该目录下,为每个完成的task创建一个临时znode,一旦临时节点数目达到task总数,则表明job运行完成。
2、队列按照FIFO方式进行入队和出队操作,例如实现生产者和消费者模型。
zookeeper API
String create(path,data,acl,flags);//创建一个znode
void delete(path,expectedVersion);//删除一个znode
Stat setData(path,data,expectedVersion);//向znode里面写数据
byte[] getData(path,watch);//从znode获取数据
Stat exists(path,watch);//判断znode是否存在
String[] getChildren(path,watch);//获取znode的子目录
void sync(path);//同步接口
zookeeper-配置管理Hadoop
ConfigUpdate
ConfigWatcher