Už se vám někdy stalo, že jste restartovali řadič domény (domain controller, DC) a trvalo to opravdu hooodně dlouho? A třeba, že jste se už přihlásili a přitom to stejně ještě neběželo. Řádově minuty, někdy desítky minut.
Určitě. To se stává všem a jen málo lidí ví proč a jak to vylepšit a případně jak to úplně odstranit. Stává se to od Windows 2000 a nepřestane to ani s Windows 2012. Prostě to musíte nějak opravit.
Nejprve symptomy a situace kdy to nastává
Zaprvé máte více DC. Nebo tedy si alespoň AD myslí, že má více DC (možná jste něco odinstalovali a přitom se to správně neodebralo z AD databáze). V doméně, ve které je jen jedno DC tohle nastávat nebude. A ta další DC jsou buď nedostupná, vypnutá, nebo máte jen nějaké problémy v síti, nebo máte špatně nastaveno DNS.
Obvyklá situace je například:
- mám více DC, ale všechna jsem je vypnul a zapínám jen jedno z nich
- mám více DC a zrovna je všechna současně restartuju
- mám pobočku jenom s jediným DC, spadla mi linka do centrály, a já to svoje jediné DC zrovna restartuju
- přenesli jste si jen jedno DCčko do nějakého virtuálního testovacího prostředí
- mám sice více DC a všechna jedou, ale jejich DNS klienti jsou špatně nastaveni
Tak potom to jediné (izolované) DC bude startovat hoodně dlouho a bude to provázeno následujícími hláškami v protokolech událostí a na klientech apod. Nadále to budu nazývat izolované DC, protože se to dá zobecnit na tento výraz.
A teď symptomy více do detailu
Hlášky v protokolech událostí jsou například následující. Speciálně tyhle dvě hlášky v DNS Server event logu krásně indikují, jak dlouho ten start trval. Bude to, jak jsem již říkal, něco jako několik minut, až desítky minut:

|
Event ID: 4013 Log: DNS Server Source: DNS-Server-Service Event Type: Warning Message: The DNS server is waiting for Active Directory Domain Services (AD DS) to signal that the initial synchronization of the directory has been completed. The DNS server service cannot start until the initial synchronization is complete because critical DNS data might not yet be replicated onto this domain controller. If events in AD DS event log indicate that there is a problem with DNS name resolution, consider adding the IP address of another DNS server for this domain to the DNS server list in the Internet Protocol properties of this computer. |

|
Event ID: 2 Log: DNS Server Source: DNS-Server-Service Event Type: Information Message: The DNS server has started. |
V AD protokolu událostí Directory Services najdete na začátku tyto informace:

|
Event ID: 1555 Log: Directory Service Source: ActiveDirectory_DomainServices Event Type: Information Message: This directory server will not be available to clients until it has completed an initial synchronization of each writeable directory partition that it holds. At this time, these initial synchronizations have not been completed yet. The synchronizations will continue. |
|
Event ID: 3096 Log: System Source: NETLOGON Event Type: Warning Message: The primary Domain Controller for this domain could not be located. |
Pokud je vaše DC navíc ještě nějaký FSMO (flexible single master operations role owner - prostě master), uvidíte i toto:

|
Event ID: 2092 Log: Directory Service Source: ActiveDirectory_DomainServices Event Type: Warning Message: This server is the owner of the following FSMO role, but does not consider it valid. For the partition which contains the FSMO, the server has not replicated successfully with any of its partners since this server has been restarted. Replication errors are preventing validation of this role. Operations which require contacting a FSMO operations master will fail until this condition is corrected. |
Nejspíš se vám také povede přihlásit ve skutečnosti dříve, než DC úplně naběhne. Nejde to moc poznat, ale AD je pořád mrtvé a klienti s ním nekomunikují. Takže něco jako 10 minut před přihlášením, hurá, už se můžu přihlási, a pak ještě dalších 15 minut i když už na tom DC pracujete. Tedy přesněji řečeno, LDAP už jakžtakž funguje, ale ostatní funkce ještě nejedou.
Jestli je AD na tomto konkrétním DC (a to platí obecně kdykoliv), poznáte jednoduše tak, že se mrknete do jeho RootDSE. Buď si otevřete ADSI Edit, nebo LDP a omrkněte atribut isSynchronized, který by měl být správně TRUE a přitom je FALSE:

Nebo si z příkazové řádku vyzkoušejte port scan vůči sami sobě (nebo jinému DC):
portqry -n nejakeDC -e 389
A takhle to bude trvat těch 20 minut například. Potom ADčko vytajmautuje a uvolní se a rozjede se. Poznáte to podle této události:

|
Event ID: 1394 Log: Directory Service Source: ActiveDirectory_DomainServices Event Type: Information Message: All problems preventing updates to the Active Directory Domain Services database have been cleared. New updates to the Active Directory Domain Services database are succeeding. The Net Logon service has started. |
Pokud nestartujete izolovaně, máte nějakého kamaráda v síti, ale přitom máte nějak špatně nastaveno DNS, tak to bude startovat rychleji, ale stejně uvidíte následující hlášku. I v tomto případě, bez ohledu na rychlost, je potřeba to vyřešit, protože DNS nefunguje spolehlivě a spoléhat se na mého odvěkého nepřítele NetBIOS není optimální.

|
Event ID: 2088 Log: Directory Service Source: ActiveDirectory_DomainServices Event Type: Warning Message: Active Directory Domain Services could not use DNS to resolve the IP address of the source domain controller listed below. To maintain the consistency of Security groups, group policy, users and computers and their passwords, Active Directory successfully replicated using NetBIOS or fully qualified computer name of the source domain controller. Invalid DNS configuration may be affecting other essential operations on member servers, computers, domain controllers or application servers in this Active Directory Domain Services forest, including logon authentication or access to network resources. |
Takže o co vlastně jde a proč se to děje?
Nejprve nějkterá fakta ohledně initial synchronization:
- když DC startuje, nezačne fungovat dříve (atribut RootDSE isSynchronized = FALSE), než se mu povede alespoň jednou repliknout s nějakým kamarádem. Stačí jediný kamarád. Tedy pokud je více DC ve forestu. Pokud máte jen jedno, na nic se čekat nebude. Říká se tomu initial synchronization, neboli init sync, nebo initial replication.
- tato úvodní replikace je pouze sebeochranná funkce. Technicky to není potřeba. Jen je to ochrana proti tomu, aby se třeba nezměnil nějaký FSMO master a nebyli dva stejní v jedné doméně. Nebo to třeba taky chrání před problémem zvaným USN rollback v případě obnovy snapshotu. Ani jedno sice dělat nemáte, ale když to nevíte, tak se vás takhle snaží AD chránit.
- k replikaci je potřeba, aby v síti běželo ještě nějaké DC :-) Navíc zkoušíte nejprve jenom ty kamarády, se kterými replikujete normálně. Až pokud jejich spojení není možné, tak zkoušíte ostatní. Takže i když jenom chybí nějaký váš "obvyklý" kamarád, tak to bude déle trvat.
- také musíte být schopni přeložit jeho jméno pomocí DNS a při nejhorším pomocí NetBIOS (to je ta událost event 2088).
- pokud se vám tahle replikace nepovede do nějakého timeoutu, nakonec to DC vzdá a rozjede se (isSynchronized = TRUE a objeví se událost event 1394, i když ty problémy vyřešeny nebyly :-)). Doba je dána počtem ostatních DC. Takže když máte celkem jen jednoho kamaráda, bude to kratší, než když jich máte desítky. To si počkáte i desítky minut.
To jsou fakta ohledně AD. Související problém je v DNS:
- DNS se nenastartuje, dokud AD není v pořádku. Takže DNS server čeká, než jeho lokální DC bude isSynchronized = TRUE.
- dokud AD nenaběhne, nenaběhne ani DNS. Pokud máte špatně nastaveny parametry DNS překladu, máte deadlock (po česku problém slepice a vejce).
Představte si toto. Máte třeba i více DC v síti. Ale nejsou si vzájemě schopni překládat jména. Při každém startu bude každý čekat sám na sebe. Takže naše zátuhová situace může nastat i v následujícím případě - každé DC je třeba nastaveno tak, že používá pouze svůj vlastní DNS server a přitom má vypnutý NetBIOS. Vypínání NetBIOS je maximálně žádoucí a špatná konfigurace DNS je obvyklá.
Řešení a optimalizace
Jak to opravit? Opravujeme vlastně dvě základní situace:
- obvykle jede více DC, ale máme špatně nastaveno DNS
- DNS máme v pořádku, ale ano, často startujeme více DC současně, nebo startujeme DC opravdu izolovaně
Takže nejprve optimalizace DNS. Rozhodně nastavte DC tak, aby používali svoje DNS servery do kříže (vymyslel jsem na to termín cross-dns configuration). V následujícím obrázku jsou vlastnosti síťovky jednoho DC, jehož IP adresa je 10.10.0.12 a má kamaráda s IP adresou 10.10.0.11. Nastavte to tak, že první DNS je kamarád, zatímco vaše DNS je až druhé. Nepoužívejte adresu 127.0.0.1 - nevím proč, ale občas mi to nefunguje:

Tímhle nastavením dosáhnete toho, že při startu se ptáte prvně kamaráda. Pokud ten funguje, dozvíte se perfektně všechny DNS názvy. Když budete kamaráda později restartovat, vadit vám to nebude. Primární dotazy skončí na timeout, takže se v pohodě zeptáte sami sebe jako sekundárního DNS resolveru.
Poznámka - timeout pro primární DNS resolver je ve výchozím stavu 1sec. takže to vás nebude vůbec zdržovat.
Nestačí to dát opačně? A mít tam na prvním místě sám sebe a kamaráda až druhého? Ne, protože když se zeptáte sami sebe, je možné, že si nakešujete negativní odpověď (negative cache) - tzn. budete si ještě 20 minut pamatovat, že to jméno neexistuje. Přitom by stačilo zeptat se sekundárního kamaráda, ale to za určitých okolností neuděláte (vaše DNS totiž "částečně jede a bohužel i odpovídá").
Takže jednoznačně - kamarád je primární DNS resolver, vy sami jste až sekundární. To je pravidlo.
Otázka - co když mám pobočku s jedním DC a DNS na něm. Mám si nastavit centrálu jako primární i v tomto případě, nebo je tohle výjimka? Ano, i takto je lepší, když bude centrála primární. Těch DNS dotazů neděláte tolik, máte to všechno v keši, takže to nijak nezatěžuje. Pokud spojení do centrály není k dispozici, nebo prostě jen skončí na timeout (1 sec) zeptáte se v pohodě sami sebe.
Řešení pro izolovaná DCčka
A máme tu druhý problém. Co když často startujete jedno DC izolovaně. Příklady jsou izolované pobočky, testovací prostředí, časté starty více DC současně apod.
Stačí prostě vypnout tu initial synchronizaci (init sync). Ale zvažte, jestli je to dobrý nápad. Připravujete se o ochranu proti USN rollback a FSMO seize operacím a kdoví čemu ještě:
HKLM\System\CurrentControlSet\Services\NTDS\Parameters
Repl Perform Initial Synchronizations = REG_DWORD = 0
Závěr
Skandujte se mnou: DNS do kříže! DNS do kříže! DNS do kříže! DNS do kříže! DNS do kříže! DNS do kříže!
PS: omlouvám se všem ne-křesťanům, nemá to nic společného s náboženstvím. Snad jen možná s náboženstvím zvaným Active Directory!