Erro "The node failed to join failover cluster due to error code '2'" ao tentar ingressar node no cluster
Por: Rafael Oliveira
Recentemente, trabalhamos em um caso o qual ocorria falha ao tentar ingressar um novo node a um cluster Hyper-V com Windows Server 2012 R2. Basicamente, o erro obtido no wizard de adição do novo node era o seguinte:
Cluster service on node NODE02 did not reach the running state. The error code is 0x5b4. For more information check the cluster log and the system event log from node NODE02. This operation returned because the timeout period expired.
The server 'NODE02.domain.com' could not be added to the cluster.
An error occurred while adding node 'NODE02.domain.com' to cluster 'CLUHYPERV2012'.
This operation returned because the timeout period expired
No log de eventos do node que sofreu falha durante a operação de join no cluster tínhamos o seguinte evento:
Log Name: System
Source: Microsoft-Windows-FailoverClustering
Date: 03/01/2017 17:58:15
Event ID: 1070
Task Category: Startup/Shutdown
Level: Critical
Keywords:
User: SYSTEM
Computer: NODE02.domain.com
Description:
The node failed to join failover cluster 'CLUHYPERV2012' due to error code '2'.
Event Xml:
<Event xmlns="https://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="Microsoft-Windows-FailoverClustering" Guid="{BAF908EA-3421-4CA9-9B84-6689B8C6F85F}" />
<EventID>1070</EventID>
<Version>0</Version>
<Level>1</Level>
<Task>8</Task>
<Opcode>0</Opcode>
<Keywords>0x8000000000000000</Keywords>
<TimeCreated SystemTime="2017-01-03T19:58:15.497629200Z" />
<EventRecordID>5217543</EventRecordID>
<Correlation />
<Execution ProcessID="4868" ThreadID="3164" />
<Channel>System</Channel>
<Computer> NODE02.domain.com</Computer>
<Security UserID="S-1-5-18" />
</System>
<EventData>
<Data Name="ClusterName">CLUHYPERV2012</Data>
<Data Name="Status">2</Data>
<Data Name="NodeName">NODE02</Data>
</EventData>
</Event>
A fim de obter mais detalhes, foi gerado o cluster log. Aqui fica um adendo sobre este assunto: em cenários onde temos falha para adicionar o node no cluster, é necessário que o comando para criação do cluster log seja executado diretamente no nó que falha ao ser adicionado. Mais informações sobre como gerar o cluster log podem ser encontradas no link https://technet.microsoft.com/pt-br/library/ee461045.aspx.
No log do cluster, tínhamos, basicamente, o seguinte:
00001304.00000c5c::2017/01/03-19:58:15.497 ERR [CORE] Node 1: exception caught (2)' because of 'Failed to read value 'Name''
00001304.00000c5c::2017/01/03-19:58:15.497 ERR Exception in the InstallState is fatal (status = 2)
00001304.00000c5c::2017/01/03-19:58:15.497 DBG [NETFT] Disabling heartbeats
00001304.00000c5c::2017/01/03-19:58:15.498 DBG [NETFT] Enabling heartbeats
00001304.00000c5c::2017/01/03-19:58:15.498 DBG Exception in the InstallState is fatal: set netft heartbeat interval to 900 seconds
00001304.00000c5c::2017/01/03-19:58:15.498 ERR Exception in the InstallState is fatal (status = 2), executing OnStop
O error code da falha era 2 ("The system cannot find the file specified") e, pela mensagem obtida acima no cluster.log, vimos que o mesmo estava associado a leitura do parâmetro 'Name'. Como conclusão, o parâmetro 'Name' não foi encontrado.
Infelizmente, não tínhamos mais detalhes acerca deste parâmetro e a qual recurso ele pertencia, por exemplo. Com isso, simulamos novamente o problema coletando um trace com o process monitor (https://technet.microsoft.com/en-US/sysinternals/processmonitor.aspx) da Sysinternals.
Analisando o cluster.log em conjunto ao trace do procmon (Process Monitor), a fim de obter os eventos no mesmo período, foi detectado o seguinte:
Cluster.log:
000018e0.00001a18::2017/01/04-19:15:46.297 ERR [CORE] Node 1: exception caught (2)' because of 'Failed to read value 'Name''
000018e0.00001a18::2017/01/04-19:15:46.297 ERR Exception in the InstallState is fatal (status = 2)
000018e0.00001a18::2017/01/04-19:15:46.297 DBG [NETFT] Disabling heartbeats
000018e0.00001a18::2017/01/04-19:15:46.297 DBG [NETFT] Enabling heartbeats
000018e0.00001a18::2017/01/04-19:15:46.297 DBG Exception in the InstallState is fatal: set netft heartbeat interval to 900 seconds
000018e0.00001a18::2017/01/04-19:15:46.297 ERR Exception in the InstallState is fatal (status = 2), executing OnStop
Procmon:
17:15:46,3230508 clussvc.exe 6368 6680 RegQueryValue HKLM\CLUSTER\Groups\54230fb4-d525-46b4-987e-7fc8f4b2e74f\Name NAME NOT FOUND Length: 144
Ou seja, o resource group do cluster com ID 54230fb4-d525-46b4-987e-7fc8f4b2e74f estava sem o parâmetro 'Name'. Através do cmdlet PowerShell Get-ClusterGroup | fl * confirmamos que tínhamos este grupo sem nome:
Cluster : CLUHYPERV2012
IsCoreGroup : False
OwnerNode : NODE01
State : Online
Name :
Description :
PersistentState : 1
FailoverThreshold : 4294967295
FailoverPeriod : 6
AutoFailbackType : 0
FailbackWindowStart : 4294967295
FailbackWindowEnd : 4294967295
GroupType : VirtualMachine
Priority : 2000
DefaultOwner : 1
AntiAffinityClassNames : {}
StatusInformation : 0
Id : 54230fb4-d525-46b4-987e-7fc8f4b2e74f
Como consequência, executamos o cmdlet abaixo no powershell para adicionar um node ao grupo:
(Get-ClusterGroup | where {$_.Id -eq "54230fb4-d525-46b4-987e-7fc8f4b2e74f"}).Name = "VM01"
Entretanto, ao tentarmos adicionar novamente o node no cluster, a operação falhou com o mesmo erro descrito no início do artigo. Sendo assim, fizemos uma nova coleta do process monitor simulando o problema e obtivemos o seguinte:
Cluster.log:
00001db0.00001424::2017/01/05-10:11:17.779 ERR [CORE] Node 1: exception caught (2)' because of 'Failed to read value 'Name''
00001db0.00001424::2017/01/05-10:11:17.779 ERR Exception in the InstallState is fatal (status = 2)
00001db0.00001424::2017/01/05-10:11:17.779 DBG [NETFT] Disabling heartbeats
00001db0.00001424::2017/01/05-10:11:17.779 DBG [NETFT] Enabling heartbeats
00001db0.00001424::2017/01/05-10:11:17.779 DBG Exception in the InstallState is fatal: set netft heartbeat interval to 900 seconds
00001db0.00001424::2017/01/05-10:11:17.779 ERR Exception in the InstallState is fatal (status = 2), executing OnStop
Procmon:
10:22:30.8541374 AM clussvc.exe 7056 RegQueryValue HKLM\CLUSTER\Resources\5584f195-1a5e-4e6d-a15a-e7939cd27bc3\Name NAME NOT FOUND Length: 144
Agora, tínhamos um recurso que estava sem o parâmetro 'Name' na hive do cluster. No entanto, ao executar Get-ClusterResource | where {$_.Id -eq "5584f195-1a5e-4e6d-a15a-e7939cd27bc3"} a fim de obter mais detalhes do mesmo, identificamos que o parâmetro 'Name' estava preenchido, porém no registro isto não se refletia, conforme mostrado abaixo:
PowerShell:
Cluster : CLUHYPERV2012
IsCoreResource : False
IsNetworkClassResource : False
IsStorageClassResource : False
OwnerNode : NODE01
ResourceType : Virtual Machine Configuration
State : Online
OwnerGroup : VM01
Name : Virtual Machine Configuration VM01
MaintenanceMode : False
MonitorProcessId : 2620
Characteristics : BroadcastDelete, MonitorDetach, MonitorReattach, NotPreempta
Description :
SeparateMonitor : False
StatusInformation : 0
PersistentState : 1
LastOperationStatusCode : 0
LooksAlivePollInterval : 4294967295
IsAlivePollInterval : 4294967295
RestartAction : 2
RestartThreshold : 1
EmbeddedFailureAction : 2
RestartDelay : 500
RestartPeriod : 900000
RetryPeriodOnFailure : 3600000
PendingTimeout : 180000
DeadlockTimeout : 300000
ResourceSpecificData1 : 0
ResourceSpecificData2 : 0
ResourceSpecificStatus :
Id : 5584f195-1a5e-4e6d-a15a-e7939cd27bc3
Registro:
[HKEY_LOCAL_MACHINE\Cluster\Resources\5584f195-1a5e-4e6d-a15a-e7939cd27bc3]
"Type"="Virtual Machine Configuration"
"SeparateMonitor"=dword:00000000
"RestartAction"=dword:00000002
"PersistentState"=dword:00000001
(Vemos acima que o parâmetro 'Name' não estava disponível)
A fim de popular novamente o registro, forçamos uma alteração da database renomeando o recurso para um nome temporário e, em seguida, de volta para o nome padrão a fim de permitir que o parâmetro 'Name' fosse criado no registro:
(Get-ClusterResource | where {$_.Id -eq "5584f195-1a5e-4e6d-a15a-e7939cd27bc3"}).Name = 'Virtual Machine Configuration VM01_Temp'
(Get-ClusterResource | where {$_.Id -eq "5584f195-1a5e-4e6d-a15a-e7939cd27bc3"}).Name = 'Virtual Machine Configuration VM01'
Após isso, foi possível ingressar o node com sucesso no cluster.