ZooKeeper ist ein verteilter Open-Source-Koordinierungsdienst für verteilte Anwendungen. Es handelt sich um eine Open-Source-Implementierung von Googles Chubby und eine wichtige Komponente von Hadoop und Hbase. In diesem Artikel erfahren Sie mehr über die einfache Verwendung von Zookeeper in Java.
Die Grundprinzipien von Zookeeper
Datenmodell, wie folgt:
Die Struktur des ZooKeeper-Datenmodells ist der des Unix-Dateisystems sehr ähnlich als Baum betrachtet werden, und jeder Knoten wird als ZNode bezeichnet. Jeder ZNode kann anhand seines Pfads eindeutig identifiziert werden. Der erste ZNode in der dritten Ebene in der obigen Abbildung hat beispielsweise den Pfad /app1/c1. Auf jedem ZNode kann eine kleine Datenmenge gespeichert werden (der Standardwert ist 1 MB, der durch Konfiguration geändert werden kann. Es wird im Allgemeinen nicht empfohlen, große Datenmengen auf ZNode zu speichern. Diese Funktion ist sehr nützlich). Darüber hinaus speichert jeder ZNode auch seine ACL-Informationen. Dabei ist zu beachten, dass die Baumstruktur von ZNode zwar dem Unix-Dateisystem sehr ähnlich ist, sich seine ACL jedoch völlig vom Unix-Dateisystem unterscheidet . , der untergeordnete Knoten erbt nicht den übergeordneten Knoten.
ZooKeeper-Funktionen:
1. Lese-, Schreib- (Aktualisierungs-)Modus
Im ZooKeeper-Cluster können Lesevorgänge von jedem ZooKeeperServer gelesen werden. Dies ist der Schlüssel zur Gewährleistung einer besseren Leseleistung von ZooKeeper ZooKeeper Das atomare Broadcast-Protokoll sendet die Anfrage an alle Follower. Nachdem der Leader mehr als die Hälfte der Bestätigungen für erfolgreiches Schreiben erhalten hat, betrachtet er das Schreiben als erfolgreich, behält das Schreiben bei und teilt dem Client mit, dass das Schreiben erfolgreich ist.
2. WAL und Snapshot
Wie die meisten verteilten Systeme verfügt ZooKeeper auch über WAL (Write-Ahead-Log) für jeden Aktualisierungsvorgang, ZooKeeper wird zuerst Schreiben Sie WAL, aktualisieren Sie dann die Daten im Speicher und benachrichtigen Sie dann den Client über die Aktualisierungsergebnisse. Darüber hinaus erstellt ZooKeeper regelmäßig Schnappschüsse des Verzeichnisbaums im Speicher und speichert diese auf der Festplatte. Dies ähnelt FSImage in HDFS. Der Hauptzweck dabei ist natürlich die Persistenz der Daten, und der zweite Zweck besteht darin, die Wiederherstellung nach dem Neustart zu beschleunigen. Wenn alles über ReplayWAL wiederhergestellt wird, wird es langsamer.
3. FIFO
Für jeden ZooKeeper-Client folgen alle Vorgänge der FIFO-Reihenfolge. Dies wird durch mehrere grundlegende Funktionen gewährleistet : Erstens basiert die Netzwerkkommunikation zwischen ZooKeeper-Client und -Server auf TCP, und TCP garantiert die Reihenfolge der Übertragungspakete zwischen Client/Server. Zweitens führt ZooKeeper-Server Client-Anfragen in strikter Übereinstimmung mit der FIFO-Reihenfolge aus.
4. Linearisierbarkeit
In ZooKeeper haben alle Aktualisierungsvorgänge eine strikte Teilreihenfolgebeziehung, und die Aktualisierungsvorgänge werden seriell ausgeführt Der Schlüssel zur Sicherstellung der Korrektheit der ZooKeeper-Funktionalität.
2. Allgemeine Befehle von zookeeper
Wir können zookeeper-client oder /opt/cloudera/parcels/CDH-5.0.0 ausführen - 1.cdh5.0.0.p0.47/lib/zookeeper/bin/zkCli.sh-server localhost, geben Sie die zookeeper-Befehlszeile wie folgt ein:
Dann führen Sie ls / aus und Sie können Folgendes sehen:
Dann können wir create /qyktest 'qyktest' ausführen, um zu erstellen ein Knoten, wie folgt:
Dann führen wir get /qyktest aus, um den Knotenwert wie folgt zu erhalten:
Dann können wir set /qyktest'111' ausführen, um den Wert des Knotens wie folgt zu ändern:
Schließlich führen wir delete /qyktest aus, um diesen Knoten zu löschen.
Darüber hinaus können wir auch weiterhin unter dem qyktest-Knoten untergeordnete Knoten erstellen.
Okay, ich werde über diese Person mit ein paar grundlegenden Befehlen sprechen. Es gibt viele andere Befehle.
3. Die Javaapi-Operation von Zookeeper ist relativ einfach. Der Autor hat den Code direkt wie folgt gepostet: Dann können Sie bei der Ausführung sehen, dass die Konsolenausgabe wie folgt aussieht: Also können wir sie, wie einige öffentliche Konfigurationen, in zookeeper speichern und dann können andere Dienste sie verwenden Zusammenfassungpackageorg.zookeeper.demo;
importjava.io.IOException;
importjava.util.concurrent.CountDownLatch;
importorg.apache.zookeeper.CreateMode;
importorg.apache.zookeeper.KeeperException;
importorg.apache.zookeeper.WatchedEvent;
importorg.apache.zookeeper.Watcher;
importorg.apache.zookeeper.Watcher.Event.KeeperState;
importorg.apache.zookeeper.ZooDefs.Ids;
importorg.apache.zookeeper.ZooKeeper;
publicclassZookeeperClientimplementsWatcher{
//连接超时时间,10s
privatestaticfinalintSESSION_TIMEOUT= 10000;
//连接的zookeeperserver
privatestaticfinalStringCONNECTION_STRING = "172.31.25.8:2181";
privatestaticfinalStringZK_PATH = "/qyktest";
privateZooKeeperzk = null;
privateCountDownLatchconnectedSemaphore = newCountDownLatch(1);
publicvoidcreateConnection(StringconnectString, intsessionTimeout){
this.releaseConnection();
try{
zk= newZooKeeper(connectString,sessionTimeout, this);
connectedSemaphore.await();
}catch(InterruptedExceptione) {
System.out.println("连接创建失败,发生InterruptedException");
e.printStackTrace();
}catch(IOExceptione) {
System.out.println("连接创建失败,发生IOException");
e.printStackTrace();
}
}
publicvoidreleaseConnection(){
if(this.zk!= null){
try{
this.zk.close();
}catch(InterruptedExceptione) {
e.printStackTrace();
}
}
}
publicbooleancreatePath(Stringpath, String data) {
try{
Stringresult = this.zk.create(path,data.getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
System.out.println("节点创建成功,Path: "+result + ", content: "+data);
}catch(KeeperExceptione) {
System.out.println("节点创建失败,发生KeeperException");
e.printStackTrace();
}catch(InterruptedExceptione) {
System.out.println("节点创建失败,发生InterruptedException");
e.printStackTrace();
}
returntrue;
}
publicStringreadData(Stringpath) {
try{
System.out.println("获取数据成功,path:"+path);
returnnewString(this.zk.getData(path,false,null));
}catch(KeeperExceptione) {
System.out.println("读取数据失败,发生KeeperException,path:"+path);
e.printStackTrace();
return"";
}catch(InterruptedExceptione) {
System.out.println("读取数据失败,发生InterruptedException,path: "+path);
e.printStackTrace();
return"";
}
}
publicbooleanwriteData(Stringpath, String data) {
try{
System.out.println("更新数据成功,path:"+path + ", stat: "+this.zk.setData(path,data.getBytes(), -1));
}catch(KeeperExceptione) {
System.out.println("更新数据失败,发生KeeperException,path:"+path);
e.printStackTrace();
}catch(InterruptedExceptione) {
System.out.println("更新数据失败,发生InterruptedException,path: "+path);
e.printStackTrace();
}
returnfalse;
}
publicvoiddeleteNode(Stringpath) {
try{
this.zk.delete(path,-1);
System.out.println("删除节点成功,path:"+path);
}catch(KeeperExceptione) {
System.out.println("删除节点失败,发生KeeperException,path:"+path);
e.printStackTrace();
}catch(InterruptedExceptione) {
System.out.println("删除节点失败,发生InterruptedException,path: "+path);
e.printStackTrace();
}
}
publicstaticvoidmain(String[]args) {
ZookeeperClientsample = newZookeeperClient();
//获取连接
sample.createConnection(CONNECTION_STRING,SESSION_TIMEOUT);
//读数据
Stringqyk = sample.readData("/qyktest");
System.out.println("qyk:"+qyk);
Stringurl = sample.readData("/qyk/db/url");
System.out.println("url"+url);
Stringdriver = sample.readData("/qyk/db/driver");
System.out.println("driver"+driver);
StringuserName = sample.readData("/qyk/db/userName");
System.out.println("userName"+userName);
Stringpassword = sample.readData("/qyk/db/password");
System.out.println("password"+password);
//创建节点
sample.createPath(ZK_PATH,"我是节点初始内容");
System.out.println("数据内容:"+sample.readData(ZK_PATH) + "\n");
//更新节点
sample.writeData(ZK_PATH,"更新后的数据");
System.out.println("数据内容:"+sample.readData(ZK_PATH) + "\n");
//删除节点
sample.deleteNode(ZK_PATH);
//释放连接
sample.releaseConnection();
}
@Override
publicvoidprocess(WatchedEventevent) {
System.out.println("收到事件通知:"+event.getState() + "\n");
if(KeeperState.SyncConnected== event.getState()) {
connectedSemaphore.countDown();
}
}
}
Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung der Verwendung von Zookeeper in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!