En hurtig guide til Apache Geode

1. Oversigt

Apache Geode er et distribueret hukommelsesdatagitter, der understøtter caching og dataregistrering.

I denne vejledning dækker vi Geodes nøglekoncepter og løber gennem nogle kodeeksempler ved hjælp af sin Java-klient.

2. Opsætning

Først skal vi downloade og installere Apache Geode og indstille gfsh miljø. For at gøre dette kan vi følge instruktionerne i Geodes officielle guide.

Og for det andet opretter denne tutorial nogle artefakter til filsystemer. Så vi kan isolere dem ved at oprette en midlertidig mappe og starte ting derfra.

2.1. Installation og konfiguration

Fra vores midlertidige mappe skal vi starte en Finder eksempel:

gfsh> start locator - navn = locator - bind-adresse = localhost

Findere er ansvarlige for koordineringen mellem forskellige medlemmer af en Geode Klynge, som vi yderligere kan administrere via JMX.

Lad os derefter starte en Server eksempel for at være vært for en eller flere data Områdes:

gfsh> start server - navn = server1 - server-port = 0

Vi indstiller –Server-port mulighed til 0, så Geode vælger enhver tilgængelig port. Skønt vi udelader det, bruger serveren standardporten 40404. En server er et konfigurerbart medlem af Klynge der kører som en langvarig proces og er ansvarlig for styring af data Regioner.

Og endelig har vi brug for en Område:

gfsh> Opret region - navn = baeldung - type = REPLIKAT

Det Område er i sidste ende det sted, hvor vi gemmer vores data.

2.2. Verifikation

Lad os sørge for, at vi har alt, inden vi går videre.

Lad os først kontrollere, om vi har vores Server og vores Finder:

gfsh> liste medlemmer Navn | Id ------- | -------------------------------------------------- -------- server1 | 192.168.0.105 (server1: 6119): 1024 lokalisering | 127.0.0.1 (locator: 5996: locator): 1024 [Koordinator]

Og derefter, at vi har vores Område:

gfsh> beskriv region --navn = baeldung ......................................... ................. Navn: baeldung Datapolitik: replikere Hosting-medlemmer: server1 Ikke-standardattributter Delt af Hosting Medlemmer Type | Navn | Værdi ------ | ----------- | --------------- Region | datapolitik | REPLIKAT | størrelse | 0 | rækkevidde | distribueret-ack

Vi skal også have nogle mapper på filsystemet under vores midlertidige mappe kaldet "locator" og "server1".

Med dette output ved vi, at vi er klar til at komme videre.

3. Maven-afhængighed

Nu hvor vi har en kørende Geode, lad os begynde at se på klientkoden.

For at arbejde med Geode i vores Java-kode skal vi tilføje Apache Geode Java-klientbiblioteket til vores pom:

 org.apache.geode geode-core 1.6.0 

Lad os begynde med blot at gemme og hente nogle data i et par regioner.

4. Enkel opbevaring og hentning

Lad os demonstrere, hvordan man gemmer enkeltværdier, batcher af værdier såvel som brugerdefinerede objekter.

For at begynde at gemme data i vores "baeldung" -region, lad os oprette forbindelse til dem ved hjælp af lokalisatoren:

@Før offentlig tomrumsforbindelse () {this.cache = ny ClientCacheFactory () .addPoolLocator ("localhost", 10334) .create (); this.region = cache. createClientRegionFactory (ClientRegionShortcut.CACHING_PROXY) .create ("baeldung"); }

4.1. Gemme enkeltværdier

Nu kan vi simpelthen gemme og hente data i vores region:

@Test offentligt ugyldigt nårSendMessageToRegion_thenMessageSavedSuccessfully () {this.region.put ("A", "Hello"); this.region.put ("B", "Baeldung"); assertEquals ("Hej", region.get ("A")); assertEquals ("Baeldung", region.get ("B")); }

4.2. Gemme flere værdier på én gang

Vi kan også gemme flere værdier på én gang, f.eks. Når vi prøver at reducere netværksforsinkelse:

@Test offentlig ugyldig nårPutMultipleValuesAtOnce_thenValuesSavedSuccessfully () {Leverandør nøgler = () -> Stream.of ("A", "B", "C", "D", "E"); Kortværdier = keys.get () .collect (Collectors.toMap (Function.identity (), String :: toLowerCase)); this.region.putAll (værdier); keys.get () .forEach (k -> assertEquals (k.toLowerCase (), this.region.get (k))); }

4.3. Gemme brugerdefinerede objekter

Strenge er nyttige, men hurtigere end senere skal vi gemme brugerdefinerede objekter.

Lad os forestille os, at vi har en kundeoptegnelse, som vi vil gemme ved hjælp af følgende nøgletype:

offentlig klasse CustomerKey implementerer Serialiserbar {privat lang id; privat strengland; // getters og setter // er lig med og hashcode}

Og følgende værditype:

offentlig klasse kunde implementerer Serialiserbar {privat CustomerKey nøgle; privat streng fornavn; privat streng efternavn; privat heltalealder // getters og setters}

Der er et par ekstra trin for at kunne gemme disse:

Først, de skal implementere Serialiserbar. Selvom dette ikke er et strengt krav, ved at gøre dem Serialiserbar, Geode kan gemme dem mere robust.

Sekund, de skal være på vores applikations klassesti såvel som klassestien til vores Geode Server.

For at få dem til serverens klassesti, lad os pakke dem sammen, siger ved hjælp af mvn ren pakke.

Og så kan vi henvise til den resulterende krukke i en ny start server kommando:

gfsh> stop server - navn = server1 gfsh> start server - navn = server1 - classpath = .. / lib / apache-geode-1.0-SNAPSHOT.jar - server-port = 0

Igen skal vi køre disse kommandoer fra den midlertidige mappe.

Lad os endelig oprette en ny Område navngivet "baeldung-kunder" på Server ved hjælp af den samme kommando, som vi brugte til at oprette "baeldung" -regionen:

gfsh> Opret region - navn = baeldung-kunder - type = REPLIKAT

I koden når vi ud til locatoren som før og specificerer den brugerdefinerede type:

@Før offentlig ugyldig forbindelse () {// ... forbind via lokalisatoren this.customerRegion = this.cache. createClientRegionFactory (ClientRegionShortcut.CACHING_PROXY) .create ("baeldung-kunder"); }

Og så kan vi gemme vores kunde som før:

@Test offentlig ugyldig nårPutCustomKey_thenValuesSavedSuccessfully () {CustomerKey key = new CustomerKey (123); Kundekunde = ny kunde (nøgle, "William", "Russell", 35); this.customerRegion.put (nøgle, kunde); Kunden har gemtKunde = this.customerRegion.get (nøgle); assertEquals ("William", storedCustomer.getFirstName ()); assertEquals ("Russell", storedCustomer.getLastName ()); }

5. Regionstyper

I de fleste miljøer har vi mere end en kopi eller mere end en partition af vores region, afhængigt af vores krav til læsning og skrivning.

Indtil videre har vi brugt replikerede regioner i hukommelsen. Lad os se nærmere på.

5.1. Replikeret region

Som navnet antyder, -en Replikeret region opbevarer kopier af sine data på mere end en Server. Lad os teste dette.

Fra gfsh konsol i arbejdsmappen, lad os tilføje en mere Server som hedder server2 til klyngen:

gfsh> start server - navn = server2 - classpath = .. / lib / apache-geode-1.0-SNAPSHOT.jar - server-port = 0

Husk, at når vi lavede "baeldung", brugte vi –Type = REPLIKAT. På grund af dette, Geode replikerer automatisk vores data til den nye server.

Lad os kontrollere dette ved at stoppe server1:

gfsh> stop server - navn = server1

Og så lad os udføre en hurtig forespørgsel på "baeldung" -regionen.

Hvis dataene blev replikeret med succes, får vi resultaterne tilbage:

gfsh> forespørgsel - forespørgsel = 'vælg e.tast fra /baeldung.indgange e' Resultat: sand Grænse: 100 rækker: 5 Resultat ------ C B A E D

Så det ser ud til, at replikeringen lykkedes!

Tilføjelse af en replika til vores region forbedrer datatilgængeligheden. Og fordi mere end én server kan svare på forespørgsler, får vi også højere læsegennemstrømning.

Men, hvad hvis de begge går ned? Da dette er regioner i hukommelsen, går dataene tabt.Til dette kan vi i stedet bruge –Type = REPLICATE_PERSISTENT som også gemmer dataene på disken under replikering.

5.2. Partitioneret region

Med større datasæt kan vi bedre skalere systemet ved at konfigurere Geode til at opdele en region op i separate partitioner eller spande.

Lad os oprette en partitioneret Område navngivet "baeldung-partitioned":

gfsh> Opret region - navn = baeldung-partitioneret - type = PARTITION

Tilføj nogle data:

gfsh> put --region = baeldung-partitioneret --key = "1" --value = "one" gfsh> put --region = baeldung-partitioned --key = "2" --value = "two" gfsh> sæt --region = baeldung-partitioneret --key = "3" - værdi = "tre"

Og bekræft hurtigt:

gfsh> forespørgsel - forespørgsel = 'vælg e.key, e.value fra /baeldung-partitioned.entries e' Resultat: sand Grænse: 100 rækker: 3 nøgle | værdi --- | ----- 2 | to 1 | en 3 | tre

Lad os derefter stoppe for at validere, at dataene blev partitioneret server1 igen og forespørgsel:

gfsh> stop server - navn = server1 gfsh> forespørgsel - forespørgsel = 'vælg e.key, e.værdi fra /baeldung-partitioned.entries e' Resultat: sand Grænse: 100 rækker: 1 nøgle | værdi --- | ----- 2 | to

Vi fik kun nogle af dataposterne tilbage denne gang, fordi serveren kun har en partition af dataene, så hvornår server1 faldt, dets data gik tabt.

Men hvad hvis vi har brug for både partitionering og redundans? Geode understøtter også en række andre typer. Følgende tre er nyttige:

  • PARTITION_REDUNDANT skillevægge og replikerer vores data på tværs af forskellige medlemmer af klyngen
  • PARTITION_PERSISTENT partitionerer dataene ligesom SKILLEVÆG, men til disk, og
  • PARTITION_REDUNDANT_PERSISTENT giver os alle tre adfærd.

6. Objektforespørgselssprog

Geode understøtter også Object Query Language eller OQL, som kan være mere kraftfuld end en simpel nøgleopslag. Det er lidt som SQL.

Lad os i dette eksempel bruge regionen "baeldung-kunde", vi byggede tidligere.

Hvis vi tilføjer et par flere kunder:

Kortdata = nyt HashMap (); data.put (ny CustomerKey (1), ny kunde ("Gheorge", "Manuc", 36)); data.put (ny CustomerKey (2), ny kunde ("Allan", "McDowell", 43)); this.customerRegion.putAll (data);

Så kan vi bruge QueryService at finde kunder, hvis fornavn er “Allan”:

QueryService queryService = this.cache.getQueryService (); Strengeforespørgsel = "vælg * fra / baeldung-kunder c hvor c.firstName = 'Allan'"; SelectResults resultater = (SelectResults) queryService.newQuery (forespørgsel). Execute (); assertEquals (1, results.size ());

7. Funktion

En af de stærkere forestillinger om datanet i hukommelsen er ideen om "at tage beregningerne til dataene".

Kort sagt, da Geode er ren Java, det er let for os ikke kun at sende data, men også logik til at udføre disse data.

Dette kan minde os om ideen om SQL-udvidelser som PL-SQL eller Transact-SQL.

7.1. Definition af en funktion

For at definere en arbejdsenhed, som Geode skal udføre,vi implementerer Geodes Fungere interface.

Lad os for eksempel forestille os, at vi har brug for at ændre alle kundens navne til store bogstaver.

I stedet for at stille spørgsmål til dataene og lade vores applikation udføre arbejdet, kan vi bare implementere dem Fungere:

public class UpperCaseNames implementerer Funktion {@Override public void execute (FunctionContext context) {RegionFunctionContext regionContext = (RegionFunctionContext) context; Region region = regionContext.getDataSet (); for (Map.Entry entry: region.entrySet ()) {Customer customer = entry.getValue (); customer.setFirstName (customer.getFirstName (). toUpperCase ()); } context.getResultSender (). lastResult (true); } @ Override public String getId () {return getClass (). GetName (); }}

Noter det getId skal returnere en unik værdi, så klassens navn er typisk et godt valg.

Det FunctionContext indeholder alle vores regiondata, og så kan vi foretage en mere sofistikeret forespørgsel ud af det, eller, som vi har gjort her, mutere det.

Og Fungere har meget mere magt end dette, så tjek den officielle manual, især getResultSender metode.

7.2. Implementeringsfunktion

Vi skal gøre Geode opmærksom på vores funktion for at kunne køre den. Som vi gjorde med vores tilpassede datatyper, pakker vi krukken.

Men denne gang kan vi bare bruge indsætte kommando:

gfsh> deploy --jar =. / lib / apache-geode-1.0-SNAPSHOT.jar

7.3. Udførelsesfunktion

Nu kan vi udføre Fungere fra applikationen ved hjælp af FunctionService:

@Test offentlig ugyldig nårExecuteUppercaseNames_thenCustomerNamesAreUppercased () {Execution executing = FunctionService.onRegion (this.customerRegion); udførelse. udfør (UpperCaseNames.class.getName ()); Kundekunde = this.customerRegion.get (ny CustomerKey (1)); assertEquals ("GHEORGE", customer.getFirstName ()); }

8. Konklusion

I denne artikel lærte vi de grundlæggende begreber i Apache Geode økosystem. Vi kiggede på enkle få og sæt med standard- og brugerdefinerede typer, replikerede og partitionerede regioner og oql- og funktionssupport.

Og som altid er alle disse prøver tilgængelige på GitHub.


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