zookeeper集群 java_zookeeper 集群 部署好后怎么使用 java

该博客介绍了如何在分布式环境中配置和启动Zookeeper服务,包括集群配置文件`zoo.cfg`的设置,以及通过Java API启动Zookeeper服务。文章还提供了一个用于集群启动的示例代码,并展示了客户端如何连接和操作Zookeeper数据。
摘要由CSDN通过智能技术生成

展开全部

很多使用Zookeeper的情景是需要我们嵌入Zookeeper作为自己的分布式应用系统32313133353236313431303231363533e59b9ee7ad9431333339666135的一部分来提供分布式服务,此时我们需要通过程序的方式来启动Zookeeper。此时可以通过Zookeeper API的ZooKeeperServerMain类来启动Zookeeper服务。

下面是一个集群模式下启动Zookeeper服务的例子

这里假定我们运行Zookeeper集群的三台机器名分别为fanbinx1,fanbinx2,fanbinx3

首先是zoo.cfg配置文件

[plain] view plain copy print?

tickTime=2000

dataDir=/tmp/zookeeper/data

clientPort=2181

initLimit=10

syncLimit=5

server.1=fanbinx1:2888:3888

server.2=fanbinx2:2888:3888

server.3=fanbinx3:2888:3888

启动Zookeeper集群服务的类,如下

* 这个类同时使用同一个zoo.cfg配置文件来启动Zookeeper服务。

* 在每台机器上启动Zookeeper服务的时候判断当前机器是不是定义在zoo.cfg文件里,如果是获取其中的ID号,然后生成myid文件并将ID写入其中。

* 最后启动Zookeeper服务。

[java] view plain copy print?

package my.zookeeperstudy.server;

import org.apache.commons.io.FileUtils;

import org.apache.zookeeper.server.ServerConfig;

import org.apache.zookeeper.server.ZooKeeperServerMain;

import org.apache.zookeeper.server.quorum.QuorumPeerConfig;

import java.io.File;

import java.io.InputStream;

import java.net.InetAddress;

import java.util.Properties;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class ClusteredZKServer {

public static void main(String[] args) throws Exception {

InputStream is = ClusteredZKServer.class.getResourceAsStream("/my/zookeeperstudy/server/zoo.cfg");

Properties props = new Properties();

try {

props.load(is);

} finally {

is.close();

}

for (String key : props.stringPropertyNames()) {

Pattern pKey = Pattern.compile("^server\\.(\\d)");

Pattern pValue = Pattern.compile("([\\w|.]*):\\d*:\\d*");

Matcher mKey = pKey.matcher(key);

Matcher mValue = pValue.matcher(props.getProperty(key));

if (mKey.find() && mValue.find()) {

String id = mKey.group(1);

String host = mValue.group(1);

String thisHostName = InetAddress.getLocalHost().getHostName();

String thisHostAddress = InetAddress.getLocalHost().getHostAddress();

if (host.equals(thisHostName) || host.equals(thisHostAddress)) {

//System.out.println(new File(props.getProperty("dataDir"), "myid").getAbsolutePath());

FileUtils.write(new File(props.getProperty("dataDir"), "myid"), id);

QuorumPeerConfig quorumConfig = new QuorumPeerConfig();

quorumConfig.parseProperties(props);

final ZooKeeperServerMain zkServer = new ZooKeeperServerMain();

final ServerConfig config = new ServerConfig();

config.readFrom(quorumConfig);

zkServer.runFromConfig(config);

}

}

}

}

}

客户端测试代码如下,这里可以修改hostname为集群中的任意一台机器

[java] view plain copy print?

package my.zookeeperstudy.server;

import org.apache.zookeeper.*;

import java.util.List;

public class Client {

public static void main(String[] args) throws Exception {

ZooKeeper zk = new ZooKeeper("fanbinx1:2181,fanbinx2:2181,fanbinx3:2181", 10000,

new Watcher() {

public void process(WatchedEvent event) {

System.out.println("event: " + event.getType());

}

});

System.out.println(zk.getState());

zk.create("/myApps", "myAppsData".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

zk.create("/myApps/App1", "App1Data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

zk.create("/myApps/App2", "App2Data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

zk.create("/myApps/App3", "".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

zk.setData("/myApps/App3","App3Data".getBytes(), -1);

System.out.println(zk.exists("/myApps", true));

System.out.println(new String(zk.getData("/myApps", true, null)));

List children = zk.getChildren("/myApps", true);

for (String child : children) {

System.out.println(new String(zk.getData("/myApps/" + child, true, null)));

zk.delete("/myApps/" + child,-1);

}

zk.delete("/myApps",-1);

zk.close();

}

}

测试

* 在集群中的各个机器上分别运行ClusteredZKServer类来启动Zookeeper服务。

* 然后在任意一台机器上运行Client类来连接Zookeeper并操作数据。

2Q==

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值