Aan de slag met Java en Zookeeper

1. Overzicht

Apache ZooKeeper is een gedistribueerde coördinatiedienst wat de ontwikkeling van gedistribueerde applicaties vergemakkelijkt. Het wordt gebruikt door projecten zoals Apache Hadoop, HBase en anderen voor verschillende gebruiksscenario's, zoals de verkiezing van leiders, configuratiebeheer, knooppuntcoördinatie, serverleasebeheer, enz.

Knooppunten binnen het ZooKeeper-cluster slaan hun gegevens op in een gedeelde hiërarchische naamruimte die vergelijkbaar is met een standaard bestandssysteem of een datastructuur in een boom.

In dit artikel zullen we onderzoeken hoe u de Java API van Apache Zookeeper kunt gebruiken om informatie die is opgeslagen in ZooKeeper op te slaan, bij te werken en te verwijderen.

2. Opstelling

De nieuwste versie van de Apache ZooKeeper Java-bibliotheek is hier te vinden:

 org.apache.zookeeper dierenverzorger 3.4.11 

3. ZooKeeper-gegevensmodel - ZNode

ZooKeeper heeft een hiërarchische naamruimte, net als een gedistribueerd bestandssysteem waar het coördinatiegegevens opslaat zoals statusinformatie, coördinatie-informatie, locatie-informatie, enz. Deze informatie wordt opgeslagen op verschillende knooppunten.

Elk knooppunt in een ZooKeeper-structuur wordt ZNode genoemd.

Elke ZNode onderhoudt versienummers en tijdstempels voor gegevens of ACL-wijzigingen. Hierdoor kan ZooKeeper ook de cache valideren en updates coördineren.

4. Installatie

4.1. Installatie

De nieuwste release van ZooKeeper kan hier worden gedownload. Voordat we dat doen, moeten we ervoor zorgen dat we voldoen aan de systeemvereisten die hier worden beschreven.

4.2. Standalone-modus

Voor dit artikel gebruiken we ZooKeeper in een stand-alone modus, aangezien het minimale configuratie vereist. Volg de stappen die hier in de documentatie worden beschreven.

Opmerking: in de stand-alone modus is er geen replicatie, dus als het ZooKeeper-proces mislukt, gaat de service uit.

5. ZooKeeper CLI-voorbeelden

We zullen nu de ZooKeeper Command Line Interface (CLI) gebruiken om te communiceren met ZooKeeper:

bin / zkCli.sh -server 127.0.0.1:2181

Bovenstaande opdracht start lokaal een zelfstandige instantie. Laten we nu kijken hoe we een ZNode kunnen maken en informatie kunnen opslaan in ZooKeeper:

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

We hebben zojuist een ZNode gemaakt ‘MyFirstZNode’ in de root van de hiërarchische naamruimte van ZooKeeper en geschreven ‘ZNodeVal’ eraan.

Omdat we geen vlag hebben gepasseerd, zal een gemaakte ZNode blijvend zijn.

Laten we nu een 'krijgen' opdracht om zowel de gegevens als de metagegevens op te halen die zijn gekoppeld aan een 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 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 22 aantalChildren = 0

We kunnen de gegevens van een bestaand ZNode de ... gebruiken set operatie.

Bijvoorbeeld:

set / MyFirstZNode ZNodeValUpdated

Hiermee worden de gegevens bijgewerkt op MyFirstZNode van ZNodeVal naar ZNodeVal Bijgewerkt.

6. ZooKeeper Java API-voorbeeld

Laten we nu eens kijken naar Zookeeper Java API en een knooppunt maken, het knooppunt bijwerken en wat gegevens ophalen.

6.1. Java-pakketten

De ZooKeeper Java-bindingen bestaan ​​voornamelijk uit twee Java-pakketten:

  1. org.apache.zookeeper: die de hoofdklasse van de ZooKeeper-clientbibliotheek definieert, samen met vele statische definities van de ZooKeeper-gebeurtenistypen en statussen
  2. org.apache.zookeeper.data: dat de kenmerken definieert die zijn gekoppeld aan ZNodes, zoals toegangscontrolelijsten (ACL), ID's, statistieken, enzovoort

Er zijn ook ZooKeeper Java-API's die worden gebruikt bij serverimplementatie, zoals org.apache.zookeeper.server, org.apache.zookeeper.server.quorum, en org.apache.zookeeper.server.upgrade.

Ze vallen echter buiten het bestek van dit artikel.

6.2. Verbinding maken met een ZooKeeper-instantie

Laten we nu creëren ZKConnection klasse die zal worden gebruikt om verbinding te maken en de verbinding te verbreken met een al draaiende ZooKeeper:

openbare klasse ZKConnection {privé ZooKeeper-dierentuin; CountDownLatch connectionLatch = nieuwe CountDownLatch (1); // ... public ZooKeeper connect (String host) gooit IOException, InterruptedException {zoo = nieuwe ZooKeeper (host, 2000, nieuwe Watcher () {public void process (WatchedEvent we) {if (we.getState () == KeeperState. SyncConnected) {connectionLatch.countDown ();}}}); connectionLatch.await (); terugkeer dierentuin; } public void close () gooit InterruptedException {zoo.close (); }}

Om een ​​ZooKeeper-service te gebruiken, moet een toepassing eerst een object van Dierentuinmedewerker class, de hoofdklasse van de ZooKeeper-clientbibliotheek.

In aansluiten methode, instantiëren we een instantie van Dierentuinmedewerker klasse. We hebben ook een callback-methode geregistreerd om het WatchedEvent van ZooKeeper voor acceptatie van de verbinding en dienovereenkomstig het aansluiten methode gebruiken aftellen methode van CountDownLatch.

Zodra een verbinding met een server tot stand is gebracht, wordt een sessie-ID toegewezen aan de client. Om de sessie geldig te houden, moet de client periodiek heartbeats naar de server sturen.

De clienttoepassing kan ZooKeeper-API's aanroepen zolang de sessie-ID geldig blijft.

6.3. Klantactiviteiten

We gaan nu een ZKManager interface die verschillende bewerkingen toont, zoals het maken van een ZNode en het opslaan van enkele gegevens, het ophalen en bijwerken van de ZNode-gegevens:

publieke interface ZKManager {public void create (String path, byte [] data) gooit KeeperException, InterruptedException; openbaar object getZNodeData (String path, boolean watchFlag); public void update (String path, byte [] data) gooit KeeperException, InterruptedException; }

Laten we nu eens kijken naar de implementatie van de bovenstaande interface:

openbare klasse ZKManagerImpl implementeert ZKManager {privé statische ZooKeeper zkeeper; privé statische ZKConnection zkConnection; openbare ZKManagerImpl () {initialiseren (); } private void initialize () {zkConnection = nieuwe ZKConnection (); zkeeper = zkConnection.connect ("localhost"); } openbare leegte closeConnection () {zkConnection.close (); } public void create (String path, byte [] data) gooit KeeperException, InterruptedException {zkeeper.create (pad, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } public Object getZNodeData (String path, boolean watchFlag) gooit KeeperException, InterruptedException {byte [] b = null; b = zkeeper.getData (pad, null, null); retourneer nieuwe String (b, "UTF-8"); } public void update (String path, byte [] data) gooit KeeperException, InterruptedException {int version = zkeeper.exists (path, true) .getVersion (); zkeeper.setData (pad, data, versie); }}

In de bovenstaande code, aansluiten en verbinding verbreken oproepen worden gedelegeerd naar de eerder gemaakte ZKConnection klasse. Onze creëren methode wordt gebruikt om een ​​ZNode op een bepaald pad te maken op basis van de byte-array-gegevens. Alleen voor demonstratiedoeleinden hebben we ACL volledig open gehouden.

Eenmaal gemaakt, is de ZNode persistent en wordt deze niet verwijderd wanneer de client de verbinding verbreekt.

De logica om ZNode-gegevens van ZooKeeper op te halen in onze getZNodeData methode is vrij eenvoudig. Eindelijk, met de bijwerken methode, we controleren de aanwezigheid van ZNode op het gegeven pad en halen het op als het bestaat.

Daarnaast controleren we voor het bijwerken van de gegevens eerst op het bestaan ​​van ZNode en halen we de huidige versie op. Vervolgens roepen we de setData methode met het pad van ZNode, data en huidige versie als parameters. ZooKeeper werkt de gegevens alleen bij als de doorgegeven versie overeenkomt met de laatste versie.

7. Conclusie

Bij het ontwikkelen van gedistribueerde applicaties speelt Apache ZooKeeper een cruciale rol als gedistribueerde coördinatiedienst. Specifiek voor gebruiksscenario's zoals het opslaan van een gedeelde configuratie, het kiezen van het masterknooppunt, enzovoort.

ZooKeeper biedt ook elegante Java-gebaseerde API's die kunnen worden gebruikt in applicatiecode aan de clientzijde voor naadloze communicatie met ZooKeeper ZNodes.

En zoals altijd zijn alle bronnen voor deze tutorial te vinden op Github.