Perinteisen relaatiomallin hylkäävät, ns. NoSQL-tietokannat ovat tehneet tuloaan valtavirtaan viime vuosina. NoSQL-järjestelmien tavoitteena on tietokantakerroksen helppo, pitkälti automatisoitu horisontaalinen skaalattavuus ja tietomallin joustavuus. Tilaus tällaisille järjestelmille syntyi alunperin massiivisia käyttäjä- ja tietomääriä vaativien web-sovellusten (Google, Amazon, Facebook, Twitter, …) tarpeista, mutta nykyään ne eivät enää ole vain jättiläisten työkaluja.
Taustaa
Sitten Internetin alkuaikojen interaktiivisille web-sovelluksille asetettavat vaatimukset ovat muuttuneet merkittävästi. Potentiaalisia käyttäjiä on ympäri maailmaa, minkä seurauksena käyttäjä- ja datamäärät voivat olla valtavia ja sovelluksilta odotetaan jatkuvaa saatavuutta. Toisaalta kuormitus on usein vaihtelevaa ja sovellusten pitää sopeutua tähän joustavasti. Tämän kehityksen rinnalla on tapahtunut myös teknologisia mullistuksia: verkot ovat nopeutuneet, muisti halventunut ja virtualisointitekniikat kehittyneet. Kaiken tämän myötä sovellusten infrastruktuuri on muuttunut. Nykyään web-sovellukset ovat usein hajautettuja ja horisontaalisesti skaalautuvia. Horisontaalisella skaalautuvuudella tarkoitetaan sitä, että kapasiteettia kasvatetaan lisäämällä sovelluspalvelimia (halpaa perusrautaa/virtuaalipalvelimia) sen sijaan, että hankittaisiin uusi, usein hyvin hintava tehopalvelin. Hajautuksella parannetaan myös vikasietoisuutta ja mahdollistetaan sovellusten päivittäminen ilman käyttökatkoja.
Pelkkä sovelluspalvelimien hajauttaminen ei kuitenkaan riitä, vaan myös tietokannan täytyy skaalautua. Relaatiotietokantojen perinteinen skaalausmalli on ollut vertikaalinen, eli hankitaan järeämpää rautaa – tämän lähestymistavan ongelmia ovat kuitenkin korkea hinta ja joustamattomuus. Myös tietomallin jäykkyys voidaan tietyissä tapauksessa nähdä relaatiotietokantojen ongelmana. Nykyajan web-sovellukset ovat usein ”work-in-progress”, eli toiminnallisuuksia lisätään ja muokataan lennossa, jolloin tietotarpeetkin voivat muuttua nopeasti. Relaatiotietokannoissa skeema pitää kuitenkin määritellä etukäteen ja muutokset ovat hankalia toteuttaa.
Enter NoSQL
Yllämainittuihin ongelmiin uudenlaisia ratkaisuja lähtivät ensimmäisinä miettimään mm. Google ja Amazon. Tämän kehityksen tuloksena syntyneitä relaatiomallin hylkääviä ja helppoa skaalautuvuutta korostavia tietokantaratkaisuja alettiin kutsua NoSQL-tietokannoiksi. Kyseisen buzzwordin alle mahtuu monenlaista viritystä ja kaikki ideat eivät ole uusia, mutta usein yhteistä näille tuotteille on mm.:
- Ei skeemaa, tallennettava tieto voi olla muodoltaan vaihtelevaa
- Usein tietorakenteeltaan avain-arvo varastoja (key-value store)
- Tiedon automaattinen, sovellukselle näkymätön hajautus useille palvelimille, joita voidaan lisätä ja poistaa joustavasti
- Hajautettujen hakujen tuki
NoSQL-ratkaisut voidaan tiedon tallennustavan mukaan jakaa karkeasti kolmeen tyyppiin: Key-value store, Columnar Database (Column-oriented DB) ja Document Store. Näistä käyttötavaltaan yksinkertaisin on Key-Value store, jossa tieto tallennetaan avain-arvo-pareina hajautetusti. Yksinkertaisimmillaan tietorakenne on distributed hashtable (DST) ja kaikki operaatiot tehdään avaimien perusteella. Key-Value storet soveltuvat tilanteisiin, jossa pitää tallentaa tehokkaasti suuria määriä vaihtelevan muotoista dataa, johon kohdistetaan vain yksinkertaisia hakuja (esim. click-stream data). Tunnetuimpia tuotteita ovat Redis, Amazon Dynamo, Membase ja Oracle NoSQL DB.
Columnar Database on samantapainen kuin key-value store, mutta siinä avain voi viitata useisiin arvoihin, jotka on ryhmitelty (column families). Columnar Database –tyyppinen tietokanta mahdollistaa key-value-storea hieman monipuolisemman tietojen käsittelyn. Esimerkkejä tämäntyyppisistä NoSQL-tuotteista ovat mm. Google BigTable, Apache Cassandra, Hbase.
Monipuolisimmat mahdollisuudet tiedon käsittelyyn tarjoavat Document store -tyyppiset tietokannat. Niissä tieto tallennetaan rakenteisena dokumenttina, usein tallennusmuotona JSON tai sen variantti. Dokumentit jaotellaan kokoelmiin, joita voi karkeasti verrata relaatiokannan tauluihin. Toisin kuin esimerkiksi key-value storeissa, järjestelmä on tietoinen dokumenttien sisällöstä. Tämä mahdollistaa monipuolisemman käsittelyn ja hakuja ja päivitysoperaatioita voidaan kohdistaa myös dokumentin osiin. Esimerkiksi MongoDB tarjoaa melko monipuolisen valikoiman erilaisia hakuoperaatiota kuten loogiset operaattorit ja regexp-vertailut.
Työkalu tehtävän mukaan
Relaatiotietokantojen asema oli pitkään niin vahva, että uuden sovelluksen kehitystä aloitettaessa ei välttämättä edes pohdittu muita vaihtoehtoja. Tarjolla olevien tietovarastoratkaisuiden lisääntyessä on havahduttu siihen, että myös tiedon tallentamistavan tulisi määräytyä sen mukaan, minkälaista tietoa ollaan tallentamassa, miten sitä käsitellään, missä muodossa se esitetään jne. Jopa saman sovelluksen sisällä voidaan käyttää useita erityyppisiä tietovarastoja (ns. Polyglot Persistence). Tämä kuitenkin edellyttää järjestelmän suunnittelijoilta syvällistä tietämystä erilaisen ratkaisujen vahvuuksista ja riskeistä.
Yksi relaatiotietokantojen eduista on niiden ylivoimainen kypsyys verrattuna NoSQL-tuotteisiin. Nimensä mukaisesti ne ovat vahvoilla myös silloin kun käsiteltävä tieto sisältää paljon sisäisiä viittauksia ja niitä halutaan hyödyntää tiedon yhdistelyssä. Myös vahvasti määritelty tietomalli voi joissakin tapauksessa olla hyödyksi, sillä se tekee tiedon käsittelyn ennustettavaksi ja virheet paljastuvat aikaisessa vaiheessa.
NoSQL-tuotteet sopivat edelleen parhaiten suurta skaalautuvuutta vaativiin järjestelmiin. Usein tieto voi olla luonteeltaan sellaista, että tiukkoja eheysvaatimuksia ei ole (esim. erilaiset tilastotiedot), mikä mahdollistaa löyhemmän transaktionaalisuuden ja tätä kautta helpomman hajautuksen. Automatisoitu skaalautuvuus tekee NoSQL-kannoista erityisen sopivia tallennusratkaisuja pilvipalveluissa. Näissä tyypillisesti mahdollistetaan tarvittavan palvelinkapasiteetin, mukaan lukien tietokantapalvelimet, ostaminen joustavasti niin, että hinta skaalautuu tarpeen mukaan. Toisaalta NoSQL-kantojen edut ovat joskus vain näennäisiä. Esimerkiksi käytettävä tietomalli joudutaan usein optimoimaan sen mukaan millaisia hakuja tehdään, mikä on ristiriidassa mainostetun joustavuuden kanssa.
Goforelta löytyy osaamista NoSQL-ratkaisuista sekä pilvipalveluiden että perinteisemmän ohjelmistoarkkitehtuurin mukaisesti rakennettujen sovellusten parista. Asiantuntijamme ovat mm. olleet mukana toteuttamassa Fonectan hakupalveluita Amazonin pilvialustalle. Tiimi Goforelaisia on myös mukana rakentamassa Oppijan verkkopalveluita, jossa relaatiotietokannan lisäksi on käytössä MongoDB mm. opiskeluhakemusten tallennukseen. Kehitys on NoSQL-rintamalla erittäin aktiivista, joten odotettavissa on, että teknologiat kypsyvät ja standardeja syntyy. Seuraamme kehitystä mielenkiinnolla.