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
Ein so gekennzeichneter Server ist Online

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
Der Server ist nicht aktiv/online

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