Datenbank am Limit: spaltenorientiert als Ausweg

Datenbank am Limit: spaltenorientiert als Ausweg

Wir alle kennen und schätzen SQL- und NoSQL-­Datenbanken. Doch es gibt Anwendungsfälle, in denen diese Datenbanken an ihre Grenzen stoßen. Zum Beispiel bei der Analyse von Finanzmarktdaten. Dort müssen Zeitreihen von enormer Größe verarbeitet werden. Der Vortrag zeigt auf, wie spaltenorientierte Datenbanken dieses Problem lösen. Die Architektur solcher Tick-Data­-Systeme wird beleuchtet. Der Vortrag endet mit dem Beispiel einer technischen Implementierung für Finanzmarktdaten.

E8f66870d1204779ecc45f2695faa73e?s=128

Michael Wittig

April 22, 2015
Tweet

Transcript

  1. Datenbank am Limit: spaltenorientiert als Ausweg Architektur eines Tick-Data-Systems zur

    Finanzmarktdaten-Analyse
  2. Was sind Finanzmarktdaten?

  3. Zeit Käufer Verkäufer 11:00:00.000 11:00:00.009 11:00:00.025 11:00:00.207 11:00:00.555 11:00:00.873 5000

    @ 84,81 4700 @ 84,81 1000 @ 84,82 7000 @ 84,81 2000 @ 84,81 1500 @ 84,81 500 @ 84,82 200 @ 84,82 900 @ 84,83 800 @ 84,82 200 @ 84,82 100 @ 84,82 Daimler Aktie unregelmäßig
  4. Zeitreihen Was sind Finanzmarktdaten? Tick-Daten

  5. Volumen?

  6. durchschnittlich 5 Quotes / Sekunde Daimler Aktie maximal 200 Quotes

    / Sekunde
  7. Aktie Börse x10 Derivate Optionen x100 Futures x5 Index x3

    Ändert sich der Quote…
  8. On-Disk Repräsentation Wie speichert meine Datenbank die Daten?

  9. Record Disk BSON Padding http://docs.mongodb.org/manual/core/storage/

  10. Page Disk http://www.postgresql.org/docs/9.4/static/storage-page-layout.html Tuple Page Header Free Space

  11. zeilenorientierter Ansatz Zeit Käufer Verkäufer Lokalität

  12. Wir bauen eine zeilenorientierte Datenbank

  13. Einschränkung: Sortiert nach Zeit

  14. Tabelle => Ordner

  15. Zeile => Datei

  16. /Datenbank /Daimler_Quotes /1.dat /2.dat /3.dat /4.dat /5.dat

  17. /Datenbank /Daimler_Quotes /1.dat /2.dat /3.dat /4.dat /5.dat SELECT Käufer_Preis FROM

    Daimler_Quotes WHERE Zeit>10:00:00
  18. /Datenbank /Daimler_Quotes /1.dat /2.dat /3.dat /4.dat /5.dat SELECT Käufer_Preis FROM

    Daimler_Quotes WHERE Zeit>10:00:00
  19. /Datenbank /Daimler_Quotes /123.dat SELECT Käufer_Preis FROM Daimler_Quotes WHERE Zeit>10:00:00 Zeit

    10:00:03 Käufer_Menge 7000 Käufer_Preis 84,81 Verkäufer_Menge 84,82 Verkäufer_Preis 1000 > 10:00:00 Binäre Suche über alle Dateien *.dat
  20. /Datenbank /Daimler_Quotes /1.dat /2.dat /3.dat /4.dat /5.dat SELECT Käufer_Preis FROM

    Daimler_Quotes WHERE Zeit>10:00:00 /Datenbank /Daimler_Quotes /124.dat /125.dat /126.dat /127.dat /… Lese alle Dateien ab 124.dat
  21. Daten Volumen gelesen ~ 90 %

  22. Optimierung?

  23. /Datenbank /Daimler_Quotes /1-100.dat /101-200.dat /201-300.dat /301-400.dat /401-500.dat

  24. None
  25. spaltenorientierter Ansatz Zeit Käufer Verkäufer Lokalität

  26. Wir bauen eine spaltenorientierte Datenbank

  27. Einschränkung: Sortiert nach Zeit

  28. Tabelle => Ordner

  29. Spalte => Datei

  30. /Datenbank /Daimler_Quotes /Zeit.dat /Käufer_Menge.dat /Käufer_Preis.dat /Verkäufer_Menge.dat /Verkäufer_Preis.dat

  31. /Datenbank /Daimler_Quotes /Zeit.dat /Käufer_Menge.dat /Käufer_Preis.dat /Verkäufer_Menge.dat /Verkäufer_Preis.dat SELECT Käufer_Preis FROM

    Daimler_Quotes WHERE Zeit>10:00:00
  32. /Datenbank /Daimler_Quotes /Zeit.dat /Käufer_Menge.dat /Käufer_Preis.dat /Verkäufer_Menge.dat /Verkäufer_Preis.dat SELECT Käufer_Preis FROM

    Daimler_Quotes WHERE Zeit>10:00:00
  33. /Datenbank /Daimler_Quotes /Zeit.dat SELECT Käufer_Preis FROM Daimler_Quotes WHERE Zeit>10:00:00 Zeile

    Daten … 120 09:59:51 121 09:59:57 123 10:00:03 124 10:00:12 … > 10:00:00 Binäre Suche über eine Datei Zeit.dat sortiert
  34. /Datenbank /Daimler_Quotes /Käufer_Preis.dat SELECT Käufer_Preis FROM Daimler_Quotes WHERE Zeit>10:00:00 Zeile

    Daten 123 84,81 124 84,82 125 84,82 126 84,81 127 84,80 … Lese eine Datei Käufer_Preis.dat erst ab Zeile 123
  35. Daten Volumen gelesen ~ 25 %

  36. Optimierung?

  37. Partition => Ordner

  38. /DaimlerQuotes /2015-01-01 /Zeit.dat, Käufer_Preis.dat, … /2015-01-02 /Zeit.dat, Käufer_Preis.dat, … /2015-01-03

  39. /DaimlerQuotes /2015-01-01 /Zeit.dat, Käufer_Preis.dat, … /2015-01-02 /Zeit.dat, Käufer_Preis.dat, … /2015-01-03

    SELECT Käufer_Preis FROM DaimlerQuotes WHERE Datum=2015-01-02 AND Zeit>10:00:00
  40. /DaimlerQuotes /2015-01-01 /Zeit.dat, Käufer_Preis.dat, … /2015-01-02 /Zeit.dat, Käufer_Preis.dat, … /2015-01-03

    SELECT Käufer_Preis FROM DaimlerQuotes WHERE Datum=2015-01-02 AND Zeit>10:00:00
  41. spaltenorientierte Vorteile • nur benötigte Partitionen lesen • nur benötigte

    Spalten lesen • Sortierung ausnutzen
  42. Wie analysieren die größten Finanzinstitute der Welt Zeitreihen?

  43. None
  44. Was ist kdb+? • Implementiert in Q bzw. K •

    In-Memory Datenbank mit Persistenzschicht • Daten liegen sowohl im Speicher als auch auf Festplatte im gleichen Format vor • Spaltenorientiert • Abfragesprache Q oder Q-SQL • Optimierter Zugriff auf Festplatten
  45. 1+2 => 3 sum 1 2 3 => 6 (1

    2 3 4 5)+1 => (2 3 4 5 6) (1 2 3)+(4 5 6) => (5 7 9) sums 1 2 3 4 5 6 => 1 3 6 10 15 21
  46. for(…) while(…)

  47. select max kauf_preis by datum from quotes where symbol=`Daimler datum

    | kauf_preis ———————————————————————— 2015-01-02 | 75,57 2015-01-03 | 74,81 2015-01-04 | 76,13
  48. Was kdb+ nicht ist • Keine Stored Procedures vs Application

    Server Abwägungen: Code nahe an die Daten • Keine Verluste durch (De)Serialisierung beim Transport zwischen Datenbank und Applikation durch "spezielles" Format • Keine ORM Probleme • Keine Universal-Datenbank
  49. Echtzeit und Historie

  50. kdb+tick Quote Pub/Sub System aktueller Tag Historie (< aktueller Tag)

    00:00:00
  51. Tickerplant • Setzen eines Zeitstempels: garantiert Sortierung • Speichern der

    Daten in einem Logfile • Publish/Subscribe Mechanismus • Initiierung des Endofday Events beim wechseln des Tages (00:00:00 Uhr) • Input: 100.000 Werte / Sekunde (1 Thread)
  52. Chains Quote 10 Sekunden Aggregation 15 Minuten Aggregation Tages Volumen

    Tages Hoch/Tief Konsument
  53. Echtzeit Datenbank • subskribiert beim Start alle Daten bei der

    tp • liest das aktuelle Logfile ein • hält alle Daten des aktuellen Tages im Speicher • persistiert alle Daten des Tages auf Platte bei Endofday Event
  54. Historische Datenbank • beinhaltet alle Daten, die älter als der

    aktuelle Tag sind
  55. Performance

  56. Szenario • 1 Billion Datensätze • Maschine: 16 Core Intel

    E5, 256 GB RAM
  57. Speicherplatz kdb+ PostgreSQL MongoDB 25 GB 150 GB 245 GB

  58. kdb+ PostgreSQL MongoDB 18 ms 6800 ms 8900 ms Query

    1
  59. Query 2 kdb+ PostgreSQL MongoDB 12 ms 5200 ms 1700

    ms
  60. Query 3 kdb+ PostgreSQL MongoDB 36 ms 4800 ms 5800

    ms
  61. kdb+

  62. Demo

  63. http://kx.com kostenlose 32 bit Testversion

  64. Alternativen?

  65. None
  66. • Open Source • spaltenorientiert • seit ~1997 • SQL

    2003 • Echtzeit (DataCell ) und Historie • R Integration
  67. None
  68. • Redshift • Closed Source & SaaS • spaltenorientiert •

    Historie • Kinesis • Closed Source & SaaS • Echtzeit
  69. http://manning.com/wittig Michael Wittig mwittig@tecracer.de SaaS Zeitreihendatenbank TimeSeries.Guru 40% Rabatt Code

    cfwittigtw