Wie spiele ich Traffic gegen ein Schatten-Netzwerk?


12

Entschuldigung, wenn dies eine neue Frage ist ...

Ich habe gehört, dass Netflix und Twitter den Webdatenverkehr in zwei verschiedenen Infrastrukturen duplizieren können: Die eine ist die maßgebliche / vertrauenswürdige Infrastruktur, die auf den Benutzer zurückgeht. und die andere ist eine "Schatten" - oder Testinfrastruktur, die denkt, dass sie zum Benutzer zurückkehrt, dies aber nicht tut. Es geht darum, die sekundäre Infrastruktur unter realer Last und zum richtigen Zeitpunkt zu testen.

Ich bin mir ziemlich sicher, dass es ein Wort gibt, um dies zu beschreiben, aber "Brücke" scheint nicht die richtige zu sein, und "Wiederholung" auch nicht.

Kann mir jemand helfen, wie diese Technik heißt und / oder welche Tools verwendet werden können, um dies zu erreichen?

Ich denke, dass ich hinzufügen sollte, dass ich von Techniken gehört habe, die Protokolle effektiv "wiedergeben", aber das ist wirklich schwierig, mit wirklichen Geschwindigkeiten / Verteilungen zu kommen.

Wir versuchen nicht, die Richtigkeit der Ausgabe zu überprüfen, sondern stellen lediglich sicher, dass in der neuen Infrastruktur keine Fehler / Stacktraces / etc angezeigt werden.


Die naheliegende Vorgehensweise (die Verwendung eines Switches mit einem Spiegelport zum Duplizieren des eingehenden Datenverkehrs) scheint Probleme zu verursachen, wenn diese "Schatten" -Server versuchen, zu antworten. Jetzt haben Sie mich auf die nicht offensichtliche Weise interessiert.
DerfK

@DerfK: Die Wiedergabe einfacher Layer 2- oder 3-Captures ist problematisch, wenn Sie keinen Code zur Simulation des TCP / IP-Stacks des Remoteclients schreiben. Das Aufzeichnen auf Ebene 7 ist der beste Weg, es sei denn, Sie möchten viel Code schreiben.
Evan Anderson

Ich denke nicht, dass es schwierig ist, es auf Paketebene zu implementieren. Weitere Informationen finden Sie unter tcpcopy ( github.com/wangbin579/tcpcopy )

Antworten:


7

Ich würde es persönlich als "Belastungstest über Sitzungswiedergabe" bezeichnen. Ich kenne keinen einfachen Sammelbegriff für diese Art von Prüftechnik.

Die grundlegende Strategie, die ich für diese Art des Auslastungstests gesehen habe, besteht darin, Protokolldateien aus dem Produktionssystem aufzunehmen und sie auf einem Testsystem wiederzugeben.

Sie können Tools wie JMeter oder Apache Bench verwenden, um Anforderungen aus Protokolldateien abzuspielen. Wenn Sie sehr komplexe Client / Server-Interaktionen (mit spezifischen Timing-Details basierend auf dem ursprünglichen Protokolldatenstrom) wiedergeben möchten, um die Innereien Ihrer Anwendung wirklich zu trainieren (auf der Suche nach Race-Bedingungen, Timing-bezogenen Fehlern usw.), könnten Sie dies tun Schauen Sie sich an, wie Sie anwendungsspezifische Testtools schreiben, mit denen Sie Clients maßstabsgetreu simulieren.

Sie werden nicht in der Lage sein, einfach Schiffsladungen unformatierten Netzwerkverkehrs zu erfassen und mit jedem TCP- oder IP-basierten Protokoll abzuspielen. TCP-Sequenznummern stimmen nicht mit dem ursprünglich erfassten Datenverkehr überein und funktionieren nicht. IP-Layer-Erfassungen sind problematisch, da Ihre simulierten Clients nach der IP-Adresse des erfassten Absenders fragen müssen. Es ist besser, den Datenverkehr näher an Schicht 7 zu erfassen und diese für die Wiedergabe von Sitzungen zu verwenden, da Sie andernfalls auch einen TCP-Simulator schreiben möchten. (Ich könnte mir vorstellen tshark, die Layer-7-Daten und das Timing aus einem TCP-Stream auszublenden und dies beispielsweise erneut abzuspielen.)

Die einfache Wiedergabe des Netzwerkverkehrs simuliert die Auslastung, erfasst jedoch nicht unbedingt Fehler. Ihr simuliertes Client müßte Antworten von dem Testserver empfangen und sie auf ihrer Richtigkeit analysieren , wenn Sie Last-Test wollten jeden Test , dass die Anwendung richtig reagiert. Da Ihre Anwendung dynamische Antwortdaten generiert, ist es unwahrscheinlich, dass Ihr simulierter Client die Antwort des Testservers einfach mit der protokollierten Antwort des Produktionsservers vergleichen kann. Hier schreiben Sie ein Test-Gurtzeug, das für Ihre Anwendung und deren Ausgabe spezifisch ist.


1

Sie verwenden einen Dienst wie BrowserMob, der simuliert, dass viele Personen gleichzeitig auf Ihre Website zugreifen. Diese Dienste geben den protokollierten Datenverkehr nicht wieder, da Ihnen dann die Clientseite der Konversation fehlt. Zum Beispiel versuchen Ihre Server, Pakete an Computer im Internet zu senden, die keinen Empfang erwarten. Diese Unternehmen untersuchen jedoch die Protokolle (in der Regel auf Anwendungsebene und nicht auf Paketebene) und ermitteln anhand dieser Informationen, auf welche Seiten, wie oft und in welcher Reihenfolge Personen klicken. Diese Daten werden zum Schreiben von Skripten / Makros verwendet, die BrowserMob dann wiederholt.

ApacheBench wird, wie bereits von einem anderen Benutzer erwähnt, heutzutage kaum noch verwendet. Es war vor 10 Jahren hilfreicher, als Sie nur herausfinden mussten, wie schnell ein statisches HTML-Dokument oder JPEG unter hoher Last bereitgestellt werden kann. Es ist nicht viel anders als ein Haufen Leute, die in ihrem Webbrowser immer wieder auf "Neu laden", "Neu laden" oder "Neu laden" klicken. Wenn Sie eine Web-App mit einem komplexeren Workflow testen, benötigen Sie etwas Klügeres.


1

Ich glaube nicht, dass Sie dies auf Netzwerkebene tun könnten, obwohl Sie möglicherweise einen spezialisierten Kernel für einen Hardware-Load-Balancer erhalten könnten, der den zweiten Server handhabt. Grundsätzlich erfordert der Web-Verkehr (TCP) eine Bestätigung jedes gesendeten / empfangenen Pakets. Wenn also ein Benutzer ein Paket an Ihr Netzwerk sendet, wird es sowohl auf Ihr Prod-Netzwerk als auch auf Ihr Shadow-Netzwerk dupliziert. Die Server in jedem Netzwerk antworten, und das Paket des Prod-Servers wird an Ihren Computer zurückgeleitet, der eine Bestätigung zurückschießt, und sie setzen ihre Unterhaltung fröhlich fort. Wenn Sie jedoch das Paket Ihres Schattenservers ablegen, wird keine Bestätigung angezeigt. Es wird also versucht, es erneut zu senden und gleichzeitig die Übertragungsgeschwindigkeit für alle Netzwerkaktivitäten herabzusetzen (dies wird als Fensterung bezeichnet). Es wird wiederholt versucht, es zu senden, bis das Zeitlimit abgelaufen ist. und die Sitzung wird abgerissen. Um ehrlich zu sein, würden Sie nicht einmal einen Handschlag ausführen können, um überhaupt eine Verbindung herzustellen.

Etwa am ehesten könnten Sie dazu kommen, das ursprüngliche Synchronisationspaket an Ihren Shadow-Server weiterzuleiten und dann das Standard-Gateway für diese Boxen als einen nicht vorhandenen Speicherort festzulegen. Jedes Mal, wenn ein Benutzer versucht, eine Verbindung herzustellen, erhält er einen echten Server in Ihrem Prod-Netzwerk, und Sie senden mindestens ein Syn-Paket an das Shadow-Netzwerk. Verdammt, jetzt habe ich mich gefragt, wie du das auch schaffen könntest :)


1

Ich konnte @adrianco bei einem Netflix-Treffen danach fragen.

Die Antwort war, dass sie ihr eigenes Tool geschrieben haben, das im Grunde genommen ein ServletFilter (leider Java-spezifische Terminologie) ist, das die aktuelle Anforderung neu erstellt und einen asynchronen Fire-and-Forget-Aufruf auf einem Zielserver ausführt.

Die Vorteile sind:

  • Verkehrsmuster in der "realen Welt" für Ihre Testinfrastruktur ("dunkel")
  • Sie müssen nicht aufnehmen und dann wiedergeben

Der Nachteil:

  • Wir müssen die Threads / CPU-Zyklen auf Ihren Produktionsboxen haben
  • Latenzzeiten in Ihrer Testinfrastruktur können Ihre Produktionsboxen sichern und beeinträchtigen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.