Skip to content
Go back

PVS Failover graceful - eine Netzwerk Betrachtung

Published:  at  01:00 PM

Table of contents

Open Table of contents

Das Setup

In unserer Umgebung gibt es folgende Komponenten:

Failover Prozess

Wir möchten uns den Failover Prozess anschauen von einem Target Device von einem PVS Server auf den anderen PVS Server.
Um den Failover zu simulieren, werden wir das Service Citrix PVS Stream Service via services.msc stoppen.

Voraussetzungen

Generelle Informationen finden sich auf: PVS HA - docs.citrix.com.

Für ein erfolgreiches Failover ist das folgende notwendig:

Für die Netzwerk Konnektivität können wir uns die Port Matrix von Citrix ansehen.

Failover

In dem Test Lab ist das Target Device (ctxvda1master - 192.168.0.103) verbunden mit dem PVS Server (ctxpvs2 - 192.168.0.31). Wir stoppen das Service Citrix PVS Stream Service und wenn der Failover passieren sollte, passiert nichts. Das Target Device hängt.

Troubleshooting

PVS ist ein Produkt das am Netzwerk stattfindet, es macht also Sinn ein Netzwerk Trace zu machen. Ein Weg das zu machen ist der folgende (für Server 2019 und höher):

network tracing: 
pktmon start --capture
{reproduzieren des Problems}
pktmon stop
pktmon etl2pcap PktMon.etl --out PktMon.pcapng

Theoretisch könnte ein CDF Trace auch sinnvoll sein. Aber Citrix stellt keine Public Symbols für StreamProcess.exe (aber für SoapServer.exe!) zur Verfügung. Ein CDF Trace von SoapServer.exe ist ziemlich sicher nicht hilfreich.

Wie funktioniert es?

Um das Problem zu troubleshooten, müssen wir wissen was/wie kommuniziert. Die Port Matrix Referenz zeigt die folgende Kommunikationstabelle zwischen Target Device und Provisioning Server:

SourceDestinationTypePortDetails
Target DevicePVS ServerUDP6910-6930vDisk Streaming
Target DevicePVS ServerUDP6901,6902,6905??

In der Standard Konfiguration (die geändert werden kann), werden die UDP Ports 6910-6930 verwenden für den “content streaming” (also der Inhalt einer vDisk auf das Target Device). Aber es gibt noch die Ports 6901, 6902 und 6905. Ich weiß von keiner öffentlich verfügbaren Dokumentation die beschreibt wofür die Ports genau sind.

Analyse

Die normale Streaming Aktivität von der vDisk auf das Target Device sieht im Netzwerktrace wie folgt aus: PVS streaming activity

ctxpvs2 sendet Daten über den Port 6930 auf das Target Device mit dem Port 6905. Der Port 6905 am Target Device ist das Service das die vDisk Daten verarbeitet.

Was eigentlich passiert am ctxpvs1 (der PVS Server worauf das Target Device “failovern” sollte): PVS failover server ctxpvs1

Die Ports 6903 und 6895 werden verwendet, der Port 6895 ist in der Port Matrix angegeben unter “Inter-server communication”. Das war also die Kommunikation zwischen den beiden PVS Server.

Wenn wir uns den Netzwerkverkehr vom ctxpvs2 ansehen, sehen wir folgenden bezüglich dem Failover: PVS failover server ctxpvs2

Das Paket 9013 ist das letzte Paket was als “normales” Streaming Paket gesendet wird. Nach diesem Paket, sehen wir einen neuen UDP Stream wo der PVS Server das Target Device auf den Port 6902 kontaktieren möchte. Dieser Port ist geblockt am Target Device, da es nicht in der Port Matrix spezifiziert ist.

Wir sehen auch Pakete auf dem Target Device:

PVS failover target device

Es gibt keine Antwort auf das Request vom Target Device.
Es sieht so aus, als würde ctxpvs2 zum Target Device ctxvda1master sagen möchte: “Mein Citrix PVS Stream Service ist gestopped, bitte failover zu einem anderen PVS Server”.

Wenn der Port 6902 erlaubt ist auf der Target Device Firewall, sieht der Netzwerk Trace wie folgt aus: PVS failover working

Und wieder sehen wir ein UDP Paket von ctxpvs2 zu ctxvda1master auf den Port 6902 - aber dieses mal mit einem wichtigen Unterschied. Das Target Device verbindet sich nun auf den anderen PVS Server (ctxpvs1) auf den Port 6910. Anschließend sehen wir mehr Kommunikation zwischen ctxvda1master (Port 6901) und ctxpvs1 (Port 6930). Und zum Schluss sehen wir im Netzwerk Trace noch das bekannte Pattern zwischen den Ports 6905 und 6930.

Warte mal, der Failover funktioniert für mich …

Offensichtlich fehlt in der Port Matrix die korrekte Spezifikation was notwendig ist für einen “graceful failover”. Aber die meisten, die die Target Device Software installieren werden keine Probleme haben. Warum? Weil das Setup erzeugt Firewall Regeln automatisch mit:

firewall rule added by target device setup

Zusammenfassung

Zusammenfassend, basieren auf der oben angeführte Analyse, lässt sich sagen dass die Firewall am Target Device den Port 6902 unbedingt benötigt für einen “graceful failover”.
Das Target Device Setup erzeugt die Firewall Regeln.
Aber leider fehlt diese Information in der Citrix Dokumentation.
Zusätzlich gibt es die Informationen in den System Requirements, dass der Port 6901 erlaubt sein muss. Diese Voraussetzung wird weder durch das Setup automatisiert gesetzt (via Firewall Regeln) noch ist es in der Port Matrix spezifiziert.

Vermutlich ist es ein guter Weg alle beschriebenen Ports (6901, 6902, 6905) zwischen PVS Server und Target Device zu öffnen.

Ich habe vor über einem Jahr darüber getwittered - aber seit dem wurde die Port Matrix noch immer nicht adaptiert. Ich habe nun das Szenario nachgebaut mit der letzten Version um zu prüfen ob das Verhalten noch immer so ist.

Abschließend möchte ich noch ergänzen, dass das nicht der einzige Failover Mechanismus sein kann. Wir haben uns den “graceful failover” angesehen, aber wenn der PVS Server von einem Moment auf den anderen stirbt, kann die oben angeführte Kommunikation gar nicht mehr stattfinden. Es gibt also offensichtlich einen “Plan B”. Das wäre ein Thema für einen anderen Blogbeitrag.

Happy troubleshooting.



Previous Post
Einführung in Citrix Natural Reboots
Next Post
PVS target device reagiert nicht mehr (full cache)