ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。node
Zookeeper是Google的Chubby一个开源的实现.是高有效和可靠的协同工做系统.Zookeeper可以用来leader选举,配置信息维护等.在一个分布式的环境中,咱们须要一个Master实例或存储一些配置信息,确保文件写入的一致性等.Zookeeper可以保证以下3点:web
Watches are ordered with respect to other events, other watches, and
asynchronous replies. The ZooKeeper client libraries ensures that
everything is dispatched in order.服务器
A client will see a watch event for a znode it is watching before seeing the new data that corresponds to that znode.网络
The order of watch events from ZooKeeper corresponds to the order of the updates as seen by the ZooKeeper service.async
在Zookeeper中,znode是一个跟Unix文件系统路径类似的节点,能够往这个节点存储或获取数据.若是在建立znode时Flag设置 为EPHEMERAL,那么当这个建立这个znode的节点和Zookeeper失去链接后,这个znode将再也不存在在Zookeeper 里.Zookeeper使用Watcher察觉事件信息,当客户端接收到事件信息,好比链接超时,节点数据改变,子节点改变,能够调用相应的行为来处理数 据.Zookeeper的Wiki页面展现了如何使用Zookeeper来处理事件通知,队列,优先队列,锁,共享锁,可撤销的共享锁,两阶段提交.分布式
那么Zookeeper能帮咱们做什么事情呢?简单的例子:假设咱们咱们有个20个搜索引擎的服务器(每一个负责总索引中的一部分的搜索任务)和一个 总服务器(负责向这20个搜索引擎的服务器发出搜索请求并合并结果集),一个备用的总服务器(负责当总服务器宕机时替换总服务器),一个web的 cgi(向总服务器发出搜索请求).搜索引擎的服务器中的15个服务器如今提供搜索服务,5个服务器正在生成索引.这20个搜索引擎的服务器常常要让正在 提供搜索服务的服务器中止提供服务开始生成索引,或生成索引的服务器已经把索引生成完成能够搜索提供服务了.使用Zookeeper能够保证总服务器自动 感知有多少提供搜索引擎的服务器并向这些服务器发出搜索请求,备用的总服务器宕机时自动启用备用的总服务器,web的cgi可以自动地获知总服务器的网络 地址变化.这些又如何作到呢?oop
提供搜索引擎的服务器都在Zookeeper中建立znode,zk.create("/search/nodes/node1",
"hostname".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateFlags.EPHEMERAL);性能
总服务器能够从Zookeeper中获取一个znode的子节点的列表,zk.getChildren("/search/nodes", true);搜索引擎
总服务器遍历这些子节点,并获取子节点的数据生成提供搜索引擎的服务器列表.spa
当总服务器接收到子节点改变的事件信息,从新返回第二步.
总服务器在Zookeeper中建立节点,zk.create("/search/master", "hostname".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateFlags.EPHEMERAL);
备用的总服务器监控Zookeeper中的"/search/master"节点.当这个znode的节点数据改变时,把本身启动变成总服务器,并把本身的网络地址数据放进这个节点.
web的cgi从Zookeeper中"/search/master"节点获取总服务器的网络地址数据并向其发送搜索请求.
web的cgi监控Zookeeper中的"/search/master"节点,当这个znode的节点数据改变时,从这个节点获取总服务器的网络地址数据,并改变当前的总服务器的网络地址.