Ich bin dabei, DynamoDB in ElasticSearch (ES) zu replizieren. Wir untersuchten die logstash input plugin für diesen Zweck, fand aber die folgenden Nachteile:Zu welchem Stream-Shard wird eine DynamoDB-Mutation platziert?
- logstash in einem Pull-Modus nicht HA/Failover-Funktionen. Es wird zu einem SPOF für die Replikation
- Da wir keine Joins auf Anwendungsebene für ES-Indizes ausführen möchten, möchten wir mehrere Tabellen in einem ES-Dokument zusammenführen. Das Plugin bietet keine Funktionen für diesen Anwendungsfall.
Daher bewerten wir die folgenden beiden Ansätze
- Lambdas lesen Sie die DynamoDB Strom und schieben Sie sie auf ES über SQS
- Unsere eigenen DynamoDB Stromprozessor AWS lambdas ersetzen
Jetzt kommt das eigentliche Problem: Reihenfolge ist wichtig beim Replizieren von Daten aus den Dynamo-Streams nach ES, da es mehrere Mutationen für dieselbe Entität geben könnte. In der Stream/Lambda-Dokumentation wird erwähnt, dass Inhalte in verschiedenen Stream-Shards gleichzeitig von lambdas verarbeitet werden.
AWS dokumentiert (oder konnte zumindest nicht lokalisieren) Details dazu, wie DynamoDB-Mutationen Stream Shards zugeordnet werden - ob eine Korrelation zu Hash-Schlüsseln von Tabellen besteht oder ob es sich um eine Art Bin handelt -Packing-Algorithmus.
Ohne Kontrolle darüber, welcher Stream-Shard einer Mutation zugeordnet ist, bietet sich keine Entwicklerfunktionalität zur Steuerung der Parallelisierung der Stream-Verarbeitung an. Der obige Ansatz 1 könnte dasselbe ES-Dokument außer Betrieb bringen. Approach # 2 kann durch serielles Verarbeiten gelöst werden, erlaubt aber keine Parallelisierung/Skalierung der Replikation (sogar über Datenpartitionen hinweg), da es keinen Vertrag für die Shard-Platzierungsstrategie gibt.
Haben Sie irgendwelche Gedanken darüber, wie Sie skalieren und die Replikation auch für Fehler anfällig machen? Oder könnte jemand herausfinden, wie Mutationen in Dynamodb-Stream-Shards platziert werden?
Dies ist ein paar Monate alt; Haben Sie jemals eine Antwort auf diese Frage gefunden? – Jacob