您的位置:首页 > 其它

Zookeeper集群的安装和使用

2016-07-21 14:50 495 查看
Apache Zookeeper 由 Apache Hadoop 的 Zookeeper 子项目发展而来,现已经成为 Apache 的顶级项目,它是一个开放源码的分布式应用程序协调服务,是Google Chubby的一个开源实现。它是一个为分布式应用提供一致性服务的组件,提供的功能包括:配置管理,名字服务,提供分布式同步、队列管理、集群管理等。

使用场景(即上述的功能):典型应用场景篇一典型应用场景篇二

原理:Zookeeper 从设计模式角度来看,是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper 就将负责通知已经在 Zookeeper 上注册的那些观察者做出相应的反应,从而实现集群中类似 Master/Slave 管理模式。

1、安装

Zookeeper有两种运行模式:

1.1、独立模式(standalone mode)

(具体参考:http://blog.csdn.net/csfreebird/article/details/44006453

只运行在一台服务器上,适合测试环境。

1.2、复制模式(replicated mode)

运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble)。

Zookeeper通过复制来实现高可用性,只要集合体中半数以上的机器处于可用状态,它就能够保证服务继续。这跟Zookeeper的复制策略有关:Zookeeper确保对znode树的每一个修改都会被复制到集合体中超过半数的机器上。

由于ZooKeeper集群,会有一个Leader负责管理和协调其他集群服务器,因此服务器的数量通常都是奇数,例如3,5,7...等,这样2n+1的数量的服务器就可以允许最多n台服务器的失效。

(安装可参考:http://blog.csdn.net/csfreebird/article/details/44007295

这里以zookeeper-3.4.8为例:

1.2.1、下载解压

解压后目录结构为:

.
├── bin
├── build.xml
├── CHANGES.txt
├── conf
├── contrib
├── dist-maven
├── docs
├── ivysettings.xml
├── ivy.xml
├── lib
├── LICENSE.txt
├── NOTICE.txt
├── README_packaging.txt
├── README.txt
├── recipes
├── src
├── zookeeper-3.4.8.jar
├── zookeeper-3.4.8.jar.asc
├── zookeeper-3.4.8.jar.md5
└── zookeeper-3.4.8.jar.sha1


1.2.2、配置文件

进入conf目录, cp zoo_sample.cfg zoo.cfg ,修改配置文件zoo.cfg为如下:

package cn.edu.buaa.act.test.TestZookeeper;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;

/**
* <pre>
* 分布式共享锁,与通过Zookeeper管理Cluster类似,只是每次触发Watcher后的操作,取现有所有节点后有下一步操作: 若最小节点等于当前节点,
* 则获得锁.
*
* <pre/>
*
* <pre>
* 如果所有节点的nodeid都一样,则各节点优先级一样,先进先得到锁;若不同节点的nodeid不能一样.则nodeid越小优先级越大
*
* <pre/>
*
* @author zsm
* @date 2016年9月18日 下午10:15:24
* @version 1.0
* @parameter
* @since
* @return
*/
public class T3_ManageLocks {
private static final int SESSION_TIMEOUT = 5000;
private static final String zookeeperAddr = "192.168.6.131:2181,192.168.6.132:2181,192.168.6.133:2181";
private static final String znodePath = "/zsm_Locks";

private ZooKeeper zk;
private static String thisNodeID;

public T3_ManageLocks(String thisNodeID) throws IOException, KeeperException, InterruptedException {
T3_ManageLocks.thisNodeID = thisNodeID;

Watcher wh = new Watcher() {
public void process(org.apache.zookeeper.WatchedEvent event) {
// System.out.println("*********wh1:event=" + event.toString() +
// " ********");
try {
List<String> nodeListTmp = zk.getChildren(znodePath, true);
System.out.println("节点变化,现有所有节点:" + nodeListTmp);

String[] nodeList = nodeListTmp.toArray(new String[nodeListTmp.size()]);
Arrays.sort(nodeList);

String nodeIdWithLock = new String(zk.getData(znodePath + "/" + nodeList[0], null, null));
System.out.println("curnode: " + T3_ManageLocks.thisNodeID + "  node with lock: " + nodeIdWithLock);
if (nodeIdWithLock.equals(T3_ManageLocks.thisNodeID)) {
System.out.println("当前节点 " + nodeIdWithLock + " 获得锁");
// do something then System.exit(0);
}

} catch (KeeperException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};

// 初始化 ZooKeeper 实例,初始化时提供的Watcher就会触发一次
zk = new ZooKeeper(zookeeperAddr, SESSION_TIMEOUT, wh);

{// 根节点不存在的话创建PERSISTENT根节点
if (zk.exists(znodePath, null) == null) {
zk.create(znodePath, "root node".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
}

// 创建EPHEMERAL_SEQUENTIAL节点
zk.create(znodePath + "/" + thisNodeID, thisNodeID.getBytes(), Ids.OPEN_ACL_UNSAFE,
CreateMode.EPHEMERAL_SEQUENTIAL);

// 在父节点getChildren,true
// zk.getChildren(znodePath, true);

}

public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
// TODO Auto-generated method stub
if (args.length < 0) {
System.out.println("args length is <0.");
System.exit(1);
}
new T3_ManageLocks(args[0]);
while (true) {
;
}
}
}


View Code

5、参考资料

1、http://blog.csdn.net/csfreebird/article/details/43984425(安装)

2、http://www.cnblogs.com/yuyijq/p/3424473.html(Zookeeper系列)

3、http://www.blogjava.net/BucketLi/archive/2010/12/21/341268.html(使用和原理探究)

4、http://data.qq.com/article?id=2863(全。腾讯大数据之Zookeeper运营经验分享)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: