Početak rada s Javom i Zookeeperom

1. Pregled

Apache ZooKeeper distribuirana je koordinacijska služba što olakšava razvoj distribuiranih aplikacija. Koriste ga projekti poput Apache Hadoop, HBase i drugih za različite slučajeve upotrebe kao što su izbor čelnika, upravljanje konfiguracijom, koordinacija čvorova, upravljanje zakupom poslužitelja itd.

Čvorovi unutar ZooKeeper klastera pohranjuju svoje podatke u dijeljeni hijerarhijski prostor imena što je slično standardnom datotečnom sustavu ili strukturi podataka stabla.

U ovom ćemo članku istražiti kako koristiti Java API Apache Zookeeper za pohranu, ažuriranje i brisanje podataka pohranjenih u ZooKeeper-u.

2. Postaviti

Najnoviju verziju Apache ZooKeeper Java biblioteke možete pronaći ovdje:

 org.apache.zookeeper čuvar zoološkog vrta 3.4.11 

3. ZooKeeper podatkovni model - ZNode

ZooKeeper ima hijerarhijski prostor imena, slično poput distribuiranog datotečnog sustava u kojem pohranjuje podatke o koordinaciji kao što su podaci o statusu, podaci o koordinaciji, podaci o lokaciji itd. Ti se podaci pohranjuju na različitim čvorovima.

Svaki čvor u stablu ZooKeeper naziva se ZNode.

Svaki ZNode održava brojeve verzija i vremenske oznake za bilo kakve promjene podataka ili ACL-a. To također omogućuje ZooKeeperu da provjeri valjanost predmemorije i koordinira ažuriranja.

4. Instalacija

4.1. Montaža

Najnovije izdanje ZooKeeper možete preuzeti ovdje. Prije nego što to učinimo, moramo biti sigurni da ispunjavamo ovdje opisane zahtjeve sustava.

4.2. Samostalni način rada

Za ovaj ćemo članak ZooKeeper pokretati u samostalnom načinu jer zahtijeva minimalnu konfiguraciju. Slijedite korake opisane u dokumentaciji ovdje.

Napomena: U samostalnom načinu nema replikacije, pa ako postupak ZooKeeper ne uspije, usluga će se isključiti.

5. ZooKeeper CLI primjeri

Sada ćemo koristiti ZooKeeper sučelje naredbenog retka (CLI) za interakciju sa ZooKeeperom:

bin / zkCli.sh -server 127.0.0.1:2181

Iznad naredba lokalno pokreće samostalnu instancu. Pogledajmo sada kako stvoriti ZNode i pohraniti podatke u ZooKeeper:

[zk: localhost: 2181 (POVEZAN) 0] create / MyFirstZNode ZNodeVal Created / FirstZnode

Upravo smo stvorili ZNode ‘MyFirstZNode’ u korijenu hijerarhijskog prostora imena ZooKeeper i napisan ‘ZNodeVal’ tome.

Budući da nismo proslijedili nijednu zastavicu, stvoreni ZNode bit će uporan.

Ajmo sada izdati a 'dobiti' naredba za dohvaćanje podataka kao i metapodataka povezanih sa ZNodeom:

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

Možemo ažurirati podatke postojeće ZNode koristiti postavljen operacija.

Na primjer:

set / MyFirstZNode ZNodeValUpdated

Ovo će ažurirati podatke na MyFirstZNode iz ZNodeVal do ZNodeValUpdated.

6. Primjer ZooKeeper Java API-ja

Pogledajmo sada Zookeeper Java API i stvorimo čvor, ažuriramo čvor i dohvatimo neke podatke.

6.1. Java paketi

Java vezivanja ZooKeeper sastoje se uglavnom od dva Java paketa:

  1. org.apache.zookeeper: koji definira glavnu klasu klijentske knjižnice ZooKeeper, zajedno s mnogim statičkim definicijama tipova i stanja ZooKeeper
  2. org.apache.zookeeper.data: koji definira karakteristike povezane sa ZNodovima, kao što su popisi za kontrolu pristupa (ACL), ID-ovi, statistika i tako dalje

Tu su i ZooKeeper Java API-ji koji se koriste u implementaciji poslužitelja, poput org.apache.zookeeper.server, org.apache.zookeeper.server.quorum, i org.apache.zookeeper.server.upgrade.

Međutim, oni su izvan dosega ovog članka.

6.2. Povezivanje s instancom ZooKeeper

Ajmo sada stvarati ZKConnection klasa koja će se koristiti za spajanje i prekidanje veze s već pokrenutim ZooKeeperom:

javna klasa ZKConnection {privatni zoološki vrt ZooKeeper; CountDownLatch connectionLatch = novi CountDownLatch (1); // ... javno povezivanje ZooKeeper-a (string string) baca IOException, InterruptedException {zoo = new ZooKeeper (host, 2000, new Watcher () {public void process (WatchedEvent we) {if (we.getState () == KeeperState. SyncConnected) {connectionLatch.countDown ();}}}); connectionLatch.await (); povratak zoološki vrt; } public void close () baca InterruptedException {zoo.close (); }}

Da bi koristila uslugu ZooKeeper, aplikacija mora prvo instancirati objekt od Čuvar zoo vrta klase, koja je glavna klasa ZooKeeper knjižnice klijenata.

U Spojiti metodom, instanciramo instancu Čuvar zoo vrta razred. Također, registrirali smo metodu povratnog poziva za obradu WatchedEvent od ZooKeepera za prihvaćanje veze i u skladu s tim dovršite Spojiti metoda pomoću odbrojavanje metoda CountDownLatch.

Jednom kada se uspostavi veza s poslužiteljem, klijentu se dodjeljuje ID sesije. Da bi sesija bila valjana, klijent bi trebao povremeno slati otkucaje srca poslužitelju.

Klijentska aplikacija može pozivati ​​ZooKeeper API-je sve dok njezin ID sesije ostaje valjan.

6.3. Klijentske operacije

Sada ćemo stvoriti ZKManager sučelje koje izlaže različite operacije poput stvaranja ZNode i spremanja nekih podataka, dohvaćanja i ažuriranja ZNode podataka:

javno sučelje ZKManager {public void create (String path, byte [] data) baca KeeperException, InterruptedException; javni objekt getZNodeData (put niza, logički watchFlag); javno prazno ažuriranje (put niza, bajt [] podaci) baca KeeperException, InterruptedException; }

Pogledajmo sada provedbu gornjeg sučelja:

javna klasa ZKManagerImpl implementira ZKManager {privatni statički ZooKeeper zkeeper; privatna statička ZKConnection zkConnection; javni ZKManagerImpl () {initialize (); } privatna void inicijalizacija () {zkConnection = nova ZKConnection (); zkeeper = zkConnection.connect ("localhost"); } javna void closeConnection () {zkConnection.close (); } public void create (String path, byte [] data) baca KeeperException, InterruptedException {zkeeper.create (path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } javni objekt getZNodeData (put niza, logički watchFlag) baca KeeperException, InterruptedException {byte [] b = null; b = zkeeper.getData (put, null, null); vrati novi niz (b, "UTF-8"); } javno void ažuriranje (put niza, bajt [] podaci) baca KeeperException, InterruptedException {int version = zkeeper.exists (path, true) .getVersion (); zkeeper.setData (put, podaci, verzija); }}

U gornjem kodu, Spojiti i odspojiti pozivi se delegiraju ranije stvorenom ZKConnection razred. Naše stvoriti metoda koristi se za stvaranje ZNodea na zadanoj putanji od podataka bajt polja. Samo u svrhu demonstracije, ACL smo držali potpuno otvorenim.

Jednom stvoren, ZNode je postojan i ne briše se kada se klijent prekine.

Logika dohvaćanja ZNode podataka iz ZooKeeper-a u našem getZNodeData metoda je sasvim jednostavna. Napokon, s ažuriranje metodom provjeravamo prisutnost ZNodea na zadanoj putanji i dohvaćamo ga ako postoji.

Osim toga, za ažuriranje podataka prvo provjeravamo postoji li ZNode i dobivamo trenutnu verziju. Zatim pozivamo setData metoda s putanjom ZNodea, podataka i trenutne verzije kao parametara. ZooKeeper će ažurirati podatke samo ako se prenesena verzija podudara s najnovijom verzijom.

7. Zaključak

Pri razvoju distribuiranih aplikacija, Apache ZooKeeper igra ključnu ulogu kao distribuirana usluga koordinacije. Konkretno za slučajeve upotrebe poput pohrane zajedničke konfiguracije, odabira glavnog čvora i tako dalje.

ZooKeeper također nudi elegantne API-je temeljene na Javi koji se koriste u kodu aplikacije na strani klijenta za neometanu komunikaciju sa ZooKeeper ZNodes.

Kao i uvijek, svi izvori za ovaj vodič mogu se naći na Githubu.


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