Erfahren Sie, wie Sie Jaeger-Komponenten in der Produktion verwenden und bereitstellen

Letzte Woche wurde ich erneut zu Jaeger befragt – einer durchgängigen verteilten Verfolgung. Diese Frage kommt von meinen Arbeitskollegen, dass sie Zweifel haben, ob der Jaeger ein einziger Fehlerpunkt sein kann. Dieser Beitrag wird diesen Fall zwar nicht explizit beantworten, aber eine neue Perspektive darüber geben, wie Jaeger ordnungsgemäß in der Produktion eingesetzt werden sollte (sowohl für mich als auch für Sie – die Leser).

Wenn ich zum ersten Mal meine Hand mit den sogenannten Dingen wie “Distributed Tracing” schmutzig mache, verwende ich immer das Jaeger All-in-One-Docker-Image, das einfach funktioniert. Derzeit glaube ich nicht, dass es für DevOps oder SRE schwierig sein würde, dem Entwickler die ausfallsichere Umgebung von Jaeger zur Verfügung zu stellen, damit sich der Entwickler auf seinen Code konzentrieren und ihm helfen kann, den Ablauf der Anforderung zu verfolgen.

Zum Ende dieser Präambel möchte ich nur klarstellen, dass ich diesen Beitrag schreibe, um zu dokumentieren, was ich lerne, anstatt Ratschläge zu Dos und Don zu geben.

Entwicklungs- und Spielplatzmodus

Im Entwicklungs-, Localhost- oder sogar Playground-Modus ist die All-in-One-Jaeger-Installation die richtige Wahl für den Entwickler, um mit Jaeger zu spielen. Mit der unten stehenden Docker-YAML-Datei können Sie problemlos alle Jaeger-Komponenten ausführen und damit spielen. Das habe ich getan, als ich im letzten Jahr 2018 von Jaeger erfahren habe.

Zunächst stelle ich mir vor, dass die Installation von Jaeger auch im Produktionsmodus so aussehen könnte.

Dies liegt daran, dass ich die Dokumentation nicht gründlich gelesen habe, nicht bevor die Frage zum Einsatz von Jaeger in der Produktion gestellt wurde. Danach besuche ich die Jaeger-Website erneut und lerne die Architektur- und Bereitstellungsstrategie kennen.

Jaeger-Architektur

Obwohl dies wie ein nutzloser Punkt aussieht und die gesamte Dokumentation dazu bereits auf der offiziellen Website geschrieben ist, denke ich, dass es nicht so wertlos ist, es noch einmal zu erwähnen.

Wie oben erwähnt, können wir Jaeger mithilfe einer All-in-One-Strategie bereitstellen. Dies bedeutet, dass alle Jaeger-Komponenten in einer High-Spec-Maschine installiert werden können. Dies ist jedoch ein Problem, wenn wir von „Single Point of Failure“ sprechen. Ist es nicht seltsam, wenn wir den großen verteilten Dienst verfolgen, aber die Metriken nur an einen „Monolith“ -Dienst senden möchten?

Ist es nicht seltsam, wenn wir den großen verteilten Dienst verfolgen möchten, aber die Metriken nur an einen “Monolith” -Dienst senden?

Ich schaue mir also die offizielle Dokumentation an. Jaeger bietet zwei Möglichkeiten für die Bereitstellung als skalierbares verteiltes System:

Schreiben Sie Metriken direkt in den persistenten Speicher

Bei dieser Bereitstellungsstrategie schreibt der Jaeger-Kollektor die Ablaufverfolgungsmetriken direkt in die Datenbank. Dann greift Jaeger UI auf DB zu, um das Systemverhalten zu visualisieren.

Dieses Szenario eignet sich gut für kleinen bis mittleren Datenverkehr, da Jaeger zwei Arten von persistenten Speichern unterstützt, die unter hohen Arbeitslasten gut funktionieren. Außerdem können beide Speichertypen im Cluster-Modus bereitgestellt werden, sodass unsere Bedenken hinsichtlich eines einzelnen Fehlerpunkts im Speicher beseitigt werden. Weitere Informationen finden Sie in der offiziellen Dokumentation: „Für die Bereitstellung in großem Maßstab empfiehlt das Jaeger-Team das Elasticsearch-Backend gegenüber Cassandra.“

Puffern Sie die Trace-Metriken in Kafka, bevor Sie in den persistenten Speicher schreiben

Dies ist das Bereitstellungsszenario, das ich aus mehreren Gründen für die Produktion auswählen kann.

Ok, dieser dritte Grund kann zu der neuen Frage führen: Wie können wir den Jaeger-Kollektor und den Ingester vertikal skalieren? Würde dies bedeuten, dass Metrikdaten verteilt an mehrere Kollektoren gesendet werden?

Um diese Frage zu beantworten, müssen wir uns erneut auf die offizielle Jaeger-Dokumentation beziehen. Dank der ausreichenden Klarheit. Und ja, Metrikdaten können an mehrere Kollektoren gesendet werden. Unten finden Sie den Lebenslauf, wie jede Komponente installiert werden soll:

Jaeger Agent

Jaeger-Client-Bibliotheken erwarten, dass der Jaeger-Agent -Prozess lokal auf jedem Host ausgeführt wird.

Dies ist eine klare Aussage, dass der Agent auf dem Hostcomputer installiert werden sollte. Wenn Sie dies bevorzugen, können Sie Ihre Trace-Metriken direkt direkt an Jaeger Collector senden. Dies schlug auch der Schöpfer von Jaeger, Yuri Shkuro, in diesen Antworten vor:

Jaeger-Agent sollte immer auf demselben Host wie die Anwendung ausgeführt werden, als Sidecar oder Host-Agent. Alternativ können Jaeger-Clients so konfiguriert werden, dass sie Spans direkt an den Collector senden, der dann überall ausgeführt werden kann.
Yuri Shkuro

Wenn Sie Kubernetes zum Bereitstellen Ihrer Dienste verwenden, können Sie auch auf diesen großartigen Artikel verweisen:

Der Jaeger-Agent fungiert als Zwischenpuffer zwischen Ihrer Anwendung und dem Jaeger-Kollektor. Wenn Sie dies in der Nähe Ihrer Anwendung haben, wirkt sich dies positiv auf Ihre Leistung aus, da Ihre Anwendung Daten mithilfe des UDP-Protokolls (normalerweise Port 6831) sendet und diese dann mithilfe von gRPC (normalerweise Port 14250 in Jaeger Collector) an den Jaeger-Kollektor puffert. Da es sich bei UDP um ein zustandsloses Protokoll handelt, ist es sinnvoll, dass durch die Installation auf demselben Host das Risiko eines Datenverlusts beim Senden von Metriken verringert wird.

Jaeger Collector

Die Kollektoren sind zustandslos und daher können viele Instanzen von Jaeger-Kollektor parallel ausgeführt werden.

Eigentlich können wir Collector für viele Agenten nur einmal ausführen, aber aus Gründen der Skalierbarkeit können wir ihn auch so oft bereitstellen, wie wir möchten

Jaeger Ingester

Jaeger-Ingester ist ein Dienst, der Span-Daten aus dem Kafka-Thema liest und in ein anderes Speicher-Backend (Elasticsearch oder Cassandra) schreibt.

Ingester arbeitet als Mitarbeiter, um die Kafka-Nachricht zu verarbeiten. Wir können auch viele Jaeger-Ingester bereitstellen, um das Schreiben von Ablaufverfolgungsdaten in unseren Datenspeicher (Elasticsearch) so schnell wie möglich zu gestalten, wenn in Kafka veröffentlichte Ablaufverfolgungsnachrichten angezeigt werden.

Die einzige Einschränkung hinsichtlich der Anzahl der Bereitstellungen von Jaeger Ingester besteht darin, wie viele Sie Ihre Kafka-Themenpartition einrichten. Dies liegt daran, dass ein Teil des Ingesters inaktiv ist, wenn mehr Consumer (Ingester) als die Themenpartition vorhanden ist, da er die Nachricht nicht empfängt. Um dies zu erfahren, sollten Sie sich über die Kafka-Verbrauchergruppen-ID informieren, die ich im Kafka-Tutorial-Beitrag erläutert habe.

Jaeger Query UI

Jaeger-Abfrage dient den API-Endpunkten und einer React / Javascript-Benutzeroberfläche. Der Dienst ist zustandslos und wird normalerweise hinter einem Load Balancer ausgeführt, z. B. NGINX .

Jaeger Query UI ist ein Dashboard zur Visualisierung der Ablaufverfolgung. Es stellt eine direkte Verbindung zu Elasticsearch (oder Cassandra) her, um unsere Ablaufverfolgungsdaten abzufragen. In einem All-in-One-Docker-Image wird möglicherweise kein dauerhafter Speicher angezeigt, und das stimmt! In All-in-One-Binärdateien können wir In Memory- oder Badger-Speicher verwenden, der für umfangreiche Tracing-Metriken nicht empfohlen wird.

Beispiel für die Verwendung von Docker Compose

Am Ende des Lernens habe ich wie üblich immer das Arbeitsbeispiel aufgenommen, da gewöhnliche Softwareentwickler dazu neigen, den Code zu versuchen, anstatt nur zu lesen, und dem Leser die Möglichkeit zu geben, sich auch die Hand schmutzig zu machen. 🙂

Dieses Beispiel gibt Ihnen nur die Idee und den Beweis, dass Jaeger Agent, Collector und Ingester mit Mehrfachinstallation einwandfrei funktionieren, und beantwortet die erste Frage, dass die Jaeger-Komponenten skaliert werden können.

In diesem Beispiel möchte ich zwei Dienste erstellen, die ein solches Architekturdesign haben (einschließlich Jaeger-Komponenten):

Wir werden zwei Dienste erstellen, einen mit dem Namen Dora The Explorer (den Sie vielleicht aus meinem vorherigen Blog kennen) und einen anderen, den Umbrella-Dienst.

Für Service Dora senden wir Ablaufverfolgungsdaten an Jaeger Agent-Port 1111 und für Umbrella an 1112. Tatsächlich müssen Sie Jaeger Agent auf demselben Host installieren, sodass die Verwendung von localhost: 6831 für jede Anwendung niemals in Konflikt gerät.

Da wir in diesem Beispiel Docker Compose verwenden, ahmen wir nach, dass die Anwendung in Host 1 den Jaeger Agent-Port 1111 und die Anwendung in Host 2 den Port 1112 verwendet.

Jede Anwendung sendet Daten über UDP an ihren jeweiligen Jaeger-Agenten auf demselben Host. Jeder Jaeger-Agent sendet dann (sowohl in Port 1111 als auch in Port 1112) mit statischem Lastausgleich an 2 Jaeger Collector unter Verwendung des gRPC-Protokolls in Port 14250. Der Collector veröffentlicht dann eine Nachricht in demselben Kafka-Thema.

Dies ist der Teil, auf den Sie achten müssen: Sie müssen mehr als eine Partition erstellen, um festzustellen, wie viele Sie Jaeger Ingester bereitstellen würden. Wenn Sie beispielsweise 4 Jaeger Ingester bereitstellen möchten, benötigen Sie mindestens 4 Partitionen des Kafka-Themas, damit es mit maximalem Aufwand funktioniert.

Probieren wir es aus!

Lassen Sie uns zunächst die folgende Docker-Erstellungsdatei mit diesem Befehl ausführen:

Klonen Sie dieses Repo und checken Sie in den Zweig with-external-service :

Führen Sie main.go und external_service / main.go in einem separaten Terminal aus. Dann CURL hinein:

Sie erhalten ungefähr Folgendes:

Öffnen Sie den Browser und gehen Sie zu http: // localhost: 16686 / search. Suchen Sie nach einer neuen Ablaufverfolgung. Sie erhalten Folgendes:


Versuchen Sie nun, einen Lasttest mit k6 durchzuführen, um zu beweisen, dass der Jaeger auch unter Lasttest die Ablaufverfolgungsdaten fehlerfrei empfangen kann:

Danach können Sie zur Jaeger-Benutzeroberfläche (http: // localhost: 16686 /) zurückkehren und dann überprüfen, ob in der Jaeger-Benutzeroberfläche viele Ablaufverfolgungsspannen angezeigt werden. Bitte beachten Sie, dass es eine Weile dauern kann, bis die Jaeger-Benutzeroberfläche die Liste der Ablaufverfolgungen anzeigt. Nach meiner Erfahrung zeigt der Jaeger jedoch mit dieser Bereitstellungsstrategie (Bereitstellung jeder Jaeger-Komponente mit einem anderen Docker-Image) konsistent alle Bereiche an. Wenn ich damals ein All-in-One-Docker-Image verwende, stelle ich manchmal fest, dass einige Bereiche fehlen, und ich finde es mit diesem neuen Bereitstellungsszenario, soweit ich das beobachte, nicht wieder.

Wie geht es weiter?

Wie ich bereits in der Präambel festgestellt habe, hat dieser Beitrag nur meine Erfahrungen beim Erlernen der Bereitstellung von Jaeger-Komponenten als Einzeldienst dokumentiert. Wir können dann den Schluss ziehen, dass Jaeger unter hoher Arbeitslast arbeiten kann und in vertikalem Maßstab eingesetzt werden kann.

Einige von uns verwenden möglicherweise bereits Kubernetes in Ihrer Architektur. In diesem Fall können Sie aus den Blog-Posts von Jaeger Medium lernen:

Geschrieben von Yusuf am Mittwoch, 18. bis 19. November 2020 während der Covid-19-Pandemie.