Komme i gang med Java og Zookeeper

1. Oversikt

Apache ZooKeeper er en distribuert koordineringstjeneste som letter utviklingen av distribuerte applikasjoner. Den brukes av prosjekter som Apache Hadoop, HBase og andre for forskjellige brukstilfeller som ledervalg, konfigurasjonsadministrasjon, nodekoordinering, serverleiehåndtering, etc.

Noder i ZooKeeper-klyngen lagrer dataene sine i et delt hierarkisk navneområde som ligner på et standard filsystem eller en tredatastruktur.

I denne artikkelen vil vi utforske hvordan du bruker Java API av Apache Zookeeper til å lagre, oppdatere og slette informasjon som er lagret i ZooKeeper.

2. Oppsett

Den siste versjonen av Apache ZooKeeper Java-biblioteket finner du her:

 org.apache.zookeeper dyrehage 3.4.11 

3. ZooKeeper datamodell - ZNode

ZooKeeper har et hierarkisk navneområde, omtrent som et distribuert filsystem hvor det lagrer koordineringsdata som statusinformasjon, koordineringsinformasjon, stedsinformasjon osv. Denne informasjonen lagres på forskjellige noder.

Hver node i et ZooKeeper-tre blir referert til som ZNode.

Hver ZNode opprettholder versjonsnumre og tidsstempler for data eller ACL-endringer. Dette lar ZooKeeper også validere hurtigbufferen og koordinere oppdateringer.

4. Installasjon

4.1. Installasjon

Den siste utgivelsen av ZooKeeper kan lastes ned herfra. Før vi gjør det, må vi sørge for at vi oppfyller systemkravene som er beskrevet her.

4.2. Frittstående modus

For denne artikkelen kjører vi ZooKeeper i frittstående modus, da det krever minimal konfigurasjon. Følg trinnene beskrevet i dokumentasjonen her.

Merk: I frittstående modus er det ingen replikering, så hvis ZooKeeper-prosessen mislykkes, vil tjenesten gå ned.

5. ZooKeeper CLI Eksempler

Vi bruker nå ZooKeeper Command Line Interface (CLI) til å samhandle med ZooKeeper:

bin / zkCli.sh -server 127.0.0.1:2181

Over kommando starter en frittstående forekomst lokalt. La oss nå se på hvordan du lager en ZNode og lagrer informasjon i ZooKeeper:

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

Vi har nettopp opprettet en ZNode ‘MyFirstZNode’ på roten av ZooKeeper hierarkisk navneområde og skrevet ‘ZNodeVal’ til det.

Siden vi ikke har passert noe flagg, vil en opprettet ZNode være vedvarende.

La oss nå utstede en 'få' kommando for å hente data samt metadata tilknyttet en ZNode:

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

Vi kan oppdatere dataene til en eksisterende ZNode bruker sett operasjon.

For eksempel:

set / MyFirstZNode ZNodeValUpdated

Dette vil oppdatere dataene på MyFirstZNode fra ZNodeVal til ZNodeValUpdated.

6. ZooKeeper Java API-eksempel

La oss nå se på Zookeeper Java API og opprette en node, oppdatere noden og hente inn noen data.

6.1. Java-pakker

ZooKeeper Java-bindinger består hovedsakelig av to Java-pakker:

  1. org.apache.zookeeper: som definerer hovedklassen i ZooKeeper-klientbiblioteket sammen med mange statiske definisjoner av ZooKeeper-hendelsestypene og -tilstandene
  2. org.apache.zookeeper.data: som definerer egenskapene knyttet til ZNoder, for eksempel tilgangskontrollister (ACL), ID-er, statistikk og så videre

Det er også ZooKeeper Java API-er som brukes i serverimplementering som org.apache.zookeeper.server, org.apache.zookeeper.server.quorum, og org.apache.zookeeper.server.upgrade.

Imidlertid er de utenfor omfanget av denne artikkelen.

6.2. Koble til en ZooKeeper-forekomst

La oss nå lage ZK-forbindelse klasse som skal brukes til å koble til og koble fra en allerede kjørende ZooKeeper:

offentlig klasse ZKConnection {privat ZooKeeper zoo; CountDownLatch connectionLatch = ny CountDownLatch (1); // ... public ZooKeeper connect (String host) kaster IOException, InterruptedException {zoo = new ZooKeeper (host, 2000, new Watcher () {public void process (WatchedEvent we) {if (we.getState () == KeeperState. SyncConnected) {connectionLatch.countDown ();}}}); connectionLatch.await (); retur zoo; } offentlig tomrom lukk () kaster InterruptedException {zoo.close (); }}

For å bruke en ZooKeeper-tjeneste må en applikasjon først sette i gang et objekt av Dyrepasser klasse, som er hovedklassen i ZooKeeper klientbibliotek.

I koble metoden, instanserer vi en forekomst av Dyrepasser klasse. Vi har også registrert en tilbakeringingsmetode for å behandle WatchedEvent fra ZooKeeper for tilkobling av aksept og fullfør deretter koble metoden bruker nedtelling Metode av CountDownLatch.

Når en forbindelse til en server er opprettet, tildeles en økt-ID klienten. For å holde økten gyldig, bør klienten regelmessig sende hjerterytme til serveren.

Klientapplikasjonen kan ringe ZooKeeper APIer så lenge økt-IDen forblir gyldig.

6.3. Kundedrift

Vi oppretter nå en ZKManager grensesnitt som avslører forskjellige operasjoner som å lage en ZNode og lagre noen data, hente og oppdatere ZNode Data:

offentlig grensesnitt ZKManager {public void create (strengbane, byte [] data) kaster KeeperException, InterruptedException; offentlig Object getZNodeData (strengbane, boolsk watchFlag); offentlig ugyldig oppdatering (strengbane, byte [] data) kaster KeeperException, InterruptedException; }

La oss nå se på implementeringen av grensesnittet ovenfor:

offentlig klasse ZKManagerImpl implementerer ZKManager {privat statisk ZooKeeper zkeeper; privat statisk ZKConnection zkConnection; offentlig ZKManagerImpl () {initialisere (); } privat tomrom initialiseres () {zkConnection = ny ZKConnection (); zkeeper = zkConnection.connect ("localhost"); } offentlig tomrom closeConnection () {zkConnection.close (); } offentlig tomrom opprette (strengbane, byte [] data) kaster KeeperException, InterruptedException {zkeeper.create (path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } offentlig Object getZNodeData (strengbane, boolsk watchFlag) kaster KeeperException, InterruptedException {byte [] b = null; b = zkeeper.getData (sti, null, null); returner ny streng (b, "UTF-8"); } offentlig ugyldig oppdatering (strengbane, byte [] data) kaster KeeperException, InterruptedException {int version = zkeeper.exists (path, true) .getVersion (); zkeeper.setData (sti, data, versjon); }}

I koden ovenfor, koble og koble fra samtaler delegeres til det tidligere opprettet ZK-forbindelse klasse. Våre skape metoden brukes til å opprette en ZNode ved gitt bane fra byte-arraydataene. Bare for demonstrasjonsformål har vi holdt ACL helt åpen.

Når den er opprettet, er ZNode vedvarende og blir ikke slettet når klienten kobler fra.

Logikken for å hente ZNode-data fra ZooKeeper i vår getZNodeData metoden er ganske grei. Til slutt, med Oppdater metode, sjekker vi tilstedeværelsen av ZNode på gitt sti og henter den hvis den eksisterer.

Utover det, for å oppdatere dataene, sjekker vi først om ZNode eksisterer og får den nåværende versjonen. Deretter påkaller vi setData metode med banen til ZNode, data og gjeldende versjon som parametere. ZooKeeper vil bare oppdatere dataene hvis den godkjente versjonen samsvarer med den siste versjonen.

7. Konklusjon

Når Apache ZooKeeper utvikler distribuerte applikasjoner, spiller den en viktig rolle som distribuert koordineringstjeneste. Spesielt for brukstilfeller som lagring av delt konfigurasjon, valg av hovednode og så videre.

ZooKeeper tilbyr også en elegant Java-basert API som skal brukes i applikasjonskode på klientsiden for sømløs kommunikasjon med ZooKeeper ZNodes.

Og som alltid, kan alle kilder for denne opplæringen finnes på Github.


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