warum 'ne datenbank, wenn wir elasticsearch haben?
DESCRIPTION
Developer Conference Hamburg 2013TRANSCRIPT
Warum ‘ne Datenbank, wenn wir Elasticsearch haben?
@jodok #dchh
@jodok @cratedb
@lovelysystems
Was macht ‘ne Datenbank?
1. Dokumente speichern 2. Binäre Objekte speichern 3. … wieder finden/lesen 4. … analysieren 5. … wieder verändern
Wie macht man das bei einer großen Datenmenge?
MongoDB (1., 3., 4., 5.?) + Elasticsearch (3.) + GridFS (2)
!
Riak (1., 3., 4.?, 5.?) + Solr (3.) + Rados (2) !
CouchDB (1., 4) + Elasticsearch (3.) + HDFS (2.) + Hadoop (4., 5.)
Einfachzu benutzen, zu skalieren, zu betreiben
Elasticsearcheinfach geil
Einfach toll… (nicht nur search)
• Echtzeit-Suche
• Verteilt
• Hoch verfügbar
• Mandantenfähig
• Volltext Suche
• Versions - Konfliktbehebung
• Restful API
Und nu’?
• Sicherheitsmodell? • Transaktionen? • Datensicherheit? • Reifegrad der Werkzeuge? • Große Berechnungen? • Verfügbarkeit der Daten?
Was macht die Datenhaltung?
… but also inspired by Nathan Marz
ACID• Atomicity - alles oder nichts
• Consistency - nur gültige/valide Daten werden gespeichert
• Isolation - sich so verhalten, als ob alle Transaktionen seriell passieren und die Daten korrekt sind
• Durability - ich lese genau das, was ich geschrieben habe
• Das ist zuuu vieeel, speziell bei verteilten Knoten.
• Ausfälle? Zuverlässigkeit? Mehrere Server!
• Hohe Anzahl von parallelen Lese- und Schreibzugriffe?
• Diese Algorithmen sind nicht für verteile Umgebungen gemacht und zu langsam.
Jeder, der große Applikationen baut, setzt auf CAP und BASE.
http://bigdatanerd.files.wordpress.com/2011/12/cap-theorem.jpg
• Basically Available - das System gibt immer eine Antwort
• Soft State - es muss nicht jederzeit konsistent sein.
• Eventually Consistent - zu einem späteren Zeitpunk wird es konsistent
BASE & CAP
Genau! Wir brauchen einen
Key/Value store!
PUT GET
Nicht ganz…
Anfrage = Funktion(Alle Daten)
• Manchmal geht es darum, gespeicherte Informationen wieder abzurufen
• Meistens werden jedoch Transformationen, Aggregationen und andere Funktionen benötigt.
• z.B. die Anzahl von Seitenaufrufen einer speziellen URL über einen gewissen Zeitraum
Strukturierte Daten?
Schemas
• Schwierig zu ändern
• “Sind im weg”, stören
• Generieren Zusatzaufwand für den Entwickler
• Es nervt, im Voraus Informationen festzulegen
Nathan Marz: http://www.slideshare.net/nathanmarz/runaway-complexity-in-big-data-and-a-plan-to-stop-it
Genau! Lass uns eine schemalose NoSQL
Datenbank benutzen!
Das ist eine Überreaktion
Bitte folgert nicht von der !
schlechten Umsetzung!!
von Schemas auf den !
Zusatzwert, !
den Schemas erzeugen!
Funktion(Datenmenge)
Wenn man eine Schema so betrachtet, dann kann man rausfinden, ob Daten valide sind oder
nicht. Das ist hilfreich!
Der Wert von Schemas• Strukturelle Integrität
• Garantie, was gespeichert und gelesen werden kann
• Verhindert Datenkorruption
• Fehler wird zu dem Zeitpunkt geworfen, an dem er gemacht wurde
• spart Zeit
• Korrupte Daten beim lesen?
• Fehler viel später?
• Was sind die Umstände der Datenkorruption?
Also, was wollen wir?
• Linear skalierende Storage
• sharded, massiv paralleles Cluster
• Semi-strukturierte Datensätze, inklusive Binärendateien
• Real-time queries mit SQL
• Erweiterte SQL Abfragen möglich (und UDFs).
• Open Source
• Standard-Hardware (Betriebsystem unabhängig)
You know, for searchquerying 24 000 000 000 Records in 900ms
@jodok14502 views
S3
distcp
HDFS
transform
https://github.com/lovelysystems/ls-hive https://github.com/lovelysystems/ls-thrift-py-hadoop
HDFS
MAPRED
ES
• Map/Reduce to push to Elasticsearch
• via NFS to HDFS storage
• no dedicated nodes
Speicher
• Die täglichen Spitzen liegen bei 600MByte/s
Netzwerk
Antwortzeit
Lasst uns den Kurs weiterfahren
STORM ?
Die Komponenten
Das hört sich ja gut an,• aber was funktioniert denn schon alles?
Table creationcr> create table my_table1 (!... first_column integer primary key,!... second_column string!... ) clustered into 10 shards!CREATE OK (... sec)!!
+ routing!+ replicas!+ fulltext indizes, analyzers!- ALTER!- Schema for object fields
Insert/Update Datacr> insert into locations values ('2013-09-12T21:43:59.000Z', 'Blagulon Kappa is the planet to which the police are native.', 'Planet', 'Blagulon Kappa', 7)!
INSERT OK, 1 row affected (... sec)
cr> update locations set race['name'] = 'Human' where name = 'Bartledan'!
UPDATE OK, 1 row affected (... sec)
Queriescr> select name, race['name'] from locations where race['name'] = 'Bartledannians'!+-----------+----------------+!| name | race['name'] |!+-----------+----------------+!| Bartledan | Bartledannians |!+-----------+----------------+!SELECT 1 row in set (... sec)!!
cr> select count(*), kind from locations group by kind order by count(*) desc, kind asc!+----------+-------------+!| COUNT(*) | kind |!+----------+-------------+!| 5 | Planet |!| 4 | Star System |!+----------+-------------+!SELECT 3 rows in set (... sec)
Clients
• CRasH: Crate shell for command line (python)
• Python (BLOB, DB-API, SQLAlchemy)
• Java (JDBC planned)
• SQL over HTTP always possible
Funktioniert das wirklich?
Was passiert auf der Hardware?
• 4 Server: Supermicro SuperServer SYS-5017C-MTF • CPU: Intel Xeon E3-1240 - 3,3GHz (8 Cores) • Memory: 4x Samsung Memory M391B1G73BH0-CH9 8GB • Disks:1x Intel 320 Series 300GB 63,5mm Flash SSD
1x Western Digital WD RE4 WD1003FBYX 1000 GB !
• ca. 10 Tabellen für die Applikationen (davon 8 mit < 50k Datensätze, 2 mit insgesamt 250M.
• Reine Datenmenge: 25GB • 1 Replika
!
• Applikation erzeugt ca. 750 queries pro Sekunde (davon ca. 300 INSERT)
Und dann gibt’s ein Release: