Maison > Java > javaDidacticiel > le corps du texte

Explication détaillée de l'utilisation de zookeeper en Java

黄舟
Libérer: 2017-09-28 09:37:56
original
5637 Les gens l'ont consulté

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)

Dans le cluster ZooKeeper, les lectures peuvent être lues à partir de n'importe quel ZooKeeperServer. C'est la clé pour garantir de meilleures performances de lecture de ZooKeeper ; les demandes d'écriture seront d'abord transmises au Leader, puis le Leader passera par le cluster. ZooKeeper Le protocole de diffusion atomique diffuse la demande à tous les abonnés. Une fois que le leader a reçu plus de la moitié des accusés de réception d'une écriture réussie, il considère que l'écriture est réussie, persiste et indique au client que l'écriture est réussie.

2. WAL et Snapshot

Comme la plupart des systèmes distribués, ZooKeeper dispose également de WAL (Write-Ahead-Log) pour chaque opération de mise à jour, ZooKeeper le fera d'abord. écrivez WAL, puis mettez à jour les données en mémoire, puis informez le client des résultats de la mise à jour. De plus, ZooKeeper prendra également régulièrement des instantanés de l'arborescence des répertoires dans la mémoire et les stockera sur le disque. Ceci est similaire à FSImage dans HDFS. L'objectif principal de cette opération est bien sûr la persistance des données, et le second est d'accélérer la récupération après le redémarrage. Si tout est restauré via ReplayWAL, cela sera plus lent.

3. FIFO

Pour chaque client ZooKeeper, toutes les opérations suivent l'ordre FIFO. Cette fonctionnalité est pilotée par les deux suivantes. Elle est garantie par plusieurs fonctionnalités de base. : premièrement, la communication réseau entre ZooKeeper Client et Server est basée sur TCP, et TCP garantit l'ordre de transmission des paquets entre Client/Serveur ; deuxièmement, ZooKeeper Server exécute les requêtes du client en stricte conformité avec l'ordre FIFO.

4. Linéarisabilité

Dans ZooKeeper, toutes les opérations de mise à jour ont une relation d'ordre partiel stricte et les opérations de mise à jour sont exécutées en série. clé pour garantir l’exactitude de la fonctionnalité ZooKeeper.

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 :



Ensuite, exécutez ls / et vous pouvez voir :




Ensuite, nous pouvons exécuter create /qyktest 'qyktest' pour créer un nœud, comme suit :



Ensuite, nous exécutons get /qyktest pour obtenir la valeur du nœud, comme suit :




Ensuite, nous pouvons exécuter set /qyktest'111' pour modifier la valeur du nœud, comme suit :




Enfin, nous exécutons delete /qyktest pour supprimer ce nœud.


De plus, nous pouvons également continuer à créer des nœuds enfants sous le nœud qyktest.


D'accord, je vais parler de cette personne avec quelques commandes de base. Il existe de nombreuses autres commandes. Vous pouvez vérifier les informations.

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();
}
}
}
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal