java - 有zookeeper相關(guān)的大神么?使用ZKClient創(chuàng)建節(jié)點(diǎn),但是服務(wù)器中并沒有顯示?
問題描述
我按照zk權(quán)威指南上的代碼創(chuàng)建節(jié)點(diǎn):
package com.zkstudy;import java.io.IOException;import java.util.Random;import org.apache.zookeeper.CreateMode;import org.apache.zookeeper.KeeperException;import org.apache.zookeeper.WatchedEvent;import org.apache.zookeeper.Watcher;import org.apache.zookeeper.ZooDefs.Ids;import org.apache.zookeeper.ZooKeeper;import org.apache.zookeeper.data.Stat;public class Master implements Watcher { private ZooKeeper zk = null; private String host; private String serverId = null; private boolean isLeader = false; public Master(String host) {this.host = host;Random radom = new Random();serverId = Integer.toHexString(radom.nextInt()); } public void start() {try { this.zk = new ZooKeeper(host, 15000, this);} catch (IOException e) { e.printStackTrace();} } public void createMaster() {while (true) { try {zk.create('/master', serverId.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);isLeader = true;break; } catch (KeeperException e) {e.printStackTrace();isLeader = false;break; } catch (InterruptedException e) {e.printStackTrace(); } if (checkMaster()) {break; }} } public boolean checkMaster() {while (true) { Stat stat = new Stat(); try {byte[] data = zk.getData('/master', false, stat);isLeader = new String(data).equals(serverId);return true; } catch (KeeperException e) {e.printStackTrace();return false; } catch (InterruptedException e) {e.printStackTrace(); }} } public void process(WatchedEvent event) {System.out.println('watcher thread:---------->' + Thread.currentThread().getId());System.out.println('event:---------->' + event); } public static void main(String[] args) throws InterruptedException {Master master = new Master('123.206.28.37:2181');master.start();master.createMaster();if (master.isLeader) { System.out.println('i am master');}System.out.println('main thread:---------->' + Thread.currentThread().getId());Thread.sleep(5000); }}
然后我運(yùn)行了兩遍。出現(xiàn)了如下問題:
watcher thread:---------->10event:---------->WatchedEvent state:SyncConnected type:None path:nullorg.apache.zookeeper.KeeperException$NodeExistsException: KeeperErrorCode = NodeExists for /mastermain thread:---------->1 at org.apache.zookeeper.KeeperException.create(KeeperException.java:119) at org.apache.zookeeper.KeeperException.create(KeeperException.java:51) at org.apache.zookeeper.ZooKeeper.create(ZooKeeper.java:783) at com.zkstudy.Master.createMaster(Master.java:40) at com.zkstudy.Master.main(Master.java:83)
提示master節(jié)點(diǎn)已經(jīng)存在。但是我在命令行里面查看卻沒有發(fā)現(xiàn)master節(jié)點(diǎn):
[zk: localhost:2181(CONNECTED) 10] ls[zk: localhost:2181(CONNECTED) 11] ls /[zk, zookeeper][zk: localhost:2181(CONNECTED) 12]
請(qǐng)問這是為什么呢?zk使用的是單節(jié)點(diǎn),不是偽集群。
問題解答
回答1:自問自答吧。因?yàn)槲覄?chuàng)建的是臨時(shí)節(jié)點(diǎn),臨時(shí)節(jié)點(diǎn)在繪畫斷開以后會(huì)自動(dòng)刪除,估計(jì)這個(gè) ls / 命令應(yīng)該是列舉的持久節(jié)點(diǎn)。
