Get-DAGStatus
Das kleine PowerShell-Script, welches ich aktuell interaktiv oder per Taskplaner immer mal wieder aufrufen lasse, ermittelt alle Datenbanken und die Server der DAG und gibt diese als XML-Datei aus. Wenn Sie diese Datei über den IIS verfügbar machen, kann jeder anonym oder nach Anmeldung den aktuellen Status anzeigen und über eine XSLT-Transformation in HTML konvertiert werden. Über den HTTP-Refresh kann die Seite sogar auf einem Statusmonitor permanent angezeigt werden. Anstelle einem permanenten Update wäre es natürlich auch denkbar, die Information erst beim Aufruf durch den Webserver erstellen zu lassen. Eine anderen Option wäre natürlich ein Windows Programm (z.B. Silverlight), welches diese Daten anders grafisch anzeigt.
Das Skript ermittelt die DAG-Member und die Datenbanken und baut eine Tabelle auf, in deren Kreuzungspunkten der aktuelle Status der Datenbank auf diesem Server sichtbar wird.
Beispiel
Da es bis zu 100 Datenbanken aber maximal 16 Server gibt, stellen die Spalten die Server darf und die Zeilen die Datenbanken. mit dem Standard XSLT-File
Get-DAGStatus | DAGName: dag1.firma.local | |||||
---|---|---|---|---|---|---|
Datenbank |
Pfad |
Server1 | Server2 | Server3 | Server4 | Server5 |
DB1 | M:\DB1 | 1 |
4 |
3 |
2 |
|
DB2 | M:\DB2 | 2 |
1 |
2 |
4 |
|
DB3 | M:\DB3 | 3 |
2 |
1 |
3 |
|
DB4 | M:\DB4 | 4 |
3 |
2 |
1 |
|
Die Liste der Server und Datenbanken wird natürlich dynamisch erstellt. In den Kreuzungspunkten steht die Aktivierungsreihenfolge und farblich ist der aktuelle Status ersichtlich:
Codierung | Exchange Status | Bedeutung |
---|---|---|
Blau |
Aktiv |
Dies ist die aktuell aktive Instanz bzw. der primäre Server |
Grün |
Ready |
Diese Instanz ist "in Sync" und
bereit, die Funktion im Fehlerfall
aufzunehmen |
Gelb |
Initializing |
Die Datenbank wartet noch auf die ersten Logdateien, um dann hoffentlich auf "Ready" zu wechseln. |
Orange |
Suspended |
Datenbankkopie ist gerade "angehalten", d.h. wird nicht weiter geschrieben |
Rot |
Error |
Datenbankinstanz ist fehlerhaft und
kann nicht online geschaltet werden |
Weiß |
Entfällt |
Diese Datenbank ist auf dem Server nicht vorhanden, d.h. es gibt kein konfiguriertes Replikat |
Die angezeigte Farbcodierung ist natürlich ebenfalls abhängig von dem XSLT-Stylesheet. (Siehe auch XML-Datei)
Funktionsweise
Das Skript wird aktuell per Parameter gesteuert. Dazu gehören:
- Name der DAG
- Name der HTML-Datei
- Aktion für Alarm (noch nicht implementiert)
Im Skript werden die folgenden Exchange Commandlets verwendet.
- Get-DatabaseAvailabilityGroup
Aus dem Property "Servers" können alle Server ermittelt, werden, die in der angegebenen DAG enthalten sind.
Ermittelt die Server, die zur DAG gehören und auch deren aktueller Status. Diese Informationen werden für die Erstellung der Spalten mit den Servern verwendet. - Get-MailboxDatabaseCopyStatus
Wird diese Commandlet mit einem Servernamen statt einer Datenbank aufgerufen, wird der Status der einzelnen Datenbanken auf diesem Server wiedergegeben. - Get-Mailboxdatabase
Dieser Befehl listet nicht nur die Datenbanken sondern auch die Aktivierungsreihenfolge für die einzelnen Server und damit indirekt auch die Server, welche ein Replikat haben.
Allein aus diesen drei Commandlets erstellt das Skript eine XML-Datei, die dann für die Ausgabe formatiert wird.
PC:>[Microsoft.Exchange.Management.SystemConfigurationTasks.CopyStatus].getmembers() | ft name unknown Failed Seeding Suspended Healthy ServiceDown Initializing Resynchronizing Mounted Dismounted Mounting Dismounting DisconnectedAndHealthy FailedAndSuspended DisconnectedAndResynchronizing NonExchangeReplication SeedingSource
Ausgabe
Das Skript sammelt die Daten und gibt diese über die Pipeline aus, so dass diese anderweitig weiter verarbeiten werden können. Das kann ein Export-CSV, eine XML-Datei oder über eine Formatierung mit Stylesheets sogar eine HTML-Datei werden.
Für den interaktiven Einsatz ist aber auch die farbige Ausgabe auf dem Bildschirm interessant. Damit das Layout aber nicht "verwurstet" wird, müssen Sie die Ausgabe der Pipeline mit "| out-null" unterdrücken. Hier zwei Musterbilder: Eine DAG aus drei Servern (4,2,3) und drei Datenbanken (MB21, MB11, MB22). Datenbank M21 liegt auf Server4 und ist auf Server 3 gemountet. Datenbank 22 hingegen ist auch auf Server 3 gemountet, obwohl die Aktivierungsreihenfolge (Nummer im farbigen Feld)
Hier sehen Sie die gleiche Ausgabe einer neueren Version, die die Servernamen anders abschneidet
Im Gegensatz zu Exchange MMC, die immer nur den Status einer Datenbank auf vielen Servern oder die Datenbanken auf einem Server als Ansicht hat, können sie so relativ schnell einen Überblick über alle Datenbanken erhalten, was speziell im Fehlerfall sehr hilfreich sein kann.
Download
Das Skript Get-DAGStatus ist aktuell noch in einem frühen Stadium und weit davon entfernt, produktiv eingesetzt zu werden. ich werde es nach und nach bei verschiedenen Kunden immer weiter verbessern und eventuel zu einem späteren Zeitpunkt veröffentlichen. Aktuell ist es meinen Kunden vorbehalten.
Sie können mit aber bei der Verbesserung helfen. Führen Sie folgende Befehle auf der Exchange PowerShell aus und senden mir die generierten XML-Dateien. Diese kann ich dann in mein Skript füttern und die Ausgaben überprüfen und damit das Skript immer weiter verbessern. Interessant sind natürlich "große DAGs" mit mehreren Servern und Datenbanken. Beachten Sie, dass Sie beim zweiten Block ihren "DAGNAMEN" ersetzen müssen
Write-Verbose "Loading existing Databases to get identity and activation preference" $databases = (get-mailboxdatabase | SELECT name,identity,BackupInProgress,DatabaseSize,LastFullBackup,ActivationPreference) $databases | export-Clixml -path "get-mailboxdatabase.xml" Write-Verbose "Loading DAG Memberlist to get servers in given DAG" $dagserver = (Get-DatabaseAvailabilityGroup -identity "DAGNAME").Servers $dagserver | export-Clixml -path "dagserver.xml" Write-Verbose "Loading DAG List" $dagserver = Get-DatabaseAvailabilityGroup $dagserver | export-Clixml -path "daglist.xml" Write-Verbose "Loading MailboxDatabaseCopyStatus of all servers" $mbstatus = (get-mailboxserver | where {$_.databaseavailabilitygroup -ne $null} | Get-MailboxdatabaseCopyStatus) $mbstatus | export-Clixml -path "allcopystatus.xml" Write-Verbose "Loading Mailboxservers" $mbserver = (get-mailboxserver | where {$_.databaseavailabilitygroup -ne $null}) $mbserver | export-Clixml -path "get-mailboxserver-dag.xml"
Das Ergebnis sind die drei XML-Dateien, die mir einen Überblick über ihre Mailboxdatenbanken in DAGs geben. Als "Belohnung" erhalten Sie auf jeden Fall ein "Screencapture" und sind ein heißer Kandidat bei einer Pilotphase dabei sein zu können.
Offen
Weiterentwicklungen sind natürlich möglich z.B.:
- Weniger Commandlets
Ich habe mittlerweile gesehen, dass ein "(get-mailboxserver | where {$_.databaseavailabilitygroup -ne $null})" alle Server und die DAGs ermittelt und ich mir damit die Abfrage der DAG ersparen kann und dann nur noch den Status der Datenbanken pro Server ermitteln muss. - Anzeige, wenn aktive Datenbank nicht auf dem Server ist, der in der Aktivierungsreihenfolge präferiert ist
- Windows-GUI-Version mit Refresh
z.B. als Bildschirmschoner oder Hintergrundprogramm, auch mit automatischem Update - Ausgabe HTML-Datei
So könnte der Status auf einem Webserver gespeichert und von überall erreichbar werden. - Remote-Fähigkeit
z.B. damit der Admin auf seinem PC dies starten kann - Alert bei StatusÄnderung
Wenn das Skript schon erkennt, dass etwas nicht mehr "wie vorher" ist, könnte es die Änderungen sichtbar machen und sogar alarmieren. Natürlich müsste es den alten Status irgendwo speichern. - Behandeln mehrerer DAGs
Aktuell bearbeitet das Script genau eine DAG. Mehrere DAGs als eigene Tabelle sind schon in Planung
Weitere Links
- DAG
- DAG-Replication
- CCRMon
- XML-Datei
- Monitoring High Availability and Site Resilience
http://technet.microsoft.com/en-us/library/dd351258.aspx
CollectOverMetrics.ps1, CollectReplicationMetrics.ps1 - PowerShell
- Hochverfügbarkeit
- Clustergrundlagen
- PowerShell Beispiele
- Using Get-HealthReport to monitor DAGs
http://windowsitpro.com/blog/using-get-healthreport-monitor-dags