Wie komprimieren wir Pub / Sub-Nachrichten und Mehr noch, eine Menge Geld sparen

(29. Dezember 2020)

Komprimierung ist ein Trick, mit dem eine Menge Probleme gelöst werden können. Oft komprimieren Ihre Tools Inhalte transparent: Die meisten modernen Browser fordern komprimierte HTTP-Nutzdaten an, und einige Dateisysteme können so konfiguriert werden, dass Blöcke komprimiert werden, ohne dass der Benutzer dies jemals verlangt.

Außerhalb bekannter Anwendungsfälle gibt es solche Eine Vielzahl von Möglichkeiten, die Effizienz zu verbessern oder durch die Nutzung der Komprimierung eine Menge Geld zu sparen. Es ist hilfreich, sich über häufige Anwendungsfälle im Klaren zu sein, damit Sie diese Gelegenheiten nutzen können, wenn sie auftreten.

Migrieren von Protokollen

Als aktuelles Beispiel hat mein Team Protokolle von einem Elasticsearch-Cluster migriert zum anderen. Dieser Cluster war zwar nicht ganz Big Data ™, verfügte jedoch über 10 Milliarden Protokolleinträge oder etwa 60 TB JSON-Rohdaten.

Wenn Sie Erfahrung mit der Bewältigung lang laufender, umfangreicher Migrationen wie dieser haben, möchten Sie einen Prozess erstellen, der Ermöglicht es Ihnen, das Spiel so oft wie möglich zu speichern. Dies bedeutet, dass Sie einen Exportprozess erstellen und ausführen können, indem Sie alle auftretenden Probleme behandeln (ich verspreche es!) Und dann sauber zum Importprozess übergehen. Wie beim Export wird auch Ihr Importprozess fehlerhaft: Daher sollte auch er leicht wieder ausgeführt werden können.

Da er für eine Vielzahl von GoCardless-Systemen verwendet wird, Google Pub / Sub ist eine natürliche Lösung für dieses Problem. Der Marketing-Slogan von Google klingt sogar so, als ob er geschrieben wurde, um unseren idealen, entkoppelten Prozess zu beschreiben:

Pub / Sub ist ein asynchroner Messaging-Dienst, der Dienste, die Ereignisse erzeugen, von Diensten entkoppelt, die Ereignisse verarbeiten.

In Pub / Sub veröffentlichen Sie Nachrichten zu Themen . Jedes Thema kann viele Abonnements haben, von denen Verbraucher Nachrichten abrufen können . In den einfachsten Worten würde die Migration:

  1. Protokolle aus dem Ursprungscluster in ein (pro Index) Pub / Sub-Thema exportieren
  2. Die Pub / Sub-Abonnements konfigurieren Informationen zum Beibehalten von Ereignissen (retain\_acked\_messages festlegen, siehe: Nachrichten wiedergeben und löschen ), damit wir sie wiedergeben können, falls unsere Import geht schief
  3. Importieren von Protokollen durch Abrufen von Nachrichten aus den Themenabonnements

Was hat das mit Komprimierung zu tun? Wie bei den meisten Cloud-Diensten fallen für die Nutzung von Pub / Sub Gebühren an. Dies bedeutet, dass Gebühren anfallen, die proportional zu den Daten sind, die wir durch den Dienst übertragen.

Diese Gebühren sind:

  • 40 USD pro geliefertem TiB, angewendet zum Veröffentlichen und Abonnieren von
  • Netzwerkraten der Google Compute Engine (diese werden ignoriert, da sie kompliziert werden)
  • Speichern von Nachrichten im Zusammenhang mit der Suche nach Bewahren Sie unsere Nachrichten bei 0,27 USD pro GiB-Monat auf.

Im besten Fall, wenn wir beim ersten Versuch erfolgreich importieren / exportieren (dies wird und ist nicht geschehen), werden wir dies tun 2 x 40 x 60 TB = 4.800 USD für die Nachrichtenübermittlung , da dies sowohl für Veröffentlichungen als auch für Abonnements gilt. Wenn wir unsere Nachrichten während der laufenden Migration 2 Wochen lang aufbewahren, werden uns 0,5 x 0,27 x 60.000 GB = 8.100 USD für die Nachrichtenspeicherung .

Damit bleibt eine Untergrenze von 12.900 USD, um die Migration durchzuführen

Jetzt ist GoCardless nicht schlecht. Als Faustregel gilt, dass Sie normalerweise die Engineering-Stunden über die Infrastrukturkosten optimieren möchten.

Wenn Sie jedoch die Kosten mit minimalem Aufwand senken können, sollten Sie dies tun.

Veröffentlichen komprimierte Nachrichten

Zu diesem Zweck haben wir eine kleine Änderung an unserem Migrationstool (elastic-toolbox) vorgenommen, um die Komprimierung der Nachrichten zu unterstützen, die wir in Pub / Sub veröffentlicht haben.

Wenn die Fehlerbehandlung entfernt wurde, ist dies die Veröffentlichungsmethode, bei der die Komprimierung nach der Serialisierung angewendet wird:

Bedingte Komprimierung auf eine Nachrichtennutzlast

Die Komprimierung selbst ist kinderleicht und fast vollständig beobachtbar:

Implementierung der gzip-Komprimierung mit Beobachtbarkeit

Da unsere Einsparungen proportional zu unserem Komprimierungsverhältnis (komprimierte / ursprüngliche Bytes) sind, ist uns sehr wichtig, wie komprimierbar sind unsere Daten.

JSON-Protokolle sind wahrscheinlich sehr komprimierbar, da:

  • Protokolle viele der JSON-Schlüssel gemeinsam nutzen, die de-dupliziert werden können (kubernetes.pod\_name)
  • Werte allgemeiner Protokollfelder können sehr häufig auftreten (kubernetes.labels.namespace)

Verwenden des geänderten elastic-toolbox Um einen gleichzeitigen Export von drei verschiedenen Indizes auszuführen, können wir die Prometheus-Metrik elastic\_toolbox\_export\_pubsub\_write\_compression\_ratio verwenden (siehe compress Methode oben), um eine Heatmap mit Komprimierungsverhältnissen zu erstellen:

Compressed Bytes / Originalbytes, immer 0\%

Diese Heatmap zeigt, dass alle Nachrichten auf höchstens 30\% der Originalgröße . Gemessen über unser gesamtes Korpus von Protokollen liegt der Durchschnitt bei einem ~ 12\% -Komprimierungsverhältnis, was bedeutet, dass 1 GB Protokoll nur 120 MB beträgt.

Unsere ursprüngliche Rechnung von 12.900 USD ist zu 12\% x 12.900 USD = 1.548 USD geworden.

Dies bedeutet, dass wir etwa 11.500 USD gespart haben.

Erkunden Sie die Daten unter Raintank-Snapshot: Komprimierung der elastischen Toolbox .

Nächster Schritt? Vollzeit anwenden.

Der naheliegendste nächste Schritt bestand darin, dies ständig auf unsere Protokollierungspipeline anzuwenden. Da wir Containerprotokolle direkt in Pub / Sub versenden und sie aus einem Abonnement in Elasticsearch ziehen, können wir problemlos einen fluentd -Filter schreiben, der dieselbe Komprimierungsstrategie anwendet.

Mein Kollege Ben hat ein fantastisches Dashboard zusammengestellt, um zu verfolgen, wie viel wir sparen. Dies entspricht mehreren tausend pro Monat :

Einsparungen beim Komprimieren von Protokollen beim Eintritt in die Protokollierungspipeline

Wo sonst kann die Komprimierung helfen?

Wenn Sie in einer Cloud-Umgebung arbeiten, gibt es so viele Möglichkeiten Sparen Sie Geld, indem Sie Ihre Daten komprimieren.

Neben den Protokollen ist ein weiteres GoCardless-Beispiel das Tool draupnir . Dieser Service hostet Kopien unserer Produktionsdatenbanken für Lasttests und forensische Analysen (Vorhersage von Abfrageplänen usw.). Der Google SSD-Speicher kostet 187 US-Dollar pro TiB / Monat. Dies bedeutet, dass jede Kopie unseres 5 TB Postgres 1.000 US-Dollar pro Monat kostet. . P. >

Draupnir kann je nach Anwendungsfall mehrere Kopien gleichzeitig hosten. Wir können eine Menge Geld sparen, indem wir die btrfs-Komprimierung aktivieren, um die Dateisystemblöcke transparent zu komprimieren und zu verwenden ~ 70\% weniger SSD-Kapazität als sonst.

Und wenn Sie der Meinung wären, dass die Komprimierung auf Kosteneinsparungen beschränkt ist, liegen Sie falsch! Nachdem wir gelegentlich unter Mikroausfällen gelitten hatten, als große Backfills ausgeführt oder neue Datenbankindizes erstellt wurden, haben wir das Problem durch Aktivieren der Postgres-WAL-Komprimierung gelöst (siehe Nicht verwendete Postgres-Funktionen: WAL-Komprimierung oder die Postgres Write Ahead Log-Dokumente ).

Die Ausfälle wurden durch Datenbankoperationen verursacht, die eine große Menge an WAL-Abwanderung verursachten, wobei Das Replikat würde beim Schreiben der WAL auf die Festplatte blockieren. Durch Komprimieren des WAL-Streams haben wir die E / A-Spitzen erheblich reduziert, sodass das Replikat den Stream ohne Probleme verarbeiten kann . P. >

Es gibt weitere Beispiele, aber ich denke, dies ergibt ein gutes Bild.

Wie hilft Ihnen das?

Komprimierung ist ein Kompromiss, eine Entscheidung, die wir treffen Tauschen Sie die CPU gegen eine andere Ressource, die möglicherweise teurer oder weniger verfügbar ist. Der der CPU-, Speicher- oder Netzwerkbandbreite zugewiesene Wert ändert sich ständig, und Sie müssen diese Berechnung von Fall zu Fall durchführen.

Dieser Beitrag sollte ein Szenario abdecken, in dem die Kosten für Die Komprimierung sowohl der Rechenressourcen als auch der Erstellungszeit wurde durch die damit verbundenen Einsparungen erheblich aufgewogen. Nicht alle Situationen haben die gleiche Wirtschaftlichkeit, aber es dauert ein paar Minuten Serviettenmathematik, um sich für einen der beiden Wege zu entscheiden.

Ich hoffe, diese Fallstudie veranlasst die Berücksichtigung der Komprimierung außerhalb der üblichen, langweiligen Anwendungsfälle und hilft Hier finden Sie Möglichkeiten, wie Sie es auf Ihre eigenen Systeme anwenden können.

Besprechen Sie diesen Beitrag unter Hackernews .

Ursprünglich veröffentlicht unter https: // blog .lawrencejones.dev am 29. Dezember 2020.