Entwicklungsteams müssen häufig komplexe Filter, Aggregationen und Textsuchen auf Daten aus DynamoDB ausführen. Allerdings ist DynamoDB eine operative Datenbank, die für die Transaktionsverarbeitung und nicht für Echtzeitanalysen optimiert ist. Daher stoßen viele Entwicklungsteams bei der Analyse von DynamoDB an Grenzen und suchen nach Alternativen.
Das liegt daran, dass operative Workloads ganz andere Zugriffsmuster aufweisen als komplexe analytische Workloads. DynamoDB unterstützt nur eine begrenzte Anzahl von Operationen, was Analysen schwierig und in manchen Situationen unmöglich macht. Sogar AWS , das Unternehmen hinter DynamoDB, rät Unternehmen, die Auslagerung von Analysen auf andere, speziell entwickelte Lösungen in Betracht zu ziehen. Eine häufig erwähnte Lösung ist Elasticsearch, mit der wir uns heute befassen werden.
DynamoDB ist eine der beliebtesten NoSQL-Datenbanken und wird von vielen Web-Scale-Unternehmen in den Bereichen Gaming, Social Media, IoT und Finanzdienstleistungen verwendet. DynamoDB ist aufgrund seiner Skalierbarkeit und Einfachheit die Datenbank der Wahl und ermöglicht eine Leistung im einstelligen Millisekundenbereich bei einer Größenordnung von 20 Millionen Anfragen pro Sekunde. Um diese Geschwindigkeit in großem Maßstab zu erreichen, konzentriert sich DynamoDB ganz darauf, die Leistung für operative Workloads zu optimieren – hochfrequente Operationen mit geringer Latenz an einzelnen Datensätzen.
Elasticsearch ist eine Open-Source-Suchmaschine, die auf Lucene basiert und für Anwendungsfälle wie Textsuche und Protokollanalyse verwendet wird. Elasticsearch ist Teil des größeren ELK-Stacks, zu dem auch Kibana gehört, ein Visualisierungstool für analytische Dashboards. Elasticsearch ist zwar für seine Flexibilität und hohe Anpassbarkeit bekannt, ist jedoch ein komplexes verteiltes System, das Cluster- und Indexvorgänge sowie -verwaltung erfordert, um leistungsfähig zu bleiben. Es gibt verwaltete Angebote von Elasticsearch von Elastic und AWS, sodass Sie es nicht selbst auf EC2-Instanzen ausführen müssen.
Unverhohlene Werbung: Rockset ist eine Echtzeit-Analysedatenbank für die Cloud. Sie verfügt über einen integrierten Konnektor zu DynamoDB und nimmt Daten auf und indiziert sie für sekundenschnelle Suchvorgänge, Aggregationen und Verknüpfungen. In diesem Beitrag geht es jedoch darum, Anwendungsfälle für DynamoDB und Elasticsearch hervorzuheben, falls Sie diese Option erkunden möchten.
Sie können AWS Lambda verwenden, um DynamoDB-Daten kontinuierlich in Elasticsearch für Analysen zu laden. So funktioniert es:
Es gibt einen alternativen Ansatz zum Synchronisieren von Daten mit Elasticsearch unter Verwendung des Logstash-Plugins für DynamoDB. Dieser wird derzeit jedoch nicht unterstützt und die Konfiguration kann komplex sein.
Bei der Textsuche wird Text in einem Dokument durchsucht, um die relevantesten Ergebnisse zu finden. Oftmals möchten Sie nach einem Wortteil, einem Synonym oder einem Antonyme von Wörtern oder einer Wortfolge suchen, um das beste Ergebnis zu finden. Einige Anwendungen gewichten Suchbegriffe sogar je nach ihrer Wichtigkeit unterschiedlich.
DynamoDB kann einige begrenzte Anwendungsfälle der Textsuche unterstützen, indem es einfach Partitionierung verwendet, um die Daten zu filtern. Wenn Sie beispielsweise eine E-Commerce-Site betreiben, können Sie Daten in DynamoDB basierend auf einer Produktkategorie partitionieren und dann die Suche im Arbeitsspeicher ausführen. Offensichtlich handhabt die Einzelhandelsabteilung von Amazon.com viele Anwendungsfälle der Textsuche auf diese Weise. DynamoDB unterstützt auch eine Funktion „Contains“ , mit der Sie eine Zeichenfolge finden können, die eine bestimmte Teilzeichenfolge von Daten enthält.
Eine E-Commerce-Site kann Daten nach Produktkategorie aufteilen. Mit den gesuchten Daten können zusätzliche Attribute wie Marke und Farbe angezeigt werden.
In Szenarien, in denen die Volltextsuche für Ihre Anwendung von zentraler Bedeutung ist, sollten Sie eine Suchmaschine wie Elasticsearch mit Relevanzranking verwenden. So funktioniert die Textsuche auf hoher Ebene in Elasticsearch:
Relevanz-Ranking : Elasticsearch verfügt über ein standardmäßiges Relevanz-Ranking für die Suchergebnisse, Sie können das Ranking aber auch an Ihren spezifischen Anwendungsfall anpassen. Standardmäßig erstellt Elasticsearch einen Ranking-Score basierend auf der Begriffshäufigkeit, der inversen Dokumenthäufigkeit und der Feldlängennorm.
Textanalyse : Elasticsearch zerlegt Text in Token, um die Daten zu indizieren. Dies wird als Tokenisierung bezeichnet. Anschließend werden Analysetools auf die normalisierten Begriffe angewendet, um die Suchergebnisse zu verbessern. Das standardmäßige Standardanalysetool zerlegt den Text gemäß dem Unicode-Konsortium, um allgemeine, mehrsprachige Unterstützung zu bieten.
Elasticsearch verfügt außerdem über Konzepte wie Fuzzy-Suche, Auto-Vervollständigungssuche und noch erweiterte Relevanz, die an die Besonderheiten Ihrer Anwendung angepasst werden kann.
Komplexe Filter werden verwendet, um den Ergebnissatz einzugrenzen und so Daten schneller und effizienter abzurufen. In vielen Suchszenarien möchten Sie mehrere Filter kombinieren oder nach einem Datenbereich filtern, z. B. über einen Zeitraum.
DynamoDB partitioniert Daten und die Wahl eines guten Partitionsschlüssels kann dazu beitragen, das Filtern von Daten effizienter zu gestalten. DynamoDB unterstützt auch sekundäre Indizes, sodass Sie Ihre Daten replizieren und einen anderen Primärschlüssel verwenden können, um zusätzliche Filter zu unterstützen. Sekundäre Indizes können hilfreich sein, wenn es mehrere Zugriffsmuster für Ihre Daten gibt.
Beispielsweise könnte eine Logistikanwendung so konzipiert werden, dass Artikel basierend auf ihrem Lieferstatus gefiltert werden. Um dieses Szenario in DynamoDB zu modellieren, erstellen wir eine Basistabelle für die Logistik mit einem Partitionsschlüssel von Item_ID
, einem Sortierschlüssel von Status
und den Attributen Käufer, ETA
und SLA
.
Wir müssen außerdem ein zusätzliches Zugriffsmuster in DynamoDB unterstützen, wenn Lieferverzögerungen das SLA überschreiten. Sekundärindizes in DynamoDB können genutzt werden, um nur die Lieferungen herauszufiltern, die das SLA überschreiten.
Für das Feld ETADelayedBeyondSLA
wird ein Index erstellt, der eine Replik des ETA-Attributs ist, das sich bereits in der Basistabelle befindet. Diese Daten werden nur dann in ETADelayedBeyondSLA
aufgenommen, wenn die ETA das SLA überschreitet. Der sekundäre Index ist ein Sparse-Index, der die Datenmenge reduziert, die in der Abfrage gescannt werden muss. Der buyer
ist der Partitionsschlüssel und der Sortierschlüssel ist ETADelayedBeyondSLA
.
Sekundärindizes können verwendet werden, um mehrere Zugriffsmuster in der Anwendung zu unterstützen, einschließlich Zugriffsmuster mit komplexen Filtern.
DynamoDB verfügt in seiner Abfrage- und Scan-API über eine Filterausdrucksoperation , um Ergebnisse zu filtern, die nicht mit einem Ausdruck übereinstimmen. Der filterexpression
wird nur nach einer Abfrage- oder Scan-Tabellenoperation angewendet, sodass Sie immer noch an das Datenlimit von 1 MB für eine Abfrage gebunden sind. Allerdings ist der filterexpression
hilfreich, um die Anwendungslogik zu vereinfachen, die Größe der Antwortnutzlast zu reduzieren und den Ablauf der Lebensdauer zu validieren. Zusammenfassend müssen Sie Ihre Daten immer noch entsprechend den Zugriffsmustern Ihrer Anwendung partitionieren oder sekundäre Indizes verwenden, um Daten in DynamoDB zu filtern.
DynamoDB organisiert Daten in Schlüsseln und Werten für einen schnellen Datenabruf und ist nicht ideal für komplexe Filter. Wenn Sie komplexe Filter benötigen, sollten Sie zu einer Suchmaschine wie Elasticsearch wechseln, da diese Systeme ideal für die Suche nach der Nadel im Heuhaufen sind.
In Elasticsearch werden Daten in einem Suchindex gespeichert, d. h. in der Liste der Dokumente, für die der Spaltenwert als Postingliste gespeichert ist. Jede Abfrage mit einem Prädikat (z. B.: WHERE
user=A) kann schnell die Liste der Dokumente abrufen, die das Prädikat erfüllen. Da die Postinglisten sortiert sind, können sie zum Abfragezeitpunkt schnell zusammengeführt werden, sodass alle Filterkriterien erfüllt sind. Elasticsearch verwendet außerdemeinfaches Caching, um den Abrufprozess häufig aufgerufener komplexer Filterabfragen zu beschleunigen.
Filterabfragen, in Elasticsearch allgemein als Abfragen ohne Bewertung bezeichnet, können Daten schneller und effizienter abrufen als Textsuchabfragen. Das liegt daran, dass für diese Abfragen keine Relevanz erforderlich ist. Darüber hinaus unterstützt Elasticsearch auch Bereichsabfragen, sodass Daten zwischen einer oberen und unteren Grenze (z. B. age
zwischen 0 und 5) schnell abgerufen werden können.
Bei Aggregationen werden Daten gesammelt und in zusammengefasster Form für Business Intelligence oder Trendanalysen dargestellt. Beispielsweise möchten Sie möglicherweise Nutzungsmetriken für Ihre Anwendung in Echtzeit anzeigen.
DynamoDB unterstützt keine Aggregatfunktionen. Die von AWS empfohlene Problemumgehung besteht darin , DynamoDB und Lambda zu verwenden, um eine aggregierte Datenansicht in einer DynamoDB-Tabelle beizubehalten.
Als Beispiel verwenden wir die Aggregation von Likes auf einer Social-Media-Site wie Twitter. Wir machen die tweet_ID
zum Primärschlüssel und den Sortierschlüssel zum Zeitfenster, nach dem wir Likes aggregieren. In diesem Fall aktivieren wir DynamoDB-Streams und fügen eine Lambda-Funktion an, sodass Tweets, die geliked (oder nicht geliked) werden, in like_count
mit einem Zeitstempel (z. B. last_ updated
“) tabellarisch aufgeführt werden.
In diesem Szenario werden DynamoDB-Streams und Lambda-Funktionen verwendet, um einen Like_Count als Attribut in der Tabelle darzustellen.
Eine weitere Option besteht darin, Aggregationen auf eine andere Datenbank wie Elasticsearch auszulagern. Elasticsearch ist im Kern ein Suchindex und verfügt über Erweiterungen zur Unterstützung von Aggregationsfunktionen. Eine dieser Erweiterungen ist Doc Values , eine Struktur, die beim Indexieren erstellt wird, um Dokumentwerte spaltenorientiert zu speichern. Die Struktur wird standardmäßig auf Felder angewendet, die Doc Values unterstützen, und Doc Values führt zu einer gewissen Speicheraufblähung. Wenn Sie nur Unterstützung für Aggregationen von DynamoDB-Daten benötigen, ist es möglicherweise kostengünstiger, ein Data Warehouse zu verwenden, das Daten für analytische Abfragen über große Datensätze effizient komprimieren kann.
Hier ist ein allgemeiner Überblick über das Aggregationsframework von Elasticsearch :
Bucket-Aggregationen : Sie können sich Bucketing ähnlich wie GROUP BY
in der Welt der SQL-Datenbanken vorstellen. Sie können Dokumente basierend auf Feldwerten oder Bereichen gruppieren. Elasticsearch-Bucket-Aggregationen umfassen auch die verschachtelte Aggregation und die übergeordnete/untergeordnete Aggregation, die gängige Workarounds für die fehlende Join-Unterstützung sind.
Metrikaggregationen: Mit Metriken können Sie Berechnungen wie SUM
, COUNT
, AVG
, MIN
, MAX
usw. für eine Reihe von Dokumenten durchführen. Metriken können auch verwendet werden, um Werte für eine Bucket-Aggregation zu berechnen.
Pipeline-Aggregationen : Die Eingaben für Pipeline-Aggregationen sind keine Dokumente, sondern andere Aggregationen. Häufige Verwendungszwecke sind Durchschnittswerte und Sortierungen basierend auf einer Metrik.
Die Verwendung von Aggregationen kann zu Leistungseinbußen führen, insbesondere wenn Sie Elasticsearch skalieren .
Elasticsearch ist zwar eine Lösung für komplexe Suchvorgänge und Aggregationen von Daten aus DynamoDB, doch viele Befürworter serverloser Systeme äußern Bedenken gegenüber dieser Wahl. Entwicklungsteams entscheiden sich für DynamoDB, weil es serverlos ist und mit sehr geringem Betriebsaufwand in großem Maßstab eingesetzt werden kann. In einem anderen Blog haben wir einige andere Optionen für Analysen auf DynamoDB bewertet, darunter Athena, Spark und Rockset, und zwar hinsichtlich einfacher Einrichtung, Wartung, Abfragefähigkeit und Latenz.
Rockset ist eine Alternative zu Elasticsearch und Alex DeBrie hat das Filtern und Aggregieren von Abfragen mit SQL auf Rockset erläutert. Rockset ist eine Cloud-native Datenbank mit integriertem Connector zu DynamoDB , die den Einstieg erleichtert und analytische Anwendungsfälle skaliert, einschließlich Anwendungsfälle mit komplexen Verknüpfungen. Sie können Rockset als Alternative zu Elasticsearch in unserer kostenlosen Testversion mit 300 $ Guthaben erkunden.