neighbourhoodie-nnh-logo

Structured Query Server

SQL-Abfragen für Apache CouchDB

Produktbeschreibung

Structured Query Server (SQS) ist eine SQL-Abfrage-Engine für CouchDB, mit der durch komplexe SQL SELECT-Anweisungen äußerst flexibel Informationen aus einer CouchDB-Datenbank extrahiert werden können.

Anwendungsfälle

Entwickler_innen können komplexere Software auf CouchDB schneller implementieren, und zwar ohne Leistungseinbußen oder Verzicht auf die einzigartigen Replikationsfähigkeiten von CouchDB.

SQS erweitert nahtlos die nativen Abfragemechanismen von CouchDB und erlaubt komplexe, bislang mit CouchDB-Daten unmögliche Abfragen, unter Anderem das Suchen von Dokumenten nach mehreren Kriterien, das Sortieren nach mehreren anderen Werten, und komplexe JOIN-Operationen.

Datenanalyst_innen können nun mit ihren gewohnten Werkzeugen Daten aus CouchDB abfragen, ohne dass zusätzliche Infrastruktur vonnöten wäre.

SQS gibt Datenanalyst_innen vollen Zugriff auf CouchDB-Daten, ohne dass sie die Eigenheiten von CouchDB lernen müssen.

Produktmerkmale

HTTP-Schnittstelle, die JSON zurückgibt: Überall ohne Overhead verfügbar, kein SQL-Client notwendig.

SQS läuft parallel zu CouchDB und bleibt automatisch auf dem neuesten Stand.

Funktioniert problemlos mit den meisten Datenbank-Strukturen und Knoten-Konfigurationen.

Verarbeitet problemlos millionen Dokumente pro Datenbank.

Schnelle Indizierung der Daten (im Durchschnitt ungefähr so schnell wie JS-Views in CouchDB)

Structured Query Server orientiert sich funktional an CouchDB:

  • Wird das Schema in einem Design-Dokument geändert, aktualisiert sich SQS automatisch
  • Indizes werden in SQS as hashes des Schemas gespeichert, das erlaubt das "aufwärmen" von Indizes vor der Verwendung in einem Produktions-Kontext
  • Unterstützt _purge für das strikte Entfernen von Daten, z.B. aus GDPR-Gründen.
  • Mit _stats-Endpunkt, der nützliche Laufzeit-Statistiken ausgibt
  • Verschiedene Log-Levels von Request-Logging bis Debugging nach stdout, syslog oder in eine Datei.
  • Unterstützt sowohl CouchDB-Instanzen mit einem einzigen Knoten als auch CouchDB-Cluster, inklusive dem Zurückspulen der _changes-feeds
  • Compaction von Indizes wird automatisch erledigt, kann aber auch auf manuell umgestellt werden.
  • Von Grund auf als crash-proof ausgelegt, genau wie CouchDB auch (der SQS-Prozess kann ohne Vorwarnung jederzeit problemlos gestoppt werden).

Installation und Verwendung

Structured Query Server wird als binary ausgeliefert und ist einfach einzurichten und zu verwenden.

Installation

  1. Structured Query Server im Terminal starten und dabei die URL der Ziel-CouchDB angeben
  2. In jeder abzufragenden CouchDB-Datenbank ein SQS-spezifisches Design-Dokument anlegen, in dem das Schema und die Zuordnungen zwischen CouchDB-Dokumenten und SQL Tabellen und Zeilen definiert wird.

Verwendung

SQL SELECT-Befehle werden via einfache HTTP-requests an den Structured Query Server geschickt:

curl http://user:pass@couchdb.example.com:4984/db/_design/sqs -X POST \
-d 'SELECT ein_feld FROM table WHERE anderes_feld = 'wert' AND drittes_feld = 42 ORDER BY noch_ein_anderes_feld DESC LIMIT 5'

SQS ist aktuell für Linux x86_64, Mac x86_64 und Windows x86_64 verfügbar, die Unterstützung weiterer Architekturen ist in Arbeit.

Zusätzlich bieten wir ein Supportpaket für SQS an, falls zusätzliche Unterstützung bei der Einrichtung oder produktiven Nutzung des Structured Query Servers erforderlich ist.

Technische Details

Structured Query Server ist eine Node.js-Software und verwendet SQLite für Datenpersistenz und für Abfragen. Die event-basierte Laufzeitumgebung von Node.js ist perfekt für SQS, welcher Daten aus CouchDB über das Netzwerk lädt und die Ergebnisse in Indizes speichert, und dabei gleichzeitig schnelle HTTP-requests für SQL-Abfragen mit hoher Parallelität ermöglicht.

SQS ist ein HTTP-Server, der automatisch die Zugangseinstellungen der CouchDB übernimmt, es ist kein weiteres Zugangsmanagement erforderlich.

Unterstützt sämtliche SQLite-features:

  • Subqueries, auch korellierte subqueries.
  • Bis zu 64-fache JOINs.
  • LEFT, RIGHT, FULL INNER, OUTER und CROSS JOINs.
  • DISTINCT, ORDER BY, GROUP BY, HAVING, LIMIT, und OFFSET.
  • UNION, UNION ALL, INTERSECT, und EXCEPT.

Preise

SQS ist Kaufsoftware, es ist kein Abonnement erforderlich.

Für 1490 EUR* kaufen

* Ggf. zzgl. Umsatzsteuer

Weitere Details finden Sie in unserem Lizenzvertrag für SQS.

Weiterführender Produktsupport für SQS ist als separate Dienstleisung verfügbar.

FAQ

Welche Grenzen gibt es bei der Nutzung von SQS mit CouchDB?

CouchDB ermöglicht simple und mittelmäßig komplexe Abfragen bei hoher Geschwindigkeit und extremer Skalierbarkeit. Die Begrenzung der Komplexität ist dabei durchaus Absicht, da es erst hierdurch möglich wird, dieselben Abfragen auf einer ein-Knoten CouchDB oder einem Cluster mit 100 Knoten zu machen. Der Großteil aller CouchDB-Nutzer hat allerdings Instanzen mit 1–6 Knoten, und für diese Nutzer kann der Structured Query Server wieder in die andere Richtung gewichten und sehr komplexe Abfragen zu Lasten der Skalierbarkeit erlauben. Structured Query Server ist dabei immer noch ordentlich schnell und hält auch bei großen Datenmengen mit, aber ab einer gewissen Cluster-Größe sind die Grenzen dann doch irgendwann erreicht. Weiter unten ist eine Leistungsübersicht zu finden, mit der sich grob abschätzen lässt, ob SQS eine realistische Option für Sie ist.

Ist SQS mit anderer SQL-Software kompatibel?

Nein, SQS ist keine vollständige SQL-Schnittstelle, sondern unterstützt nur SELECT-Abfragen.

Gibt es SQS nur für SQLite?

Aktuell ja, wir evaluieren allerdings das Interesse an anderen Varianten: Structured Query Server für MySQL, PostgreSQL, MSSQL und Oracle. Melden Sie hier Ihn Interesse an, und wir verschicken eine Benachrichtigung, wenn sich bei denen von Ihnen gewählten SQL-Varianten etwas tut.

Leistungsfähigkeit von SQS

Um die höchstmögliche Leistungsfähigkeit von SQS zu ermöglichen, haben wir ausgiebige Tests und benchmarks durchgeführt. Diese dienen als Richtlinien und Größenordnungsvergleiche für Ihre eigenen Installationen. Anhand dieser lässt sich entscheiden, ob SQS mit Ihrer CouchDB gut funktionieren wird. Dabei gibt es zwei Schwerpunkte: Indizierungsgeschwindigkeit und Abfragegeschwindigkeit.

Indizierungsgeschwindigkeit

Hier betrachten wir zwei Vergleiche:

  1. Wie viel langsamer ist SQS beim Erstellen eines Index aus dem CouchDB _changes feed im Vergleich zu einem curl-Befehl, der den _changes feed an /dev/null leitet. Natürlich ist letzteres im Alltag nicht nützlich, stellt aber eine theoretische Maximalgeschwindigkeit dar. SQS wird hier langsamer sein, aber dafür gibt es vollständige SQL-Indizes und Persistenz bei vergleichsweise geringen Geschwindigkeitseinbußen.
  2. Wie schnell ist SQS im Vergleich zu CouchDB JavaScript views, der komplexesten Option für Abfragen aus einer CouchDB? Hier leistet SQS bei vergleichbarer Geschwindigkeit wesentlich mehr.

SQS vs _changes nach /dev/null (theoretisches Optimum)

Anzahl DokumenteDokumentengröße in bytesDifferenz
1 000 — 10 000 0001003,5x (langsamer)
1 000 — 10 000 00010001,87x (langsamer)
1 000 — 10 000 00010 0001,98x (langsamer)

Hier bekommt man also mit SQS bei einer typischen CouchDB für eine ca. zweifache Verlangsamung gegenüber dem theoretischen Optimum eine vollständiges SQL-Setup. Ziemlich gut!

SQS vs JS Views

q=1 Datenbank

Anzahl DokumenteDokumentengröße in bytesDifferenz
1 000 — 10 000 0001000,76x (schneller)
1 000 — 10 000 00010000,84x (schneller)
1 000 — 10 000 00010,0001,18x (langsamer)

q=2 Datenbank

Anzahl DokumenteDokumentengröße in bytesDifferenz
1 000 — 10 000 0001000,86x (schneller)
1 000 — 10 000 00010000,99x (vergleichbar schnell)
1 000 — 10 000 00010,0001,56x (langsamer)

q=4 Datenbank

Anzahl DokumenteDokumentengröße in bytesDifferenz
1 000 — 10 000 0001000,95x (vergleichbar schnell)
1 000 — 10 000 00010001,07x (vergleichbar schnell)
1 000 — 10 000 00010,0001,81x (langsamer)

Mit erhöhtem sharding kann CouchDB multi-core-Systeme besser ausnutzen, aber selbst bei großen Datenbanken kann SQS noch gut mithalten. Bei kleineren Datenbanken ist SQS sogar schneller als JS views. Im Anbetracht der Komplexität der mit SQS möglichen Abfragen sind das sehr gute Messwerte.

Abfragegeschwindigkeit

Hier messen wir die requests pro Sekunde an SQS. Jeder Durchlauf besteht aus 1 000 000 zufälligen Abfragen gegen einen fertig gebauten Index. Hierbei war letztlich unerheblich, wieviele requests gleichzeitig gemacht wurden (wir haben zwischen 1 und 1000 getestet), die Ergebnisse waren unabhängig davon immer ähnlich.

Anzahl DokumenteZeit pro request (ms)Requests pro Sekunde
1 000 — 100 0002,73381,1
500 000 — 750 0003,01321,2
750 000 — 1 000 00012,266,65

Wir schließen daraus, dass SQS bis etwa 750 000 Dokumenten im Index für die meisten Anwendungen schnell genug ist, und darüberhinaus die Grenzen der zugrundeliegenden SQLite-Bibliothek zum Vorschein kommen, wobei die Leistung selbst dann immer noch nicht schlecht ist. Falls Sie höhere Leseleistung bei größeren Dokumentenmengen brauchen, melden Sie Sich gerne bei uns, wir benachrichtigen Sie, sobald wir SQS weiter verbessert haben.

Für mehr Parallelität ist auch möglich, mehere SQS-Instanzen laufen zu lassen, entweder auf multi-Core-Maschinen mit freier CPU-Kapazität oder auf dedizierten Maschinen.