En guide til Apache Ignite

1. Introduktion

Apache Ignite er en open source-hukommelsescentreret distribueret platform. Vi kan bruge det som en database, et caching-system eller til databehandling i hukommelsen.

Platformen bruger hukommelse som et lagringslag og har derfor imponerende ydeevne. Kort fortalt, dette er en af ​​de hurtigste atombehandlingsplatforme, der i øjeblikket er i produktionsbrug.

2. Installation og opsætning

Som en begyndelse skal du tjekke siden Kom godt i gang for den indledende installations- og installationsvejledning.

Maven-afhængighederne til den applikation, vi skal bygge:

 org.apache.ignite ignite-core $ {ignite.version} org.apache.ignite ignite-indexing $ {ignite.version} 

antænd-kerne er den eneste obligatoriske afhængighed for projektet. Da vi også vil interagere med SQL, antænd-indeksering er også her. $ {ignite.version} er den nyeste version af Apache Ignite.

Som sidste trin starter vi Ignite-noden:

Ignite node start OK (id = 53c77dea) Topologi snapshot [ver = 1, servere = 1, clients = 0, CPU'er = 4, offheap = 1,2 GB, heap = 1,0 GB] Dataregioner konfigureret: ^ - standard [initSize = 256.0 MiB, maxSize = 1.2 GiB, persistenceEnabled = false]

Konsoludgangen ovenfor viser, at vi er klar til at gå.

3. Hukommelsesarkitektur

Platformen er baseret på Durable Memory Architecture. Dette gør det muligt at gemme og behandle dataene både på disken og i hukommelsen. Det øger ydeevnen ved at bruge klyngens RAM-ressourcer effektivt.

Dataene i hukommelsen og på disken har den samme binære repræsentation. Dette betyder ingen yderligere konvertering af dataene, mens du flytter fra et lag til et andet.

Holdbar hukommelsesarkitektur opdeles i blokke i fast størrelse kaldet sider. Sider gemmes uden for Java-bunken og organiseres i et RAM. Det har en unik identifikator: FullPageId.

Sider interagerer med hukommelsen ved hjælp af PageMemory abstraktion.

Det hjælper med at læse, skrive en side og også tildele et side-id. Inde i hukommelsen forbinder Ignite sider med Hukommelsesbuffere.

4. Hukommelsessider

En side kan have følgende tilstande:

  • Ulastet - ingen sidebuffer indlæst i hukommelsen
  • Ryd - sidebufferen indlæses og synkroniseres med dataene på disken
  • Durty - sidebufferen indeholder data, der er forskellige fra dem på disken
  • Beskidt i kontrolpunkt - der er en anden ændring starter, før den første fortsætter til disk. Her starter et kontrolpunkt og PageMemory opbevarer to hukommelsesbuffere for hver side.

Holdbar hukommelse tildeler lokalt et kaldet hukommelsessegment Dataregion. Som standard har den en kapacitet på 20% af klyngens hukommelse. Konfiguration af flere regioner gør det muligt at gemme de anvendelige data i en hukommelse.

Regionens maksimale kapacitet er et hukommelsessegment. Det er en fysisk hukommelse eller et kontinuerligt byte-array.

For at undgå fragmentering af hukommelse indeholder en enkelt side flere nøgleværdiposter. Hver nye post tilføjes til den mest optimale side. Hvis nøgleværdiparstørrelsen overstiger sidens maksimale kapacitet, gemmer Ignite dataene på mere end en side. Den samme logik gælder for opdatering af dataene.

SQL- og cacheindekser er gemt i strukturer kendt som B + Trees. Cache-nøgler er sorteret efter deres nøgleværdier.

5. Livscyklus

Hver Ignite-node kører på en enkelt JVM-forekomst. Det er dog muligt at konfigurere, så flere Ignite-noder kører i en enkelt JVM-proces.

Lad os gennemgå livscyklusbegivenhedstyperne:

  • BEFORE_NODE_START - før opstart af Ignite node
  • AFTER_NODE_START - fyres lige efter start af tændingsknudepunktet
  • BEFORE_NODE_STOP - inden start af nodestop
  • AFTER_NODE_STOP - efter at Ignite-noden stopper

Sådan starter du en standard tændknude:

Ignite ignite = Ignition.start ();

Eller fra en konfigurationsfil:

Ignite ignite = Ignition.start ("config / eksempel-cache.xml");

Hvis vi har brug for mere kontrol over initialiseringsprocessen, er der en anden måde ved hjælp af LifecycleBean grænseflade:

offentlig klasse CustomLifecycleBean implementerer LifecycleBean {@Override public void onLifecycleEvent (LifecycleEventType lifecycleEventType) kaster IgniteException {if (lifecycleEventType == LifecycleEventType.AFTER_NODE_START) {// ...}}}

Her kan vi bruge livscyklusbegivenhedstyperne til at udføre handlinger før eller efter noden starter / stopper.

Til dette formål sender vi konfigurationsinstansen med CustomLifecycleBean til startmetoden:

IgniteConfiguration konfiguration = ny IgniteConfiguration (); configuration.setLifecycleBeans (ny CustomLifecycleBean ()); Ignite ignite = Ignition.start (konfiguration);

6. In-Memory Data Grid

Ignite data grid er et distribueret nøgleværdilager, meget fortrolig med partitioneret HashMap. Det er vandret skaleret. Dette betyder flere klyngenoder, vi tilføjer, flere data cachelagres eller gemmes i hukommelsen.

Det kan give en betydelig forbedring af ydeevnen til tredjepartssoftwaren, som NoSql, RDMS-databaser som et ekstra lag til caching.

6.1. Cache-support

Dataadgang API er baseret på JCache JSR 107 specifikation.

Lad os som et eksempel oprette en cache ved hjælp af en skabelonkonfiguration:

IgniteCache cache = ignite.getOrCreateCache ("baeldingCache");

Lad os se, hvad der sker her for flere detaljer. Først finder Ignite hukommelsesområdet, hvor cachen er gemt.

Derefter vil B + træindeks siden være placeret baseret på nøgle hash-koden. Hvis indekset findes, findes en dataside for den tilsvarende nøgle.

Når indekset er NULL, opretter platformen den nye dataindtastning ved hjælp af den givne nøgle.

Lad os derefter tilføje nogle Medarbejder genstande:

cache.put (1, ny medarbejder (1, "John", sand)); cache.put (2, ny medarbejder (2, "Anna", falsk)); cache.put (3, ny medarbejder (3, "George", sand));

Igen vil den holdbare hukommelse se efter det hukommelsesområde, hvor cachen hører til. Baseret på cache-nøglen vil indekssiden være placeret i en B + træstruktur.

Når indekssiden ikke findes, anmodes der om en ny og føjes til træet.

Derefter tildeles en dataside til indekssiden.

For at læse medarbejderen fra cachen bruger vi bare nøgleværdien:

Medarbejdermedarbejder = cache.get (1);

6.2. Streaming Support

I hukommelsen giver datastreaming en alternativ tilgang til disk- og filsystembaserede databehandlingsapplikationer. Streaming API opdeler datastrømmen med høj belastning i flere faser og ruter dem til behandling.

Vi kan ændre vores eksempel og streame dataene fra filen. Først definerer vi en datastreamer:

IgniteDataStreamer streamer = antænd. DataStreamer (cache.getName ());

Dernæst kan vi registrere en streamtransformator for at markere de modtagne medarbejdere som ansat:

streamer.receiver (StreamTransformer.from ((e, arg) -> {Medarbejdermedarbejder = e.getValue (); medarbejder.sætMedarbejdet (sand); e.setValue (medarbejder); tilbagevendende medarbejder;}));

Som et sidste trin gentager vi os over medarbejdere.txt fillinjer og konvertere dem til Java-objekter:

Sti sti = Paths.get (IgniteStream.class.getResource ("medarbejdere.txt") .toURI ()); Gson gson = ny Gson (); Files.lines (sti) .forEach (l -> streamer.addData (medarbejder.getId (), gson.fromJson (l, Medarbejder.klasse)));

Med brugen af streamer.addData () sætte medarbejdergenstande i strømmen.

7. SQL-support

Platformen leverer hukommelsescentreret, fejltolerant SQL-database.

Vi kan oprette forbindelse enten med ren SQL API eller med JDBC. SQL-syntaks her er ANSI-99, så alle standardaggregationsfunktioner i forespørgslerne, DML, DDL-sprogoperationer understøttes.

7.1. JDBC

For at få mere praktisk, lad os oprette en tabel over medarbejdere og tilføje nogle data til den.

Til dette formål vi registrerer en JDBC-driver og åbner en forbindelse som et næste trin:

Class.forName ("org.apache.ignite.IgniteJdbcThinDriver"); Forbindelse conn = DriverManager.getConnection ("jdbc: antænd: tynd: //127.0.0.1/");

Ved hjælp af standard DDL-kommandoen udfylder vi Medarbejder bord:

sql.executeUpdate ("CREATE TABLE Employee (" + "id LANG PRIMÆR NØGLE, navn VARCHAR, erEm Employed tinyint (1))" + "WITH \" template = replicated \ "");

Efter WITH-nøgleordet kan vi indstille cache-konfigurationsskabelonen. Her bruger vi REPLIKERET. Som standard er skabelontilstanden DELT. For at specificere antallet af kopier af dataene kan vi også specificere SIKKERHEDER parameter her, som er 0 som standard.

Lad os derefter tilføje nogle data ved hjælp af INSERT DML-sætning:

PreparedStatement sql = conn.prepareStatement ("INSERT TO Employee (id, name, isEmployed) VALUES (?,?,?)"); sql.setLong (1, 1); sql.setString (2, "James"); sql.setBoolean (3, sandt); sql.executeUpdate (); // tilføj resten 

Derefter vælger vi posterne:

ResultSet rs = sql.executeQuery ("VÆLG e.name, e.isEmployed" + "FRA Medarbejder e" + "WHERE e.isEm Employed = TRUE")

7.2. Spørg efter objekterne

Det er også muligt at udføre en forespørgsel over Java-objekter, der er gemt i cachen. Ignite behandler Java-objekt som en separat SQL-post:

IgniteCache cache = ignite.cache ("baeldungCache"); SqlFieldsQuery sql = new SqlFieldsQuery ("vælg navn fra medarbejder hvor isEmployed = 'true'"); QueryCursor markør = cache.query (sql); for (Liste række: markør) {// gør noget med rækken}

8. Resume

I denne vejledning kiggede vi hurtigt på Apache Ignite-projektet. Denne vejledning fremhæver fordelene ved platformen i forhold til andre simialprodukter som præstationsgevinster, holdbarhed og lette API'er.

Som resultat, vi lærte at bruge SQL-sproget og Java API til at gemme, hente, streame data inde i persistens- eller in-memory-gitteret.

Som sædvanlig er den komplette kode til denne artikel tilgængelig på GitHub.