ZooKeeper

来源:互联网 发布:小米笔记本office软件 编辑:程序博客网 时间:2024/06/10 23:01

    公司最近一直在大力发展分布式,学习ZooKeeper

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是GoogleChubby一个开源的实现,是HadoopHbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

ZooKeeper包含一个简单的原语集,[1]  提供JavaC的接口。

ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper-3.4.3\src\recipes。其中分布锁和队列有JavaC两个版本,选举只有Java版本。(概述图片来源:[2]  

外文名

ZooKeeper

    

分布式系统的可靠协调系统

    

Hadoop的正式子项目

    

高效,可靠

目录

1原理 

2特点 

3客户端 

PHP 

4其他 

zookeeper原理

编辑

ZooKeeper是以Fast Paxos算法为基础的,Paxos算法存在活锁的问题,即当有多个proposer交错提交时,有可能互相排斥导致没有一个proposer能提交成功,而Fast Paxos作了一些优化,通过选举产生一个leader (领导者),只有leader才能提交proposer,具体算法可见Fast Paxos。因此,要想弄懂ZooKeeper首先得对Fast Paxos有所了解。[3] 

ZooKeeper的基本运转流程:

1、选举Leader

2、同步数据。

3、选举Leader过程中算法有很多,但要达到的选举标准是一致的。

4Leader要具有最高的zxid

5、集群中大多数的机器得到响应并follow选出的Leader[3]  

zookeeper特点

编辑

Zookeeper中,znode是一个跟Unix文件系统路径相似的节点,可以往这个节点存储或获取数据。如果在创建znodeFlag设置为EPHEMERAL,那么当创建这个znode的节点和Zookeeper失去连接后,这个znode将不再存在在Zookeeper里,Zookeeper使用Watcher察觉事件信息。当客户端接收到事件信息,比如连接超时、节点数据改变、子节点改变,可以调用相应的行为来处理数据。ZookeeperWiki页面展示了如何使用Zookeeper来处理事件通知,队列,优先队列,锁,共享锁,可撤销的共享锁,两阶段提交。

那么Zookeeper能做什么事情呢,简单的例子:假设我们有20搜索引擎服务器(每个负责总索引中的一部分的搜索任务)和一个总服务器(负责向这20个搜索引擎的服务器发出搜索请求并合并结果集),一个备用的总服务器(负责当总服务器宕机时替换总服务器),一个webcgi(向总服务器发出搜索请求)。搜索引擎的服务器中的15个服务器提供搜索服务,5个服务器正在生成索引。这20个搜索引擎的服务器经常要让正在提供搜索服务的服务器停止提供服务开始生成索引,或生成索引的服务器已经把索引生成完成可以提供搜索服务了。使用Zookeeper可以保证总服务器自动感知有多少提供搜索引擎的服务器并向这些服务器发出搜索请求,当总服务器宕机时自动启用备用的总服务器。[4]  

zookeeper客户端

编辑

zookeeperPHP

注:以下代码依赖于PHP扩展libzookeeper[5]  

连接集群:

?

1

2

3

4

<?php

$zc = new ZookeeperClient();

$zc->connect('192.168.0.2:2181, 192.168.0.3:2181');

?>

创建节点:

?

1

2

3

4

5

<?php

$zc = new ZookeeperClient();

$zc->connect('localhost:2181');

$zc->create('/new_node', 'node_value');

?>

删除节点:

?

1

2

3

4

5

<?php

$zc = new ZookeeperClient();

$zc->connect('localhost:2181');

$zc->delete('/existing_node');

?>

获取节点值:

?

1

2

3

4

5

<?php

$zc = new ZookeeperClient();

$zc->connect('localhost:2181');

var_dump($zc->get('/existing_node'));

?>

获取子节点:

?

1

2

3

4

5

6

7

8

<?php

$zc = new ZookeeperClient();

$zc->connect('localhost:2181');

$childNodes = $zc->getChildren('/parent_node');

foreach ($childNodes as $nodeName) {

var_dump($nodeName);

}

?>

zookeeper其他    

编辑   

HBaseZooKeeper   

HBase内置有ZooKeeper,也可以使用外部ZooKeeper

HBase使用一个已有的不被HBase托管的Zookeep集群,需要设置conf/hbase env sh文件中的HBASE_MANAGES_ZK属性为 false  

... # Tell HBase whether it should manage it's own instance of Zookeeper or not. export HBASE_MANAGES_ZK=false

接下来,指明Zookeeperhost和端口。可以在hbase-site.xml中设置,也可以在HBaseCLASSPATH下面加一个zoo.cfg配置文件。HBase 会优先加载zoo.cfg 里面的配置,把hbase-site.xml里面的覆盖掉.

HBase托管ZooKeeper的时候,Zookeeper集群的启动是HBase启动脚本的一部分。但你需要自己去运行。你可以这样做

${HBASE_HOME}/bin/hbase-daemons sh {start,stop} zookeeper

你可以用这条命令启动ZooKeeper而不启动HBase. HBASE_MANAGES_ZK 的值是 false, 如果你想在HBase重启的时候不重启ZooKeeper,你可以这样做

对于独立Zoopkeeper的问题,你可以在Zookeeper启动得到帮助.[6]  



0 0
原创粉丝点击