Konfiguration eines externen Listeners für Verfügbarkeitsgruppen auf Azure SQL Server-VMs

Wir widmen uns in diesem Artikel mit der Konfiguration eines Listeners, der extern über eine öffentliche und virtuelle IP-Adresse (VIP) auf die Always On Verfügbarkeitsgruppe in SQL Server VMs zugreifen kann.

Wie wir eine Always On Availability Group konfigurieren und erstellen, haben wir im vorangegangenen Artikel näher beschrieben.

Wir ermöglichen mit der Konfiguration des Listeners eine automatische Verbindung von Clients zu einem Replikat. Damit können beispielsweise schreibgeschützte Workloads an sekundäre Replikate weitergeleitet werden, die die Leistung und Skalierbarkeit Ihrer Infrastruktur verbessern.

Exkurs zum Thema “Listener”:
Ein Verfügbarkeitsgruppen-Listener ist ein virtueller Netzwerkname (VNN), mit dem sich Clients verbinden können, um auf eine Datenbank in einer primären oder sekundären Replikation einer Always On-Verfügbarkeitsgruppe zuzugreifen. Ein Listener ermöglicht es einem Client, eine Verbindung zu einer Replikation herzustellen, ohne den physischen Instanznamen des SQL Servers zu kennen.

Man unterscheidet zudem zwischen einem externen und internen Listener:

externer Listener: Verwendet die öffentliche virtuelle IP-Adresse des Clouddiensts, der die virtuellen Maschinen (VMs) hostet. Es wird von außen, beispielsweise über das Internet auf den Listener zugegriffen.

interner Listener: Verwendet einen internen Load Balancer mit einer privaten Adresse für den Listener. Auf den internen Listener kann nur innerhalb eines virtuellen Netzwerks zugegriffen werden.

Bevor wir mit der Konfiguration starten, müssen einige Richtlinien beachtet werden:

  • Der externe Listener wird von Windows Server 2008 R2, Windows Server 2012 und Windows Server 2012 R2 unterstützt.
  • Die Clientanwendung muss sich in einem anderen Clouddienst befinden, als der Ihrer Verfügbarkeitsgruppen-VMs. → Azure unterstützt keine direkte Serverrückgabe zwischen Client und Server im selben Cloud-Dienst.
  • Es ist nicht möglich einen externen und internen Listener im selben Cloud-Dienst zu betreiben.
  • Wenn Sie einen Listener für eine Hybridumgebung erstellen, muss das lokale Netzwerk zusätzlich zum Site-to-Site-VPN mit dem virtuellen Azure-Netzwerk über eine Konnektivität mit dem öffentlichen Internet verfügen. Im Azure-Subnetz ist der externe Listener nur über die öffentliche IP-Adresse des jeweiligen Clouddiensts erreichbar.
  • Es ist möglich, mehrere VIP-Adressen für Ihren Cloud-Dienst zu erstellen. Folgen Sie dabei einfach den nachfolgenden Schritten in diesem Artikel.

VM Endpunkte mit Lastenausgleich und direkter Serverrückgabe konfigurieren

Als erstes im Prozess erstellen wir VM Endpunkte, die den Lastenausgleich und eine direkte Serverrückgabe durchführen. Für jede VM muss ein solcher Endpunkt erstellt werden. Besitzen Sie Azure-Replikate in mehreren Regionen, muss sich jedes Replikat im selben Clouddienst und VNET befinden. Haben Sie gleich mehrere Azure Regionen, müssen auch mehr VNETs konfiguriert werden.

1. Öffnen Sie im Azure Portal zu jeder vorhandenen VM, die ein Replikat hostet und lassen sich entsprechende Details anzeigen.

2. Klicken Sie auf die Registerkarte Endpunkte.

3. Stellen Sie sicher, dass der Name und der öffentliche Port des Listener-Endpunkts nicht bereits verwendet werden. In unserem Beispiel lautet der Name „MyEndpoint“ und der Port ist „1433“.

4. Gehen Sie sicher, dass auf Ihrem lokalen Client das neuste PowerShell Modul installiert ist.

5. Starten Sie PowerShell und öffnen eine neue Sitzung, in der die Azure-Verwaltungsmodule geladen sind.

6. Führen Sie Get-AzurePublishSettingsFile aus. Dieses Cmdlet leitet Sie weiter, um eine Datei mit Veröffentlichungseinstellungen in Ihr lokales Verzeichnis herunterzuladen. Möglicherweise werden Sie zur Eingabe Ihrer Anmeldeinformationen für Ihr Azure-Abonnement aufgefordert.

7. Führen Sie den Befehl Import-AzurePublishSettingsFile mit dem Pfad der heruntergeladenen Veröffentlichungseinstellungsdatei aus. Dies ermöglicht Ihnen im Nachgang die Verwaltung Ihres Azure Abonnements in PowerShell.

Import-AzurePublishSettingsFile -PublishSettingsFile <PublishSettingsFilePath>

8. Fügen Sie das untenstehende PowerShell-Skript in einen Texteditor und legen Sie die Variablenwerte anhand Ihrer Umgebung fest. Das Skript muss je einmal pro Rechenzentrum für den Clouddienst und die Knoten ausgeführt werden. Dies gilt nur, sollte sich Ihre Verfügbarkeitsgruppe über mehrere Azure Regionen erstrecken.

# Define variables $ServiceName = "<cloud_service_test>" # the name of the cloud service that contains the availability group nodes $AGNodes = "<vm1>","<vm2>","<vm3>" # all availability group nodes containing replicas in the same cloud service, separated by commas # Configure a load balanced endpoint for each node in $AGNodes, with direct server return enabled ForEach ($node in $AGNodes) { Get-AzureVM -ServiceName $ServiceName -Name $node | Add-AzureEndpoint -Name "ListenerEndpoint" -Protocol "TCP" -PublicPort 1433 -LocalPort 1433 -LBSetName "ListenerEndpointLB" -ProbePort 59999 -ProbeProtocol "TCP" -DirectServerReturn $true | Update-AzureVM }

9. Nachdem Sie die Variablen festgelegt haben, kopieren Sie das Skript aus dem Texteditor in Ihre Azure PowerShell-Sitzung und führen es aus. Wenn die Eingabeaufforderung immer noch >> anzeigt, geben Sie drücken Sie erneut Enter, um sicherzustellen, dass das Skript tatsächlich ausgeführt wird.

→ Sind Ihre Azure VMs ein Teil eines Windows Server 2008 R2 oder Windows Server 2021 Clusters, müssen Sie sicherstellen, dass der Hotfix KB2854082 auf jedem lokalen Server, sowie der Azure VMs installiert ist.

Öffnen der Firewall-Ports in den Verfügbarkeitsgruppenknoten

Wir erstellen nun eine Regel zum Öffnen des Firewall Testports für den VM Endpunkt mit Lastenausgleich. Gleichzeitig erstellen wir eine weitere Regel zum Öffnen des Listener-Ports der Verfügbarkeitsgruppe.

  1. Starten Sie Windows-Firewall mit erweiterter Sicherheit auf Ihrer VM.
  2. Klicken Sie auf Eingehende Regeln und erstellen eine Neue Regel.
  3. Im Regeltyp wählen Sie Port und klicken auf Weiter.
  4. Auf dem Protokoll und Ports Bereich wählen Sie TCP und geben 59999 in das specific local Ports Feld ein und klicken auf Weiter.
  5. Navigieren Sie zu Action und wählen die Verbindung zulassen aus.
  6. Akzeptieren Sie auf der Seite Profil die Standardeinstellungen.
  7. Benennen Sie nun im Bereich Namen, einen Namen für die Regel – vergleichbar mit der des Always On Listener Testports und klicken Sie dann auf Fertigstellen.
  8. Wiederholen Sie die vorherigen Schritte für den Listener-Port der Verfügbarkeitsgruppe (wie zuvor im Parameter $EndpointPort des Skripts angegeben) und wählen Sie jeweils einen geeigneten Regelnamen.

Nachdem wir nun die Firewall geöffnet und die VM Endpunkte eingerichtet haben, kann es nun weitergehen mit der Einrichtung der Verfügbarkeits-Listener.

Erstellen des Verfügbarkeitsgruppen Listeners

Zunächst erstellen wir einen Clientzugriffspunkt sowie eine Clusterressource und konfigurieren entsprechende Abhängigkeiten. Danach konfigurieren wir die Clusterressourcen mit PowerShell. Wir verwenden dafür den Failovercluster-Manager sowie das SQL Server Management Studio.

  1. Öffnen Sie den Failover-Cluster-Manager des Knotens, der das primäre Replikat hostet.
  2. Wählen Sie Netzwerke-Knoten aus und notieren sich den Namen des Clusternetzwerks. Dieser Name wird in der Variablen $ClusterNetworkName im PowerShell-Skript verwendet.
  3. Erweitern Sie den Clusternamen und klicken dann auf Rollen.
  4. Klicken Sie im Bereich Rollen mit der rechten Maustaste auf den Namen der Verfügbarkeitsgruppe und wählen Add Resource > Client Access Point aus.
  5. Erstellen Sie im Feld Name einen Namen für den neuen Listener. Klicken Sie anschließend auf Fertigstellen. Bringen Sie den Listener oder die Ressource zu diesem Zeitpunkt nicht online!
  6. Klicken Sie auf die Registerkarte Ressourcen und erweitern Sie den soeben erstellten Clientzugriffspunkt. Die IP-Adressressource für jedes Clusternetzwerk wird angezeigt. Handelt es sich hier um eine Azure-Lösung, wird nur eine IP-Adressressource angezeigt.
  7. Führen Sie nun einen der folgenden Schritte aus:
    • Konfiguration einer Hybridlösung:→ Klicken Sie mit der rechten Maustaste auf die IP-Adressressource,die Ihrem lokalen Subnetz entspricht und wählen dann Eigenschaften aus. Notieren Sie sich den IP-Adressnamen und den Netzwerknamen.→ Wählen Sie Statische IP-Adresse und weisen dieser eine nicht verwendete IP-Adresse zu und klicken dann auf OK.
    • Konfiguration einer Azure-Lösung:A. Klicken Sie mit der rechten Maustaste auf die IP-Adressressource, die Ihrem Azure-Subnetz entspricht, und wählen Sie dann Eigenschaften aus.
      B. In der gleichen Fenster ändern Sie den Namen der IP – Adresse.
      Dieser Name wird in der Variablen $IPResourceName des PowerShell-Skripts verwendet. Wenn Ihre Lösung mehrere virtuelle Azure-Netzwerke umfasst, wiederholen Sie diesen Schritt für jede IP-Ressource.

Konfigurieren der Clusterressourcen mit PowerShell

1. Zunächst rufen wir die öffentliche VIP-Adresse des Clouddienstes ab, der unsere Replikate hostet um den Lastenausgleich durchzuführen. Dafür melden wir uns im Azure-Portal an und navigieren zum Clouddienst, der die Verfügbarkeitsgruppen-VM enthält. 

2. Wir öffnen das Dashboard.

3. Wir notieren die öffentliche virtuelle IP-Adresse (VIP), die uns angezeigt wird. Haben Sie mehrere VNETs, müssen sie diesen Schritt für alle VMs, die ein Replikat hosten, entsprechend wiederholen.

4. Verarbeiten Sie die eben notierten Werte als Variablen im Texteditor für das folgende PowerShell Skript:

# Define variables $ClusterNetworkName = "<cluster_network_name>" # the cluster network name (Use Get-ClusterNetwork on Windows Server 2012 of higher to find the name) $IPResourceName = "<IPResourceName>" # the IP Address resource name $CloudServiceIP = "<X.X.X.X>" # Public Virtual IP (VIP) address of your cloud service Import-Module FailoverClusters # If you are using Windows Server 2012 or higher, use the Get-Cluster Resource command. If you are using Windows Server 2008 R2, use the cluster res command. Both commands are commented out. Choose the one applicable to your environment and remove the # at the beginning of the line to convert the comment to an executable line of code. # Get-ClusterResource $IPResourceName | Set-ClusterParameter -Multiple @{"Address"="$CloudServiceIP";"ProbePort"="59999";"SubnetMask"="255.255.255.255";"Network"="$ClusterNetworkName";"OverrideAddressMatch"=1;"EnableDhcp"=0} # cluster res $IPResourceName /priv enabledhcp=0 overrideaddressmatch=1 address=$CloudServiceIP probeport=59999 subnetmask=255.255.255.255

5. Öffnen Sie jetzt das Azure PowerShell Fenster und fügen das eben angepasste Skript ein. Drücken Sie die Eingabetaste, sodass das Skript ausgeführt wird.

6. Wiederholen Sie diesen Vorgang auf jeder VM. 


→ Dieses Skript konfiguriert die IP-Adressressource mit der IP-Adresse des Cloud-Dienstes und legt andere Parameter wie den Probe-Port fest. Wenn die IP-Adressressource online geschaltet wird, kann sie auf das Polling am Probe-Port von dem zuvor in diesem Tutorial erstellten Lastenausgleichsendpunkt antworten.

Nach diesem Schritt sind wir nun startklar, den Listener online zu bringen.

Den Listener online bringen

  1. Wir befinden uns wieder im Failovercluster-Manager und öffnen den Bereich Rollen.
  2. Markieren Sie Ihre Verfügbarkeitsgruppe.
  3. Klicken Sie in Ressourcen mit der rechten Maustaste auf den Listener-Namen und öffnen die Eigenschaften .
  4. Öffnen Sie nun den Bereich Abhängigkeiten. Wenn mehrere Ressourcen aufgelistet sind, überprüfen Sie, ob die IP-Adressen OR– und nicht AND-Abhängigkeiten aufweisen.
  5. Klicken Sie auf OK .
  6. Schalten Sie nun mit Rechtsklick auf den Listenernamen den Listener online.
  7. Ist der Listener jetzt online, klicken Sie in Ressourcen mit der rechten Maustaste auf die Verfügbarkeitsgruppe und öffnen die Eigenschaften
  8. Erstellen Sie nun eine Abhängigkeit der Listener-Namensressource (nicht den Namen der IP-Adressressourcen) und klicken dann auf OK.
  9. Starten Sie SQL Server Management Studio, und stellen Sie dann eine Verbindung mit dem primären Replikat her.
  10. Wechseln Sie zu AlwaysOn-HochverfügbarkeitVerfügbarkeitsgruppen → <AvailabilityGroupName> → Verfügbarkeitsgruppen-Listener.
  11. Der Listenername, den Sie im Failovercluster-Manager erstellt haben, sollte jetzt angezeigt werden.
  12. Öffnen Sie mit einem Rechtsklick auf den Listenernamen die Eigenschaften.
  13. Geben Sie die Portnummer für die Verfügbarkeitsgruppe an, indem Sie den $EndpointPort verwenden und klicken dann auf ok.

Nachdem der Verfügbarkeitsgruppenlistener erstellt ist, müssen möglicherweise die Clusterparameter RegisterAllProvidersIP und HostRecordTTL für die Listenerressource angepasst werden. Diese Parameter können die Wiederverbindungszeit nach einem Failover verkürzen, wodurch Verbindungszeitüberschreitungen verhindert werden können. 

Testen des Verfügbarkeitsgruppenlisteners innerhalb des VNETs

Um die Einrichtung des Listeners zu überprüfen, testen wir mit den nachfolgenden Schritten unsere Umsetzung innerhalb unseres VNETs:

  • Clientverbindungen zum Listener müssen von Computern stammen, die sich in einem anderen Clouddienst befinden.
  • Wenn sich die AlwaysOn-Replikate in verschiedenen Subnetzen befinden, müssen Clients MultisubnetFailover=True in der Verbindungszeichenfolge angeben. 
  • Diese Bedingung führt zu parallelen Verbindungsversuchen von Replikaten, in verschiedenen Subnetzen. Dieses Szenario umfasst eine regionsübergreifende AlwaysOn-Verfügbarkeitsgruppenbereitstellung.

Dafür stellen wir die Verbindung zwischen dem Listener und einem virtuellen Computer innerhalb eines Azure Netzwerks her. Eine mögliche Option ist die Verbindung über das SQL Server Management Studio, eine Andere, über SQLCMD.exe das folgende Skript auszuführen:

sqlcmd -S "<ListenerName>,<EndpointPort>" -d "<DatabaseName>" -Q "select @@servername, db_name()" -l 15

→ Stellen Sie beim Testen des Listeners sicher, dass die Verfügbarkeitsgruppe übersprungen wird, sodass Clients über Failover hinweg eine Verbindung mit dem Listener herstellen können.

Testen des Verfügbarkeitsgruppenlisteners über das Internet

Um aus dem Internet auf den eben konfigurierten Listener zuzugreifen, müssen wir auf den externen Lastenausgleich zurückgreifen. Diesen haben wir in den vorherigen Schritten bereits eingerichtet. Nutzen Sie die folgende SQLCMD Anweisung mit dem Namen Ihres Clouddienstes wie folgt:

sqlcmd -S "mycloudservice.cloudapp.net,<EndpointPort>" -d "<DatabaseName>" -U "<LoginId>" -P "<Password>"  -Q "select @@servername, db_name()" -l 15

Im Gegensatz zum vorherigen Schritt des Tests innerhalb des VNETs, muss hier die SQL Server Authentifizierung verwendet werden. Sie müssen in diesem Schritt sicherstellen, dass sie auf allen vorhandenen Replikaten diesselbe Anmeldung verwenden.

Wenn sich die AlwaysOnReplikate in verschiedenen regionsübergreifenden Subnetzen befinden, müssen Clients MultisubnetFailover=True in der Verbindungszeichenfolge angeben. Dies führt zu parallelen Verbindungsversuchen zu Replikaten in den verschiedenen Subnetzen. 


Im nächsten Artikel widmen wir uns der Konfiguration eines internen Listeners für Verfügbarkeitsgruppen auf Azure.