ZooKeeper est un service de coordination d'applications distribuées et open source. Il s'agit d'une implémentation open source de Chubby de Google et d'un composant important de Hadoop et Hbase. Cet article partagera avec vous l'utilisation simple de zookeeper en java. Les amis qui en ont besoin peuvent s'y référer
1 Les principes de base de zookeeper
.modèle de données, comme suit :
La structure du modèle de données ZooKeeper est très similaire au système de fichiers Unix. être considéré comme un arbre, et chaque nœud est appelé Make a ZNode. Chaque ZNode peut être identifié de manière unique par son chemin. Par exemple, le premier ZNode de la troisième couche dans la figure ci-dessus a un chemin de /app1/c1. Une petite quantité de données peut être stockée sur chaque ZNode (la valeur par défaut est 1M, qui peut être modifiée via la configuration. Il n'est généralement pas recommandé de stocker de grandes quantités de données sur ZNode). Cette fonctionnalité est très utile. De plus, chaque ZNode stocke également ses informations Acl. Il convient de noter ici que bien que la structure arborescente de ZNode soit très similaire au système de fichiers Unix, son Acl est complètement différente du système de fichiers Unix. L'Acl de chaque ZNode est indépendante. , le nœud enfant n'héritera pas du nœud parent.
Fonctionnalités de ZooKeeper :
Mode lecture, écriture (mise à jour)
2. WAL et Snapshot
3. FIFO
4. Linéarisabilité
2. Commandes communes de zookeeper
Nous pouvons exécuter zookeeper-client ou /opt/cloudera/parcels/CDH-5.0.0 - 1.cdh5.0.0.p0.47/lib/zookeeper/bin/zkCli.sh-server localhost, entrez la ligne de commande zookeeper, comme suit :
3. Opération javaapi de Zookeeper
L'opération Javaapi de zookeeper est relativement simple. L'auteur a directement posté le code, comme suit :packageorg.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(); } } }
Ensuite, une fois exécuté, vous pouvez voir que la sortie de la console est la suivante :
Ainsi, comme certaines configurations publiques, nous pouvons les enregistrer dans zookeeper, puis d'autres services peuvent les utiliser
Résumé
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!