zookeeper

来源:互联网 发布:张学友 知乎 编辑:程序博客网 时间:2024/05/21 17:25

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


原创粉丝点击