J'ai suivi le code du guide faisant autorité zk pour créer le nœud :
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);
}
}
Ensuite, je l'ai exécuté deux fois. Le problème suivant est survenu :
watcher thread:---------->10
event:---------->WatchedEvent state:SyncConnected type:None path:null
org.apache.zookeeper.KeeperException$NodeExistsException: KeeperErrorCode = NodeExists for /master
main 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)
Indique que le nœud maître existe déjà.
Mais je n'ai pas trouvé le nœud maître lorsque je l'ai vérifié sur la ligne de commande :
[zk: localhost:2181(CONNECTED) 10] ls
[zk: localhost:2181(CONNECTED) 11] ls /
[zk, zookeeper]
[zk: localhost:2181(CONNECTED) 12]
Excusez-moi, pourquoi ça ? zk utilise un seul nœud, pas un pseudo cluster.
Posez et répondez à vos propres questions. Parce que ce que j'ai créé est un nœud temporaire, le nœud temporaire sera automatiquement supprimé une fois le dessin déconnecté. On estime que cette commande ls / devrait être le nœud persistant répertorié.