Apache Ignite – Deo I

Ukoliko želite da skladištite i keširate ogromne količine podataka na efikasan način Apache Ignite je pravi izbor za vas. Ignite je platforma otvorenog koda koja svojim korisnicima nudi distribuiranu SQL bazu podataka kao i rad sa key-value vrednostima preko data grida. Neki od zadovoljnih korisnika Ignite-a su ING, Sberbank, HomeAway, Wellington, FSB, The Glue, 24 Hour Fitness, JacTravel i mnogi drugi.

Šta je Apache Ignite ?

Ignite je distribuirana baza podataka otvorenog koda, platforma koja nam omogućava keširanje i preprocesiranje. Koristi se za skladištenje, analizu i druge vrste obrade podataka. Podaci se skladište i obrađuju na čvorovima klastera, u skladu sa tim namenjen je, pre svega, sistemima koji koriste veliku količinu podataka.

Ignite je postao otvorenog koda u drugom delu 2014. i iste godine je prihvaćen u Apache Incubator program. Kompanija koja je originalno radila na njegovom razvoju je GridGain Systems.

Ova baza podataka koristi glavnu memoriju kao glavni sloj za skladištenje i obradu podataka, što je svrstava u grupu in-memory baza. Sloj diska je opcion ali kada je omogućen na njemu će se skladištiti celi setovi podataka dok će glavna memorija skladištiti samo delove u skladu sa kapacitetom.

Bez obzira na API koji koristimo, podaci se u Ignite-u skladište u formi key-value. Komponente baze podataka se skaliraju horizontalno, distribuirajući parove na čvorove klastera na takav način da svaki čvor sadrži deo podataka. Svaki put kada se doda novi ili ukloni postojeći čvor vrši se rebalans raspodele podataka.

Sistem takođe podržava razne API-je kao što su sve vrste JCache-kompatiblinih key-value API-ja, ANSI-99 SQL sa spajanjem, ACID (Atomicity, Consistency, Isolation, Durability) transakcije kao i MapReduce proračune.

Neka od softverskih rešenja koja su slična Ignite-u su GridGain, EnCache, Gigaspaces…

Apache Ignite klaster može da se otpremi preko oblaka (Microsoft Azure, AWS, Google Compute Engine) ili u kontrolisanom okruženju kao što su Kubernetes, Docker, Apache Mesos, VMWare.

Skladištenje podataka

Ignite treterira glavnu memoriju ne samo kao sloj za keširanje već i kao potpuno funkcionalno sloj za skladištenje podataka. Korisniku je dozvoljeno da uključi ili isključi perzistentnost. Kada je isključena, Ignite se ponaša kao in-memory baza podataka ili in-memory data grid, zavisno od toga da li korisnik koristi SQL ili key-value API. Kada je uključena, Ignite postaje distribuirana, horizontalno skalabilna baza podataka koja garantuje konzistentnost podataka i otpornost na otkaze klastera.

ACID Kompatibilnost

Podaci koje se skladište u Ignite-u su u skladu sa ACID principima, ovo važi kako za podatke u glavnoj memoriji tako i za podatke koji se skladište na disku, što čini Ignite sistemom sa visokim stepenom konzistentnosti. Transakcije u Ignite-u rade preko mreže i mogu da obuhvataju više servera.

Potpuna SQL podrška

Ignite pruža potpuni podršku za SQL, DDL i DML što korisnicima dozvoljava interakciju sa Ignite-om korišćenjem samo SQL komandi. Ovo podrazumeva kreiranje tabela i indeksa kao i insert, update i delete naredbe.

Key-Value

In-memory data grid komponenta je transakciono, distribuirano key-value skladište, koje se može skalirati horizontalno na stotinama servera u klasteru. Kada je perzistentnost omogućena, moguće je skladištenje više podataka od kapaciteta glavne memorije.

Kolocirano procesiranje

Većina tradicionalnih baza podataka koristi klijent-server pristup, što znači da se podaci moraju preneti sa servera na klijenta i zatim se tu i obraditi. Ovakav pristup zahteva veliku količini protoka podataka sa jedne na drugu stranu i generalno ne pruža veliku skalabilnost. Ignite, nasuprot pomenutom pristupu, dozvoljava slanje light-weight proračuna sa samim podacima odnosno dozvoljava kolociranje proračuna sa podacima. Rezultat ovakvog pristupa je veća skalabilnost i minimalno kretanje podataka.

Skalabilnost i trajnost

Ignite je elastičan, horizontalno skalabilan distribuirani sistem koji obezbeđuje uklanjanje i dodavanje čvorova klastera na zahtev. U svrhu povećavanja otpornosti na otkaze koriste se redudantne kopije podataka, na taj način svaki izgubljeni podatak može biti povraćen po cenu većeg opterećenja memorije. Restarti klastera u Ignite-u su veoma brzi, jer su podaci dostupni direktno sa diska. U skladu sa tim podaci ne moraju da budu učitani u glavnu memoriju da bi počela obrada.  

Klasterovanje

Ignite koristi klasterovanje komponenti zasnovano na shared-nothing arhitekturi. Čvorovi su podeljeni u dve glavne kategorije – server i klijent. Serveri su jedinice za skladištenje i obradu podataka, oni skladištei indekse i podatke, osim toga imaju zadatak obrade dolazećih zahteva kao i izvršavanja svih potrebnih proračuna. Serverski čvorovi su poznatiji i kao čvorovi podataka. Klijentski čvorovi su veze aplikacija i usluga ka distribuiranoj bazi podataka koja je predstavljena kao klaster serverskih čvorova. Klijentski čvorovi su uglavnom ugrađeni u kod aplikacije pisane u jezicima Java, C# ili C++ od kojih svaki ima posebne bibiloteke namenjene upravo ovome. Osim ovoga koriste se ODBC, JDBC i REST drajveri kao način komunikacije sa bazom podataka iz drugih jezika ili alata. Drajveri koriste klijentske čvorove ili socket konekcije niskog nivoa da bi ostvarili pomenutu komunikaciju.

Particionisanje i replikacija

Podaci su organizovani u formi key-value, svaki ovakav par je distribuiran po kešu. Generalno, svaki keš predstavlja jedan tip entitea kao što su zaposleni ili organizacija.

Svaki keš je podeljen na fiksan broj particija koje se distribuiraju po čvorovima klastera koristeći rendezvous hashing algoritam. U svakom trenutku postoji jedna primarna i nula ili više rezervnih kopija particije. Broj kopija se konfiguriše preko faktora replikacije. U punom replikacionom modu svaki čvor klastera sadrži kopiju particije. Particije se rebalansiraju automatski kada se doda ili ukloni čvor kako bi se postigla ujednačena raspodela podataka.

Parovi key-value se skladište po particijama. Ignite mapira par u particiju tako što uzima vrednost ključa i na nju primenjuje posebnu heš funkciju.

Arhitektura memorije

Arhitektura Ignite-a se sastoji iz dva nivoa skladišta i naziva se trajna memorija. Interno, koristi se straničenje i reference na podatke, slično principu virtuelne memorije na Unix sistemima. Bitna razlika je, međutim, što trajna memorija u svakom trenutku drži celokupnu kolekciju podataka i indeksa na disku dok virtuelna memorija koristi disk samo kada ostane bez prostora u glavnoj memoriji.

Prvi nivo arhitekture naziva se nivo memorije. Ovaj nivo skladišti podatke i indekse u glavnoj memoriji, van Java hrpa, u takozvanim regionima van hrpe. Regioni su prealocirani i njima se upravlja pomoću sistema baze podataka što sprečava Java mehanizam korišćenja hrpe za potrebe skladištenja, rezultat ovoga je izbegavnje dugih pauza prilikom garbage collecting procesa. Regioni su podeljeni na stranice fiksne veličine koje skladište podatke, indekse i sistemske metapodatke.

Nivo memorije je dovoljan za rad baze ali je uvek moguće koristiti drugi nivo, nivo diska, zarad trajnosti. Baza podataka dolazi sa svojim sistemom perzistentnosti ali može koristiti i RDBMS, NoSQL ili Hadoop baze podataka kao nivo diska.

Sistem perzistentnosti

Ignite-ov sistem perzistentnosti je distribuirano i konzistentno skladište koje će uvek držati ceo skup podataka i indeksa na disku. Nivo memorije će keširati samo onoliko podataka koliko mu dozvoljava kapacitet glavne memorije. Na primer, ako imamo 1000 unosa a glavna memorija može da primi samo 300 od njih, imaćemo svih 1000 unosa na disku i samo 300 keširanih u glavnoj memoriji. Koristi se distribuirano skladište koje podržava ACID osobine kao i kompatibilnost sa SQL-om. Skladište je integrisano sa Ignite-om kao opcioni disk sloj, podaci se mogu čuvati na SSD-u, fleš memoriji i drugim tipovima trajnih memorija. Sistem koristi write-ahead logging (WAL) algoritam za skladištenje modifikacija podataka. U pozadini se izvršava proces koji je zadužen da kopira dirty stranice sa nivoa memorije u particione fajlove. Dirty stranica je ona stranica koje je modifikovana u memoriji i čija je modifikacija zabeležena u logu ali nije upisana u particioni fajl. Ova metoda dosta skraćuje proces restartovanja klastera jer je potrebno pisati samo one stranice koje WAL procedura registrovala u log fajlu ali nije već upisala u particione fajlove.

Third-party nivo diska

Sistem perzistentnosti postoji tek od verzije 2.1. Pre toga Ignite je podržavao samo third-party baze podataka kao nivo diska. Ignite se može konfigurisati kao in-memory sloj iznad RDBMS, NoSQL ili Hadoop baze podataka. Ovaj pristup ima određena ograničenja u odnosu na sistem perzistentnosti. Na primer, SQL upiti će se izvršavati samo nad podacima u glavnoj memoriji. Što znači da moramo doneti sve potrebne podatke sa diska u glavnu memoriju pre samog izvršavanja upita.

Swap prostor

Ako koristimo samo in-memory skladište moguće je da količina podataka prekorači raspoloživu količinu glavne memorije. Da bi izbegli ovo, idealan pristup bi bio korišćenje sistema perzistentnosti ili korišćenje neke od pomenutih baza podataka kao nivo diska. Ako ipak ne želimo da koristimo pomenuta rešenja moguće je upotrebiti swapovanje. U tom slučaju podaci iz glavne memorije biće premešteni na swap prostor na disku. Bitno je naglasti da Ignite ne obezbeđuje sopstvenu implementaciju swap prostora. Umesto toga on se oslanja na rutine operativnog sistema. Kada je swapovanje omogućeno podaci se skladište kao memory mapped files (MMF) čiji će sadržaj biti swapovan na disk od strane operativnog sistema u zavisnosti od količine slobodnog prostora u glavnoj memoriji.

Konzistentnost

Ignite obezbeđuje visok nivo konzistentnosti koristeći commit protokol u dve faze. Konzistentnost je garantovana i na nivou memorije i na nivou diska. Transakcije su u skladu sa ACID principima i mogu se izvršavati na više čvorova na klasteru. Baza podatka podržava optimistični i pesimistički pristup konkurentnosti, transakcije oslobođene od deadlock-ova kao i tehnike za otkrivanje deadlock-ova.

U scenariju kada su transakcione garancije opcione, Ignite dozvoljava izvršavanje upita u modu koji podrazumeva bolje performanse.

Distribuirani SQL

Ignite-u se može pristupiti preko SQL API-ja i JDBC i ODBC drajvera kao i bibiloteka koje su razvijene za jezike Java, C# i C++.Sintaksa data manipulation kao i data definition je u skladu sa ANSI-99 specifikacijom.

Ignite dozvoljava korišćenje kolociranih i nekolociranih spajanja. Kod kolociranog spajanja, spajanje se vrši na lokalnim podacima svakog čvora, dok se kod nekolociranih podaci pomeraju kroz mrežu da bi pripremili potrebni set podataka za spajanje.

Literatura