Kom godt i gang med Java og Zookeeper

1. Oversigt

Apache ZooKeeper er en distribueret koordinationstjeneste hvilket letter udviklingen af ​​distribuerede applikationer. Det bruges af projekter som Apache Hadoop, HBase og andre til forskellige brugssager som ledervalg, konfigurationsstyring, node-koordinering, server-lease-management osv.

Noder i ZooKeeper-klyngen gemmer deres data i et delt hierarkisk navneområde der ligner et standardfilsystem eller en treddatastruktur.

I denne artikel undersøger vi, hvordan du bruger Java API fra Apache Zookeeper til at gemme, opdatere og slette oplysninger, der er gemt i ZooKeeper.

2. Opsætning

Den seneste version af Apache ZooKeeper Java-biblioteket kan findes her:

 org.apache.zookeeper zookeeper 3.4.11 

3. ZooKeeper datamodel - ZNode

ZooKeeper har et hierarkisk navneområde, ligesom et distribueret filsystem, hvor det gemmer koordinationsdata som statusinformation, koordineringsinformation, placeringsinformation osv. Denne information gemmes på forskellige noder.

Hver knude i et ZooKeeper-træ kaldes ZNode.

Hver ZNode opretholder versionsnumre og tidsstempler for eventuelle data eller ACL-ændringer. Dette tillader også ZooKeeper at validere cachen og koordinere opdateringer.

4. Installation

4.1. Installation

Seneste ZooKeeper-udgivelse kan downloades herfra. Før vi gør det, skal vi sikre os, at vi opfylder systemkravene beskrevet her.

4.2. Uafhængig tilstand

I denne artikel kører vi ZooKeeper i en enkeltstående tilstand, da det kræver minimal konfiguration. Følg trinene beskrevet i dokumentationen her.

Bemærk: I standalone-tilstand er der ingen replikering, så hvis ZooKeeper-processen mislykkes, vil tjenesten gå ned.

5. Eksempler på ZooKeeper CLI

Vi bruger nu ZooKeeper Command Line Interface (CLI) til at interagere med ZooKeeper:

bin / zkCli.sh -server 127.0.0.1:2181

Ovenstående kommando starter en enkeltstående forekomst lokalt. Lad os nu se på, hvordan du opretter en ZNode og gemmer oplysninger i ZooKeeper:

[zk: localhost: 2181 (CONNECTED) 0] create / MyFirstZNode ZNodeVal Oprettet / FirstZnode

Vi har lige oprettet en ZNode 'MyFirstZNode' ved roden af ​​ZooKeeper hierarkisk navneområde og skrevet 'ZNodeVal' til det.

Da vi ikke har bestået noget flag, vil en oprettet ZNode være vedholdende.

Lad os nu udstede en 'få' kommando til at hente data samt metadata tilknyttet en ZNode:

[zk: localhost: 2181 (CONNECTED) 1] get / FirstZnode “Myfirstzookeeper-app” cZxid = 0x7f ctime = søn 18 feb 16:15:47 IST 2018 mZxid = 0x7f mtime = søn feb 18 16:15:47 IST 2018 pZxid = 0x7f konvertering = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 22 numChildren = 0

Vi kan opdatere dataene for en eksisterende ZNode bruger sæt operation.

For eksempel:

set / MyFirstZNode ZNodeValUpdated

Dette opdaterer dataene kl MyFirstZNode fra ZNodeVal til ZNodeValUpdated.

6. ZooKeeper Java API-eksempel

Lad os nu se på Zookeeper Java API og oprette en node, opdatere noden og hente nogle data.

6.1. Java-pakker

ZooKeeper Java-bindingerne består hovedsageligt af to Java-pakker:

  1. org.apache.zookeeper: som definerer hovedklassen i ZooKeeper-klientbiblioteket sammen med mange statiske definitioner af ZooKeeper-begivenhedstyper og -tilstande
  2. org.apache.zookeeper.data: der definerer de karakteristika, der er knyttet til ZNoder, såsom ACL (Access Control Lists), ID'er, statistik og så videre

Der er også ZooKeeper Java API'er, der bruges i serverimplementering som f.eks org.apache.zookeeper.server, org.apache.zookeeper.server.quorumog org.apache.zookeeper.server.upgrade.

De er dog uden for denne artikels anvendelsesområde.

6.2. Opretter forbindelse til en ZooKeeper-instans

Lad os nu oprette ZK-forbindelse klasse, der vil blive brugt til at oprette forbindelse og afbryde forbindelse fra en allerede kørende ZooKeeper:

offentlig klasse ZKConnection {privat ZooKeeper zoo; CountDownLatch connectionLatch = ny CountDownLatch (1); // ... offentlig ZooKeeper-forbindelse (String vært) kaster IOException, InterruptedException {zoo = ny ZooKeeper (vært, 2000, ny Watcher () {offentlig ugyldig proces (WatchedEvent we) {if (we.getState () == KeeperState. SyncConnected) {connectionLatch.countDown ();}}}); connectionLatch.await (); retur zoo; } offentlig tomrum tæt () kaster InterruptedException {zoo.close (); }}

For at bruge en ZooKeeper-tjeneste skal en applikation først instantiere et objekt fra Dyrepasser klasse, som er hovedklassen i ZooKeeper-klientbiblioteket.

I Opret forbindelse metode, vi instantierer en forekomst af Dyrepasser klasse. Vi har også registreret en tilbagekaldsmetode til at behandle WatchedEvent fra ZooKeeper for accept af forbindelse og afslut derefter Opret forbindelse metode ved hjælp af nedtælling metode til CountDownLatch.

Når en forbindelse til en server er oprettet, tildeles et session-id til klienten. For at holde sessionen gyldig, skal klienten regelmæssigt sende hjerterytme til serveren.

Klientapplikationen kan ringe til ZooKeeper API'er, så længe dets sessions-id forbliver gyldigt.

6.3. Klientoperationer

Vi opretter nu en ZKManager interface, der udsætter forskellige operationer som at oprette en ZNode og gemme nogle data, hente og opdatere ZNode Data:

offentlig grænseflade ZKManager {public void create (streng sti, byte [] data) kaster KeeperException, InterruptedException; public Object getZNodeData (strengsti, boolsk watchFlag); offentlig ugyldig opdatering (strengsti, byte [] data) kaster KeeperException, InterruptedException; }

Lad os nu se på implementeringen af ​​ovenstående interface:

offentlig klasse ZKManagerImpl implementerer ZKManager {privat statisk ZooKeeper zkeeper; privat statisk ZKConnection zkConnection; public ZKManagerImpl () {initialize (); } privat tomrum initialiseres () {zkConnection = ny ZKConnection (); zkeeper = zkConnection.connect ("localhost"); } offentlig tomrum closeConnection () {zkConnection.close (); } offentlig tomrum oprette (streng sti, byte [] data) kaster KeeperException, InterruptedException {zkeeper.create (sti, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } offentligt objekt getZNodeData (strengsti, boolsk watchFlag) kaster KeeperException, InterruptedException {byte [] b = null; b = zkeeper.getData (sti, null, null); returner ny streng (b, "UTF-8"); } offentlig ugyldig opdatering (streng sti, byte [] data) kaster KeeperException, InterruptedException {int version = zkeeper.exists (sti, sand) .getVersion (); zkeeper.setData (sti, data, version); }}

I ovenstående kode, Opret forbindelse og koble fra opkald delegeres til det tidligere oprettede ZK-forbindelse klasse. Vores skab metode bruges til at oprette en ZNode ved en given sti fra byte-array-dataene. Kun til demonstrationsformål har vi holdt ACL helt åben.

Når den er oprettet, er ZNode vedvarende og slettes ikke, når klienten afbryder forbindelsen.

Logikken til at hente ZNode-data fra ZooKeeper i vores getZNodeData metoden er ret ligetil. Endelig med opdatering metode kontrollerer vi tilstedeværelsen af ​​ZNode på en given sti og henter den, hvis den findes.

Derudover kontrollerer vi først for ZNode-eksistens for at opdatere dataene og få den aktuelle version. Derefter påberåber vi os setData metode med stien til ZNode, data og aktuel version som parametre. ZooKeeper opdaterer kun dataene, hvis den godkendte version matcher den nyeste version.

7. Konklusion

Ved udvikling af distribuerede applikationer spiller Apache ZooKeeper en kritisk rolle som en distribueret koordinationstjeneste. Specifikt til brugstilfælde som lagring af delt konfiguration, valg af masternode osv.

ZooKeeper leverer også en elegant Java-baseret API, der skal bruges i applikationskode på klientsiden til problemfri kommunikation med ZooKeeper ZNodes.

Og som altid kan alle kilder til denne vejledning findes på Github.


$config[zx-auto] not found$config[zx-overlay] not found