ga('send', 'pageview');
Categories
Teknik

NoSQL Distilled – en bra guide

Boken NoSQL Distilled är en riktigt bra och kompakt guide att ha i den snåriga NoSQL-djungeln. Läs den, eller i alla fall nedanstående recension.

nosql-bookBokens undertiteln: A Brief Guide to the Emerging World of Polyglot Persistence säger en hel del om innehållet och vad författarna tror om framtiden för databaser. NoSQL Distilled av Fowler och Sadalage (2013) är indelad i två delar: den första behandlar de koncept man behöver ha koll på för att välja NoSQL-databas och kunna bedöma om NoSQL överhuvudtaget är värt att överväga för ett givet projekt. Den andra delen fokuserar på hur man implementerar system med hjälp av NoSQL. Man kan läsa boken utan tidigare erfarenhet av NoSQL, men har samtidigt utbyte av den även om man har större erfarenhet med sig. De med större kunskap kan lätt hoppa över det som inte är relevant för dem. En enkel och effektiv indelningen av texten gör den lätt att navigera.
Boken beskriver först värdet med traditionella relationsdatabaser med fokus pnosql-book (1)å transaktioner och fördelarna med att SQL är standardiserat. Författarna beskriver den välkända missmatchningen mellan relationsmodellen och hur data lagras i minnet: “the object-relational impedence mismatch”. De ser detta som en av drivkrafterna till att överväga NoSQL-databaser. En annan drivkraft för NoSQL är kunna använda sig av kluster av servrar för att hantera större datamängder, det vill säga horisontell skalbarhet.

Boken ger inte något exakt definition på vad en NoSQL-databas är, men listar några vanliga egenskaper: de använder ej relationsmodellen, de går att köra på kluster, är open-source, är byggda för webben och är schemalösa. Det är svårt att definiera vad NoSQL är, men jag hade förväntat mig att boken skulle försöker sig på det, i alla fall en definition för hur ordet används i boken. Över huvud taget hade jag gärna sett att författarna försökt definiera termer, speciellt datamodeller, mer rigoröst. I och för sig kan jag förstå författarna, termer och definitioner kommer att förändras och sakta bli mer vedertagna i och med att NoSQL mognar, så det finns risk att “ha fel”. Men samtidigt försummar författarna en bra chans att bidra till mognaden av begreppen.

Kapitlet “Distribution Models” beskriver på ett föredömligt sätt hur funktionen för en databas kan delas mellan flera datorer (eller köras på en): ensam server, master-slave-replikering och peer-to-peer-replikering.

Boken innehåller ett kapitel om datakonsistens och behandlar bland annat CAP-teoremet som blivit flitigt brukat och missbrukat de senaste åren. Författarna har här en intressant uppfattning:

It is usually better to think not about the tradeoff between consistency and availability, but rather between consistency and latency.

Kapitlet innehåller också fräscha tankar kring durability. Jag citerar: “it’s useful for individual calls to indicate what level of durability they need”. Jag instämmer fullständigt. I ett större projekt stötte jag på det oerhört frustrerande problemet att databasen saknade “durability control” per anrop till databasen. I det aktuella fallet behövde vi i vissa fall vänta tills en transaktion (en större betalning) hunnit replikerats till en servrar på annan geografisk ort innan transaktionen bekräftas till användaren. Dock ville vi inte göra det för alla transaktioner. Detta gick helt enkelt inte att göra med den databas vi använde och vi blev tvungna att byta.

Boken beskriver map-reduce på ett enkelt, praktiskt och tillgängligt sätt. Map-reduce är att sätt att parallellisera databasfrågor utan att explicit behöva hantera uppdelningen av frågan i delar som går att köra parallellt över flera servrar.

Författarna har valt att fokusera på fyra kategorier av NoSQL-databaser: “key-value”, “document database”, “column-family stores” och “graph databases”. Denna indelning är rimlig, men det finns olika sätt att kategorisera databaser på och det skulle varit intressant att veta varför författarna valt just denna indelning. Kapitlen om dessa kategorier är välskrivna och man får en bra översikt. Varje kapital innehåller ett underkapital med typiska användningsfall som passar bra för den typen av databas. Mycket värdefullt.

Kapitlen “Polyglot Persistence”, “Beyond NoSQL” och “Choosing Your Database” avslutar boken. Kapitlet “Polyglot persistence” beskriver hur en mer heterogen flora av databaser växer fram i och med att relationsdatabasernas dominans avtar. Olika lagringsproblem löses bäst med olika databaser. Kapitlet om att välja databas är generellt och saknar råd om specifika databaser, men boken är kort och översiktlig, så det är rimligt. Man skulle lätt kunna skriva en hel bok om hur man ska välja databasprodukt givet olika lagringsbehov.

“Beyond NoSQL” är spännande läsning där författarna beskriver datalagringsteknik som inte passar in under NoSQL-paraplyet. Bland annat skriver de något som jag tycker är fundamentalt och värt att repetera:

When we think of data storage, we tend to think of a single-point-of-time worldview, which is very limiting compared to the complexity supported by a version control system. It’s therefore surprising that data storage tool haven’t borrowed some of the ideas from version control systems. After all, many situations require historic queries and support for multiple views of the world.

Jag instämmer med detta. Bristen på stöd för historiska frågor var en stor drivkraft när jag skapade NoSQL-databasen BergDB [http://bergdb.com/]. Den hanterar historiska frågor på samma sätt som frågor som ställs mot det senaste tillståndet.

Boken är bra, men ett nära på oförlåtligt misstag är att utelämna consistent hashing i en bok som introducerar NoSQL för läsaren. Consistent hashing (ursprunglig artikel, introduktion), används av Riak, Cassandra, Memcached och är själva grunden till att kunna skala skrivningar horisontellt och linjärt samtidigt som man kan uppnå redundans och hög upptid.

Så läs boken, men läs också om consistent hashing.

Lycka till i NoSQL-djungeln!

Leave a Reply

Your email address will not be published. Required fields are marked *