En rask guide til Apache Geode

1. Oversikt

Apache Geode er et distribuert datanett i minnet som støtter caching og dataregning.

I denne opplæringen vil vi dekke Geodes nøkkelkonsepter og kjøre gjennom noen kodeeksempler ved hjelp av Java-klienten.

2. Oppsett

Først må vi laste ned og installere Apache Geode og sette gfsh miljø. For å gjøre dette kan vi følge instruksjonene i Geodes offisielle guide.

Og for det andre vil denne opplæringen lage noen artefakter for filsystemer. Så vi kan isolere dem ved å opprette en midlertidig katalog og starte ting derfra.

2.1. Installasjon og konfigurasjon

Fra vår midlertidige katalog må vi starte en Locator forekomst:

gfsh> start locator --name = locator --bind-address = localhost

Locators er ansvarlige for koordineringen mellom forskjellige medlemmer av en Geode Klynge, som vi videre kan administrere over JMX.

La oss starte en Server forekomst for å være vert for en eller flere data Regions:

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

Vi setter –Server-port alternativ til 0 slik at Geode vil velge hvilken som helst tilgjengelig port. Selv om vi utelater det, vil serveren bruke standardport 40404. En server er et konfigurerbart medlem av Klynge som kjører som en langvarig prosess og er ansvarlig for å administrere data Regioner.

Og til slutt trenger vi en Region:

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

De Region er til slutt der vi vil lagre dataene våre.

2.2. Bekreftelse

La oss forsikre oss om at vi har alt i orden før vi går videre.

La oss først sjekke om vi har vår Server og vår Locator:

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

Og neste, at vi har vår Region:

gfsh> beskriv region --navn = baeldung ......................................... ................. Navn: baeldung Datapolicy: replikere Hosting Members: server1 Ikke-standardattributter Delt av Hosting Members Type | Navn | Verdi ------ | ----------- | --------------- Region | datapolitikk | REPLIKAT | størrelse | 0 | omfang | distribuert-ack

Vi bør også ha noen kataloger på filsystemet under den midlertidige katalogen vår som heter "locator" og "server1".

Med denne utgangen vet vi at vi er klare til å gå videre.

3. Maven avhengighet

Nå som vi har en løpende Geode, la oss begynne å se på klientkoden.

For å jobbe med Geode i Java-koden vår, må vi legge til Apache Geode Java-klientbiblioteket i vårt pom:

 org.apache.geode geode-core 1.6.0 

La oss begynne med å lagre og hente inn data i et par regioner.

4. Enkel lagring og henting

La oss demonstrere hvordan du lagrer enkeltverdier, grupper av verdier så vel som tilpassede objekter.

For å begynne å lagre data i "baeldung" -regionen, la oss koble til den ved hjelp av locatoren:

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

4.1. Lagre enkeltverdier

Nå kan vi bare lagre og hente data i vår region:

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

4.2. Lagre flere verdier samtidig

Vi kan også lagre flere verdier samtidig, si når vi prøver å redusere nettverksforsinkelsen:

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

4.3. Lagre egendefinerte objekter

Strenger er nyttige, men før eller senere må vi lagre egendefinerte objekter.

La oss forestille oss at vi har en kundeoppføring vi vil lagre ved hjelp av følgende nøkkeltype:

offentlig klasse CustomerKey implementerer Serializable {privat lang id; privat strengland; // getters and setters // er lik og hashcode}

Og følgende verditype:

offentlig klasse kundeimplementerer Serialiserbar {privat CustomerKey-nøkkel; privat streng fornavn; privat streng etternavn; privat Hele alder; // getters og setters}

Det er et par ekstra trinn for å kunne lagre disse:

Først, de skal implementere Serialiserbar. Selv om dette ikke er et strengt krav, ved å lage dem Serialiserbar, Geode kan lagre dem mer robust.

Sekund, de må være på applikasjonens klassesti så vel som klassestien til Geode Server.

For å få dem til serverens klassebane, la oss pakke dem sammen, si ved hjelp av mvn ren pakke.

Og så kan vi referere til den resulterende glasset i en ny start server kommando:

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

Igjen, vi må kjøre disse kommandoene fra den midlertidige katalogen.

Til slutt, la oss lage en ny Region kalt "baeldung-kunder" på Server ved å bruke den samme kommandoen som vi brukte for å lage "baeldung" -regionen:

gfsh> create region --name = baeldung-customers --type = REPLICATE

I koden vil vi nå ut til locatoren som før, og spesifisere den tilpassede typen:

@Før offentlige ugyldig tilkobling () {// ... koble til via lokalisatoren this.customerRegion = this.cache. createClientRegionFactory (ClientRegionShortcut.CACHING_PROXY) .create ("baeldung-kunder"); }

Og da kan vi lagre kundene våre som før:

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

5. Regiontyper

I de fleste miljøer vil vi ha mer enn en kopi eller mer enn en partisjon av regionen vår, avhengig av kravene til lese- og skriveeffekt.

Så langt har vi brukt replikerte regioner i minnet. La oss se nærmere på det.

5.1. Replikert region

Som navnet antyder, en Replikert region oppbevarer kopier av dataene sine på mer enn en Server. La oss teste dette.

Fra gfsh konsoll i arbeidskatalogen, la oss legge til en til Server heter server2 til klyngen:

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

Husk at når vi laget "baeldung", brukte vi –Type = REPLIKAT. På grunn av dette, Geode vil automatisk replikere dataene våre til den nye serveren.

La oss bekrefte dette ved å stoppe server1:

gfsh> stopp server - navn = server 1

Og la oss utføre et raskt spørsmål om "baeldung" -regionen.

Hvis dataene ble replikert, får vi resultatene tilbake:

gfsh> query --query = 'select e.key from /baeldung.entries e' Resultat: true Grense: 100 rader: 5 Resultat ------ C B A E D

Så det ser ut til at replikeringen lyktes!

Å legge til en kopi i regionen vår forbedrer datatilgjengeligheten. Og fordi mer enn en server kan svare på spørsmål, får vi også høyere leseomstrømning.

Men, hva om de begge krasjer? Siden dette er regioner i minnet, vil dataene gå tapt.For dette kan vi i stedet bruke –Type = REPLICATE_PERSISTENT som også lagrer dataene på disken mens de replikeres.

5.2. Partisjonert region

Med større datasett kan vi bedre skalere systemet ved å konfigurere Geode til å dele en region opp i separate partisjoner eller bøtter.

La oss lage en partisjonert Region kalt “baeldung-partitioned”:

gfsh> opprett region --navn = baeldung-partisjonert --type = PARTITION

Legg til litt data:

gfsh> put --region = baeldung-partitioned --key = "1" --value = "one" gfsh> put --region = baeldung-partitioned --key = "2" --value = "two" gfsh> put --region = baeldung-partisjonert --key = "3" --verdi = "tre"

Og bekreft raskt:

gfsh> query --query = 'select e.key, e.value from /baeldung-partitioned.entries e' Resultat: true Grense: 100 rader: 3 nøkkel | verdi --- | ----- 2 | to 1 | en 3 | tre

For å validere at dataene ble partisjonert, la oss stoppe server1 igjen og spør igjen:

gfsh> stop server --name = server1 gfsh> query --query = 'select e.key, e.value from /baeldung-partitioned.entries e' Resultat: true Grense: 100 Rader: 1 nøkkel | verdi --- | ----- 2 | to

Vi fikk bare noen av dataoppføringene tilbake denne gangen fordi serveren bare har en partisjon av dataene, så når server1 falt, dataene gikk tapt.

Men hva om vi trenger både partisjonering og redundans? Geode støtter også en rekke andre typer. Følgende tre er nyttige:

  • PARTITION_REDUNDANT skillevegger og replikerer dataene våre på tvers av forskjellige medlemmer av klyngen
  • PARTITION_PERSISTENT partisjoner dataene som SKILLEVEGG, men til disk, og
  • PARTITION_REDUNDANT_PERSISTENT gir oss alle tre atferd.

6. Object Query Language

Geode støtter også Object Query Language, eller OQL, som kan være kraftigere enn en enkel nøkkeloppslag. Det er litt som SQL.

For dette eksemplet, la oss bruke regionen “baeldung-customer” vi bygde tidligere.

Hvis vi legger til et par flere kunder:

Kartdata = nytt 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);

Da kan vi bruke QueryService for å finne kunder med fornavn som er “Allan”:

QueryService queryService = this.cache.getQueryService (); String spørring = "velg * fra / baeldung-kunder c hvor c.firstName = 'Allan'"; SelectResults results = (SelectResults) queryService.newQuery (query) .execute (); assertEquals (1, results.size ());

7. Funksjon

En av de kraftigere forestillingene om datanett i minnet er ideen om å "ta beregningene til dataene".

Enkelt sagt, siden Geode er ren Java, det er enkelt for oss å ikke bare sende data, men også logikk for å utføre disse dataene.

Dette kan minne oss om ideen om SQL-utvidelser som PL-SQL eller Transact-SQL.

7.1. Definere en funksjon

For å definere en arbeidsenhet som Geode skal gjøre,vi implementerer Geodes Funksjon grensesnitt.

La oss for eksempel forestille oss at vi trenger å endre alle kundens navn til store bokstaver.

I stedet for å spørre om dataene og la applikasjonen vår gjøre jobben, kan vi bare implementere Funksjon:

offentlig klasse UpperCaseNames implementerer Funksjon {@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 må returnere en unik verdi, så kursnavnet er vanligvis et godt valg.

De Funksjonskontekst inneholder alle regiondataene våre, og slik at vi kan gjøre et mer sofistikert spørsmål ut av det, eller, som vi har gjort her, mutere det.

Og Funksjon har mye mer kraft enn dette, så sjekk ut den offisielle manualen, spesielt getResultSender metode.

7.2. Implementeringsfunksjon

Vi må gjøre Geode oppmerksom på vår funksjon for å kunne kjøre den. Som vi gjorde med våre tilpassede datatyper, pakker vi glasset.

Men denne gangen kan vi bare bruke utplassere kommando:

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

7.3. Utføringsfunksjon

Nå kan vi utføre Funksjon fra applikasjonen ved hjelp av Funksjonstjeneste:

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

8. Konklusjon

I denne artikkelen lærte vi de grunnleggende konseptene til Apache Geode økosystem. Vi så på enkle får og putter med standard og tilpassede typer, replikerte og partisjonerte regioner, og oql- og funksjonsstøtte.

Og som alltid er alle disse prøvene tilgjengelige på GitHub.


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