Frage

Für Spaß, ich habe mit dem Schreiben einen Load Balancer in Python Herumspiele und habe versucht, den besten (richtig?) Weg, um zu testen, ob ein Port zur Verfügung steht und der Remote-Host ist immer noch da.

Ich finde, dass, sobald verbunden ist, wird es schwierig, zu sagen, wenn die Remote-Host ausfällt. Ich habe auf lebendig gedreht halten, aber kann es nicht schwer verletzte Verbindung früher als eine Minute zu erkennen (ich Polling realisieren öfter als eine Minute zu viel des Guten könnte, aber sagen wir mal ich wollte), auch nach den verschiedenen TCP_KEEPALIVE Einstellung Optionen auf den niedrigsten.

Wenn ich nicht blockierenden Sockets verwenden, ich habe bemerkt, dass ein recv () einen Fehler zurück ( „Ressource vorübergehend nicht verfügbar“), wenn er von einer Live-Buchse liest, kehrt aber „“, wenn sie von einem Toten zu lesen (Senden und recv von 0 Bytes, die die Ursache sein könnte?). Das scheint wie eine seltsame Art und Weise zu testen, für sie verbunden ist, aber, und macht es unmöglich zu sagen, ob die angeschlossene starb aber nach ein paar Daten zu senden.

Neben dem Anschließen / für jeden Scheck trennen, gibt es etwas, was ich tun kann? Kann ich eine TCP Keep-Alive schicken, oder kann ich eine niedrigere Level-Verbindung aufbauen, die ich die Konnektivität testen lassen, ohne reale Daten den Remote-Server senden würde möglicherweise verarbeiten?

War es hilfreich?

Lösung

würde ich empfehlen, Ihre (single) Prüfdose angeschlossen nicht verlassen - eine neue Verbindung jedes Mal, wenn Sie abfragen müssen machen. Jeder Load-Balancer / Serververfügbarkeit System, das ich je gesehen habe verwendet diese Methode anstelle einer ständigen Verbindung.

Wenn der Remote-Server nicht innerhalb einer angemessenen Zeit reagiert (beispielsweise 10 s) markieren Sie ihn als „down“. Verwenden Sie Timer und Signale anstatt Funktion Antwortcodes, um diesen Timeout zu behandeln.

Andere Tipps

„wird es schwierig, zu sagen, wenn der Remote-Host untergeht“

Richtig. Dies ist ein Merkmal von TCP. Der ganze Sinn der TCP ist eine dauerhafte Verbindung zwischen den Anschlüssen zu haben. Theoretisch kann eine Anwendung auf den Port, über TCP (die Socket-Bibliotheken bieten nicht viel Unterstützung für diese, aber es ist Teil des TCP-Protokolls) fällt und wieder an.

ping wurde zu diesem Zweck erfunden

Auch könnten Sie zu Ihrem Ziel fehlerhafte TCP-Pakete senden können. Zum Beispiel in den TCP-Header gibt es ein Flag für das Ende der Übertragung acknowleging, sein die FIN-Nachricht. Wenn Sie der Remote-Host eine Nachricht mit ACK und FIN senden soll mit einer Rückkehr Paket beschweren und Sie werden in der Lage Umlaufzeit zu bewerten.

Es ist theoretisch möglich, ein Keep-Alive-Paket an Spam. Aber setzen Sie sich auf sehr niedrige Abstände, können Sie in Raw Sockets graben müssen. Auch Ihr Host kann es ignorieren, wenn sein in zu schnell kommen.

Der beste Weg, um zu überprüfen, ob ein Host in einer TCP-Verbindung aktiv ist, Daten zu senden und zu einem ACK-Paket warten. Wenn das ACK-Paket eintrifft, wird die SEND-Funktion nicht Null zurück.

Sie können mit Bash pseudo-Gerätedateien für TCP / UDP Verbindung mit einem bestimmten I / O-Port, zum Beispiel:

printf "" > /dev/tcp/example.com/80 && echo Works

Dies würde die Verbindung öffnen, wird aber nichts senden. Sie können es testen, indem Sie:

nc -vl 1234 &
printf "" > /dev/tcp/localhost/1234

Für die einfache Überwachung Verwendung cron mit obigem Befehl oder mit watch:

watch bash -c 'echo > /dev/tcp/localhost/1234 && echo Works || echo FAIL'

Allerdings ist es empfehlenswert, spezifische Werkzeuge zu verwenden, die dafür ausgelegt ist, wie Monit, Nagios, etc.

Monit

Hier ist Beispielregel mit Monit (monit):

# Verify host.
check host example with address example.com
  if failed
    port 80
    protocol http
  then alert
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top