Bazy danych NoSQL Szymon Francuzik [email protected] Poznań, 29.10.2012 Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 1 / 45 Plan prezentacji 1 Definicja 2 Motywacje 3 Klasyfikacja NoSQL 4 Amazon Dynamo Przeznaczenie Realizacja 5 Cassandra Przeznaczenie “Rozpraszanie” API 6 RavenDB Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 2 / 45 RDBMS Relacyjne systemy zarządzania bazami danych: relacyjny model danych — Edgar Codd (IBM) — 1970 język SQL transakcje ACID Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 3 / 45 Model relacyjny Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 4 / 45 ACID Atomicity (atomowość) Consistency (spójność) Isolation (izolacja) Durability (trwałość) Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 5 / 45 Definicja NoSQL Wikipedia: NoSQL jest klasą systemów zarządzania bazą danych nie pasujących do powszechnie stosowanego modelu relacyjnych baz danych: brak języka SQL (w szczególności brak operacji JOIN) nierelacyjny model danych nie musi zapewniać ACID rozproszona, odporna na awarie architektura Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 6 / 45 Wydajność atomowość spójność izolacja trwałość Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 7 / 45 Skalowalność Możliwość zwiększania wydajności systemu wraz z rosnącym zapotrzebowaniem. skalowanie wertykalne (ang. scale up) skalowanie horyzontalne (ang. scale out) I I I sharding (partycjonowanie poziome) partycjonowanie pionowe repliki do odczytu Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 8 / 45 CAP Theorem (Brewer’s conjecture) Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 9 / 45 PACELC Partition yes Availability no Consistency Latency Szymon Francuzik [email protected] Bazy () danych NoSQL Consistency Poznań, 29.10.2012 10 / 45 Alternatywa dla ACID BASE: Basically Available Soft-state Eventual consistency Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 11 / 45 Model danych relacyjny model danych nie zawsze wygodny I I normalizacja vs. efektywność brakujące dane trudności przy zmianie schematu danych Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 12 / 45 Motywacje Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 13 / 45 Podział ze względu na reprezentację danych klucz-wartość hierarchiczna struktura klucz-wartość (“BigTable-like”) dokumentowe grafowe Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 14 / 45 Bazy klucz-wartość przechowują pary klucz-wartość dostęp do danych jedynie po kluczu przykłady: I I I Berkeley DB Riak Dynamo Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 15 / 45 Bazy z hierarchiczną strukturą klucz-wartość wzorowane na BigTable (Google) każdy wiersz może mieć przyporządkowany inny zestaw kolumn częściowo ustrukturalizowane przykłady: I I I HBase Cassandra SimpleDB columnfamily row1 supercolumn1 columnfamily1 supercolumn1 row-key1 row-key2 supercolumn2 col1 col2 col1 col3 ... val1 val2 val3 val4 ... supercolumn1 column1 column2 supercolumn2 column3 row2 supercolumn2 Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 16 / 45 Bazy z hierarchiczną strukturą klucz-wartość Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 17 / 45 Dokumentowe bazy danych przechowuje dokumenty zamiast wierszy/rekordów dokument: wpis w bazie składający się z pól (nazwa-wartość) możliwość odwoływania się po polach nie będących kluczem podstawowym przykłady: I I I { imie: nazwisko: nr_indeksu: oceny: dzienny: "Jan", "Kowalski", 98765, [5, 4.5, 3, 4] true } db.students.find({nazwisko: "Kowalski"}) CouchDB MongoDB ThruDB Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 18 / 45 Grafowe bazy danych węzły, krawędzie (łuki), własności szybki dostęp do powiązanych danych przykłady: I I I HyperGraphDB Neo4J Trinity Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 19 / 45 Amazon Dynamo baza typu klucz-wartość stworzona do zarządzania stanem usług oferowanych przez Amazon: I I I koszyk zakupów: dziesiątki milionów zapytań, do 3 mln transakcji zakupu dziennie sesje klientów: setki tysięcy równoległych sesji inne usługi: katalog produktów, system rekomendacji rozproszona architektura — serwery rozproszone po całym świecie spójność ostateczna Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 20 / 45 Cele niezawodność (dostępność) — nawet kosztem spójności skalowalność pozioma — commodity hardware SLA — ograniczenia na czas odpowiedzi Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 21 / 45 Dlaczego nie RDBMS dostęp do danych poprzez klucz podstawowy — nie potrzeba modelu relacyjnego brak operacji odwołujących się do kilku elementów — nie potrzeba transakcji RDBMS wymaga specjalistów i drogiego sprzętu ograniczona dostępność w przypadku awarii słaba skalowalność pozioma — brak wsparcia dla automatycznego partycjonowania Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 22 / 45 Interfejs komunikacja po HTTP operacje: I I get(key) — odsyła wartość oraz kontekst put(key, context, value) Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 23 / 45 Partycjonowanie danych consistent hashing (MD5 128b) Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 24 / 45 Replikacja konfigurowalna liczba replik lista preferencji sloppy quorum Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 25 / 45 Uspójnianie stanu uspójnianie przy odczycie anti-entropy hinted handoff Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 26 / 45 Wielowersyjność obiektów wersja obiektu opisywana przez zegar wektorowy: TS1 : {(S1 , 3), (S2 , 5), (S3 , 1)} TS2 : {(S1 , 3), (S2 , 4), (S3 , 2)} TS3 : {(S1 , 3), (S2 , 6), (S3 , 2)} przechowywanie wersji powstałych współbieżnie do czasu uspójnienia przez klienta przy odczycie klient otrzymuje wszystkie dostępne wersje obiektu Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 27 / 45 Cassandra hierarchiczna struktura klucz wartość Facebook — indeksowanie na potrzeby przeszukiwania skrzynki użytkownika I I I setki milionów użytkowników 600+ rdzeni rozmiar indeksu: 120+ TB open source Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 28 / 45 Struktura danych przestrzeń kluczy (keyspace) rodzina kolumn (column family) — zdefiniowane statycznie I I super kolumny (super columns) kolumny (columns) wiersz (row) — pojedynczy element z przypisanymi kolumnami/super-kolumnami columnfamily1 row-key supercolumn1 columnfamily1 supercolumn2 col1 col2 col1 col3 ... val1 val2 val3 val4 ... Szymon Francuzik [email protected] Bazy () danych NoSQL col21 col22 val5 val6 Poznań, 29.10.2012 29 / 45 Reprezentacja danych klucz i wartość reprezentowana jako tablica bajtów kolumny i super-kolumny posortowane po nazwach lub czasie modyfikacji indeksowanie kluczy Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 30 / 45 Indeksowanie index_by_users_interactions Adam Marek Kasia m100 m252 m124 - - - Szymon Francuzik [email protected] Bazy () danych NoSQL m511 ... m600 ... - ... Poznań, 29.10.2012 31 / 45 Partycjonowanie danych consistent hashing dynamiczne równoważenie obciążenia dwie strategie podziału: I I random partitioner order preserving partitioner Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 32 / 45 Replikacja możliwość konfigurowania liczby replik strategia rozmieszczania replik: I I przydział prosty świadoma topologi sieci: rack aware, datacenter aware Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 33 / 45 Kontrola poziomu spójności Zapisy: any one quorum local_quorum each_quorum all Odczyty: one quorum local_quorum each_quorum all Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 34 / 45 Uspójnianie replik uspójnianie przy odczycie anti-entropy hinted handoff Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 35 / 45 Interfejs Thrift — RPC framework for cross-language service development wspierane języki: C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml gotowe biblioteki dla wybranych języków programowania Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 36 / 45 Example Code v a r c l i e n t F a c t o r y = new K e y e d C a s s a n d r a C l i e n t F a c t o r y ( new C a s s a n d r a C l i e n t P o o l F a c t o r y ( ) . C r e a t e ( ) , new K e y e d C a s s a n d r a C l i e n t F a c t o r y . C o n f i g ( ) ) ; v a r c l i e n t = c l i e n t F a c t o r y . Make ( new E n d p o i n t ( " l o c a l h o s t " , 9 1 6 0 ) ) ; var keyspace = c l i e n t . GetKeyspace ( " Keyspace1 " ) ; v a r path = new ColumnPath ( " S t a n d a r d 1 " , n u l l , " g r e e t i n g " ) ; k e y s p a c e . I n s e r t ( " 0 " , path , " H e l l o ␣ World ! " ) ; Column column = k e y s p a c e . GetColumn ( " 0 " , path ) ; C o n s o l e . W r i t e L i n e ( column . V a l u e ) ; Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 37 / 45 RavenDB dokumentowa — JSON schema-less transakcje Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 38 / 45 Skalowalność replikacja sharding Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 39 / 45 Interfejs .NET Client HTTP — RESTful API Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 40 / 45 .NET Client Example B l o g P o s t p o s t = new B l o g P o s t ( ) { T i t l e = " H e l l o ␣RavenDB" , C a t e g o r y = "RavenDB" , C o n t e n t = " T h i s ␣ i s ␣ a ␣ b l o g ␣ a b o u t ␣RavenDB" , Comments = new BlogComment [ ] { new BlogComment ( ) { T i t l e=" U n r e a l i s t i c " , C o n t e n t=" e x a m p l e 1 " } , new BlogComment ( ) { T i t l e=" N i c e " , C o n t e n t=" e x a m p l e 2 " }} }; s e s s i o n . Store ( post ) ; s e s s i o n . SaveChanges ( ) ; Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 41 / 45 RESTful Example PUT / d o c s / B l o g P o s t s /1 HTTP/ 1 . 1 Accept −E n c o d i n g : d e f l a t e , g z i p C o n t e n t −Type : a p p l i c a t i o n / j s o n ; c h a r s e t=u t f −8 Host : 1 2 7 . 0 . 0 . 1 : 8 0 8 0 C o n t e n t −L e n g t h : 378 { " T i t l e " : " H e l l o ␣RavenDB" , " C a t e g o r y " : "RavenDB" , " C o n t e n t " : " T h i s ␣ i s ␣ a ␣ b l o g ␣ a b o u t ␣RavenDB" , "Comments" : [ {" T i t l e " : " U n r e a l i s t i c " , " Content " : " This ␣ example ␣ i s ␣ u n r e a l i s t i c " } , {" T i t l e " : " Nice " , " Content " : " This ␣ example ␣ i s ␣ n i c e "} ] } Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 42 / 45 Bibliografia http://nosql-database.org/ Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 43 / 45 Bibliografia http://nosqltapes.com/ Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 44 / 45 Bibliografia http://nosqlsummer.org/ Szymon Francuzik [email protected] Bazy () danych NoSQL Poznań, 29.10.2012 45 / 45