Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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.

Michael Wittig

April 22, 2015
Tweet

More Decks by Michael Wittig

Other Decks in Programming

Transcript

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

    View Slide

  2. Was sind
    Finanzmarktdaten?

    View Slide

  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

    View Slide

  4. Zeitreihen
    Was sind
    Finanzmarktdaten?
    Tick-Daten

    View Slide

  5. Volumen?

    View Slide

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

    View Slide

  7. Aktie
    Börse
    x10
    Derivate
    Optionen
    x100
    Futures
    x5
    Index
    x3
    Ändert sich der Quote…

    View Slide

  8. On-Disk
    Repräsentation
    Wie speichert meine Datenbank die Daten?

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  12. Wir bauen eine
    zeilenorientierte
    Datenbank

    View Slide

  13. Einschränkung:
    Sortiert nach Zeit

    View Slide

  14. Tabelle => Ordner

    View Slide

  15. Zeile => Datei

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  21. Daten
    Volumen
    gelesen
    ~ 90 %

    View Slide

  22. Optimierung?

    View Slide

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

    View Slide

  24. View Slide

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

    View Slide

  26. Wir bauen eine
    spaltenorientierte
    Datenbank

    View Slide

  27. Einschränkung:
    Sortiert nach Zeit

    View Slide

  28. Tabelle => Ordner

    View Slide

  29. Spalte => Datei

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  35. Daten
    Volumen
    gelesen
    ~ 25 %

    View Slide

  36. Optimierung?

    View Slide

  37. Partition => Ordner

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  41. spaltenorientierte Vorteile
    • nur benötigte Partitionen lesen
    • nur benötigte Spalten lesen
    • Sortierung ausnutzen

    View Slide

  42. Wie analysieren die
    größten Finanzinstitute
    der Welt Zeitreihen?

    View Slide

  43. View Slide

  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

    View Slide

  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

    View Slide

  46. for(…)
    while(…)

    View Slide

  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

    View Slide

  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

    View Slide

  49. Echtzeit
    und
    Historie

    View Slide

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

    View Slide

  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)

    View Slide

  52. Chains
    Quote
    10 Sekunden
    Aggregation
    15 Minuten
    Aggregation
    Tages Volumen
    Tages Hoch/Tief
    Konsument

    View Slide

  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

    View Slide

  54. Historische
    Datenbank
    • beinhaltet alle Daten, die älter als der aktuelle Tag
    sind

    View Slide

  55. Performance

    View Slide

  56. Szenario
    • 1 Billion Datensätze
    • Maschine: 16 Core Intel E5, 256 GB RAM

    View Slide

  57. Speicherplatz
    kdb+ PostgreSQL MongoDB
    25 GB
    150 GB
    245 GB

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  61. kdb+

    View Slide

  62. Demo

    View Slide

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

    View Slide

  64. Alternativen?

    View Slide

  65. View Slide

  66. • Open Source
    • spaltenorientiert
    • seit ~1997
    • SQL 2003
    • Echtzeit (DataCell ) und Historie
    • R Integration

    View Slide

  67. View Slide

  68. • Redshift
    • Closed Source & SaaS
    • spaltenorientiert
    • Historie
    • Kinesis
    • Closed Source & SaaS
    • Echtzeit

    View Slide

  69. http://manning.com/wittig
    Michael Wittig
    [email protected]
    SaaS Zeitreihendatenbank
    TimeSeries.Guru
    40% Rabatt Code
    cfwittigtw

    View Slide