Backup und Restore von grossen Namespaces

Heute gleich nochmal ein Beitrag von Hubert aus unserem Netzwerkteam, nach längerer Zeit mal wieder etwas zum Thema DFS Namespaces.

Hallo zusammen,

wie ja weithin bekannt ist, sind mit Domain V2 Namespaces die Limits von 5000 Links für Domain Namespaces weggefallen.

Wir sehen heutzutage bei unseren Kunden regelmässig Namespaces mit mehreren 10.000 Links und teilweise sogar über 100.000 Links.
Anmerkung: Die maximal empfohlene Grösse liegt bei 50.000 Links
Üblicherweise wird als Backup regelmässig ein dfsutil root export des Namespaces in eine Text- bzw. xml-Datei gespeichert.
Im Falle, dass der Namespace wiederhergestellt werden muss, würde man dann den Namespace wieder anlegen (von Hand oder via dfsutil) und mittels des dfsutil root import Befehls die Links und Namespace Optionen, inklusive eventueller Berechtigungen auf den Links, aus der xml Datei wiederherstellen.

Soweit so gut und für kleinere Namespaces bleibt dies auch der Weg der Wahl.
Bei grösseren Namespaces macht sich allerdings eine Eigenschaft des dfsutil imports zunehmend negativ bemerkbar.
dfsutil verwendet die NetDfs Api (https://msdn.microsoft.com/en-us/library/windows/desktop/bb524802(v=vs.85).aspx) und jeder DFS Server unterhält einen Thread innerhalb des DFS Namespace Dienstes, der sich mit der Beantwortung von Requests gegen diese API beschäftigt.
Somit ist ein dfsutil import also single-threaded.

Ich komme in meiner (zugegeben nicht representativen) Testumgebung auf ca. 800ms pro Link beim Import mit dfsutil.
Das macht also bei einem 5000 Link Namespace ca. 1 Stunde für den kompletten Import und mag gerade noch im Rahmen liegen.
Bei Namespaces mit 50.000 Links sprechen wir jedoch von 11 Stunden, was für einen Restore komplett inakzeptabel ist.

Daher möchte ich euch heute ein Verfahren vorstellen, wie Ihr eure grossen Namespaces sichern und wiederherstellen könnt ohne stundenlang auf einen Import zu warten.
In meiner Testumgebung konnte ich damit einen 70.000 Link Namespace in unter 2 Minuten importieren ;-)

Grob gesagt: Per ldifde werden die AD-Objekte der Links samt der für DFS relevanten Attribute direkt aus dem AD in eine Textdatei exportiert.
Bei der Widerherstellung werden die Objekte direkt aus der Textdatei wieder zurück ins AD geschrieben.

Befehl fürs Backup:
ldifde -f <Export-Dateiname>.ldf -d "cn=<Namespace Name>,CN=Dfs-Configuration,CN=System,DC=<Domain Name>,DC=<Domain Suffix>" -r "(objectclass=msDFS-Linkv2)" -l "msDFS-GenerationGUIDv2,msDFS-NamespaceIdentityGUIDv2,msDFS-LastModifiedv2,msDFS-Ttlv2,msDFS-Propertiesv2,msDFS-TargetListv2,msDFS-LinkPathv2,msDFS-LinkIdentityGUIDv2,msDFS-LinkSecurityDescriptorv2,msDFS-Commentv2,msDFS-ShortNameLinkPathv2,objectclass"

Bitte die <Platzhalter> durch entsprechende Werte ersetzen.

Hierdurch werden alle Link Objekte des im DN angegebenen Namespaces mit den für DFS relevanten Attributen in eine .ldf Datei exportiert.

Der Namespace Anchor und das Namespace Objekt selber (also die nächst höheren Ebenen) werden nicht exportiert und können somit auch nicht wiederhergestellt werden.
Der Hintergrund ist, dass nach der Löschung eines Namespaces die Wiederherstellung dieser beiden Objekte dazu führt, dass zwar ein Namespace im AD existiert, es jedoch keinen DFS Server gibt der sich für diesen Namespace zuständig fühlt.

Daher ist der robustere Ansatz den Namespace über die NetDFS Api (also DFS Management Konsole, dfsutil.exe o.ä.) selber wieder anzulegen.
Hierbei werden dann die beiden Objekte im AD (Namespace und Anchor) angelegt und der ausgewählte DFS Server hostet den Namespace.
In diesen Namespace können wir dann unseren ldifde Import hinein machen.

Der empfohlene Ablauf wäre also:

1. Eventuell verbliebene Reste des Namespaces im AD sowie auf den einzelnen DFS Servern löschen.
Siehe hierzu auch: https://support.microsoft.com/en-us/kb/842218/

2. Anlegen eines neuen Namespaces unter gleichem Namen auf einem der DFS Server (siehe oben)

3. Setzen der relevanten Namespace Optionen. (im Zweifelsfall im dfsutil export nachschlagen)

4. Import der .ldf Backup Datei mit: ldifde -f <Export-Dateiname>.ldf –i (bevorzugt auf dem PDC)

5. Hinzufügen der übrigen DFS Server per Script (dfsutil) oder von Hand.

Das Verfahren hat natürlich ein paar Rahmenbedingungen die erfüllt sein müssen:

- Es muss ein Domain V2 Namespace sein

- Er muss in der selben Domäne existiert haben

- Vor dem Import der Links müssen das Namespace Anchor und das Namespace Objekt durch angelegen eines neuen Domain V2 Namespaces erzeugt  worden sein.

- Der neue Namespace muss den selben Namen haben, wie der Namespace im Backup.

Weitere Überlegungen:

- Da der Import an der DFSApi vorbei direkt ins AD geht, bekommen  die, zu diesem Zeitpunkt im Namespace befindlichen, Server von den neuen Links nichts mit.
Daher muss entweder bis zum nächsten stündlichen Update dieser DFS Server gewartet oder der DFS-Dienst bzw. der Server neugestartet werden um ein Update zu forcieren.

- Dieses Backup ist kein Ersatz für ein DFSUtil Export der Namespaces und dieser sollte somit parallel weiterhin erfolgen.
Einerseits sind im DFSUtil Export die Namespace Optionen hinterlegt (auch wenn aus diesem Backup der Namespace selber nicht wieder hergestellt werden kann), andererseits ist dies nach wie vor das geeignetste Mittel um kleinere Mengen an Links wiederherzustellen.
Hierzu die übrigen (nicht wiederherzustellenden Links) aus dem Export löschen und mittels dem merge Parameter importieren.

- Da weder ein DFSutil Import noch der ldifde Import DFS Server zum Namespace hinzufügen, oder den Namespace selber anlegen können, emphiehlt es sich ein kleines Script bereitzulegen, dass
- Einen neuen Namespace mit gleichem Namen und gleichen Namespace Optionen anlegt.
- Nach dem ldifde Import die übrigen DFS Server wieder zum Namespace hinzufügt.

Also!
Überlegt ob dies auch auf euch zutreffen könnte, spielt in eurer Testumgebung Backup und Restore eurer Namespaces mal durch und entscheidet ob ihr den ldifde Export zusätzlich zu einem dfsutil Export in eure Produktion übernehmen wollt.

Euer Hubert