2016-07-06 3 views
2

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

  1. Lambdas lesen Sie die DynamoDB Strom und schieben Sie sie auf ES über SQS
  2. 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?

+0

Dies ist ein paar Monate alt; Haben Sie jemals eine Antwort auf diese Frage gefunden? – Jacob

Antwort

0

Jemand von AWS (oder mehr Erfahrung) sollte klären, aber mein Verständnis ist, dass jede Dynamo-Partition zunächst auf einen Shard abbildet. Wenn dieser Shard voll ist, werden untergeordnete Shards erstellt. Jeder Shard und seine untergeordneten Elemente werden nacheinander von einem einzelnen KCL-Worker verarbeitet.

Da der Partitionsschlüssel eines Elements verwendet wird, um den Desitnations-Shard zu bestimmen, landen Mutationen desselben Elements im selben Shard (oder seinen Kindern). Ein Scherbe und seine Kinder werden garantiert von einem KCL-Arbeiter in der richtigen Reihenfolge verarbeitet. Jeder KCL-Worker bildet auch eine einzelne Lambda-Instanz ab, sodass das gleiche Element niemals für verschiedene Mutationen parallel verarbeitet wird.

Obwohl Dynamo-Streams sich von Kinesis-Streams unterscheiden, half das Lesen der Kinesis-Dokumentation beim Platzieren einiger Teile im Puzzle. Es gibt auch einen interessanten Blog mit sehr nützlichen Informationen.

Verwandte Themen