VM HA tra datacenters diversi, storage diversi…con i Netapp snapshots

Posted on 12 ottobre 2011 di

0


Per evitare che accada che se sul sito di DR la VM1 vada giù assieme a tutto il resto, ho realizzato una alta affidabilità “fatta in casa” col sito Primario.

Premessa: la VM1 gira sul sito di DR e monitora i due siti nel nostro caso. Per questo ci interessa che durante un failure del sito DR essa sia attivi sul sito primario anche se non sarà aggiornata alla ultima situazione. In pratica essa ospita un servizio in “consultazione” e non dati. Inoltre il datastore su cui risiede è nfs e montato anche sul sito primario.

DESCRIZIONE PROCESSO

COPIA

Ogni giorno alle ore 13.10 uno scheduled task (powershell) sul vcenter primario copia la VM1  dallo snapshot “hourly.1” (corrispondente alla situazione delle 12.00) del DS del FAS1 DS_NFSH1 su DS del FAS2 DS_NFSH2, entrambi montati sul sito primario.

Vengono inviate mail esterne per conferma che il processo sia stato eseguito con successo. Se il tasks windows fallisce ci arriva un sms (grazie al solito nagios event log).

LA COPIA PARTE SOLAMENTE SE LO STORAGE NETAPP DS_NFSH1 RISULTA CORRETTAMENTE MONTATO SUL VCENTER PRIMARIO E LA VM1 NON E’ GIA’ IVI REGISTRATA.

CONTROLLO

Ogni 10 minuti (intervallo calcolato come corretto affinchè tutto funzioni correttamente) uno scheduled task (powershell) sul vcenter primario controlla che VM1 sia raggiungibile, facendo 10 tentativi per evitare problemi momentanei di rete.

Se il tasks windows fallisce ci arriva un sms (grazie al solito nagios event log).

Se non riceve almeno un ok di  raggiungibilità registra sul vcenter del sito primario la più recente macchina VM1 delle 12.00 (alle peggiore delle impotesi può essere quella delle 12 del giorno prima), configura la scheda di rete e la accende sulla lama standalone blesxi25.

Vengono inviate mail esterne per conferma che il processo sia stato eseguito con successo.

IL RECOVERY  PARTE ANCHE SE LO STORAGE NETAPP DS_NFSH1 NON RISULTA CORRETTAMENTE MONTATO SUL VCENTER PRIMARIO: ci basiamo solo sul ping poiché per qualche motivo ci portebbe essere un blocco di VM1 non legato ad eventi esterni, ma al suo sitema operativo.

FINALITA’

La finalità è quella di non trovarci nella situazione in cui se il sito di DR dove risiede VM1 và giù o la macchina stessa per motivi diversi non risulti raggiungibile non disponiamo di macchine di monitoraggio che ci avvisino di eventuali allarmi (UPS, APC, LAME, RETE, ETC…)

CONSIDERAZIONI

 

Un punto debole potrebbe essere quello in cui ad un certo punto entrambe le macchine siano attive e raggiungibili: questo viene evitato dal fatto che lo script di controllo se il ping fallisce controlla lo stato della macchina VM1 sul sito DR: se risulta Powered On (accesa), la spenge per sicurezza tentanto uno shutdown e dopo 60 secondi, se ancora accesa effettua il power off.

Vengono inviate mail esterne per comunicare il power off.

Inoltre lo script di controllo che gira ogni 10 minuti spenge a priori con la stessa procedura descritta VM1 sul sito di DR anche nel caso ad un certo punto per motivi imprevisti risultino entrambi accesi (ad esempio il sito DR viene riacceso e le macchine risalgono)…in questo caso è possibile che per massimo 10 minuti siano accesi entrambi con lo stesso ip.


SUL VCENTER PRIMARIO

A pranzo ad esempio il task di copia e sovrascrittura:

C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe -STA -WindowStyle Hidden C:\HA\Cluster_VM1_copy.ps1

Ogni 10 minuti ad esempio il task di controllo:

C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe -STA -WindowStyle Hidden C:\HA\Cluster_VM1_monitor.ps1

Il primo task Cluster_VM_copy.ps1 sarà fatto così:


Add-PSSnapin VMware.VimAutomation.Core
Connect-VIServer -server vcenter -User user1 -Password "psw"
$check = Get-VM VM1
$ds = Get-Datastore -Name "DS_NFSH1"
$SmtpClient = new-object system.net.mail.smtpClient
$SmtpServer = "mail.server.it"
$SmtpClient.host =
$SmtpServer
$From = "monitor@server.it"
$To = "sys@server.it,sys1@server.it"
if ($check.Name -eq "VM1")
{
$Title = "ATTENZIONE! SINCRONIZZAZIONE VM ODIERNA NON POSSIBILE"
$Body = "SINCRONIZZAZIONE ODIERNA DA SITO DR A SITO PRIMARIO NON POSSIBILE PER VM1 PERCHE' LA MACCHINA E' GIA' REGISTRATA SU VCENTER PRIMARIO"
$SmtpClient.Send($from,$to,$title,$Body)
}
elseif ($ds.Name -eq "DS_NFSH1")
{
$Title = "SINCRONIZZAZIONE VM ODIERNA INIZIATA"
$Body = "SINCRONIZZAZIONE ODIERNA DA SITO DR A SITO PRIMARIO INIZIATA PER VM1"
$SmtpClient.Send($from,$to,$title,$Body)
sleep 3
copy "vmstore:\DATACENTER ESX\DS_NFSH1\.snapshot\hourly.1\VM1\VM1\*" -Destination "vmstore:\DATACENTER ESX\DS_NFSH2\VM1\" -force -verbose
sleep 3
$Title = "SINCRONIZZAZIONE VM1 ODIERNA TERMINATA"
$Body = "SINCRONIZZAZIONE ODIERNA DA SITO DR A SITO PRIMARIO TERMINATA PER VM1"
$SmtpClient.Send($from,$to,$title,$Body)
}
else
{
$Title = "ATTENZIONE! SINCRONIZZAZIONE VM1 NON RIUSCITA!"
$Body = "SINCRONIZZAZIONE DA SITO DR A SITO PRIMARIO NON RIUSCITA PER SFITMONITORING POICHE' NON E'MONTATO DS_NFSH1 SU VCENTER PRIMARIO"
$SmtpClient.Send($from,$to,$title,$Body)
}
Disconnect-VIServer -server vcenter -Confirm:$false

Il secondo task Cluster_VM1_monitor.ps1 sarà invece così:


Add-PSSnapin VMware.VimAutomation.Core
$SmtpClient = new-object system.net.mail.smtpClient
$SmtpServer = "mail.server.it"
$SmtpClient.host =
$SmtpServer
$From = "monitor@server.it"
$To = "sys@server.it,sys1@server.it"
$ip1 = "10.0.0.50"
$vm1 = "VM1"
$ESX = "blesxi.domain.local"
$tentativi = 1,2,3,4,5,6,7,8,9,10
$result = "KO"
Connect-VIServer -server vcenter -User USER1 -Password "psw"
$power1 = Get-VM $
Disconnect-VIServer -server vcenter -Confirm:$false
Connect-VIServer -server vcenterdr -User USER1 -Password "psw"
$power2 = Get-VM $
if (($power1.PowerState -eq "PoweredOn") -and ($power2.PowerState -eq "PoweredOn"))
{Shutdown-VMGuest -VM $ -Confirm:$false
sleep 80
if ($power2.PowerState -eq "PoweredOn")
{Stop-VM $ -Confirm:$false
$Title = "ATTENZIONE! SPENTO BRUTALMENTE $($ ) - $($ip1) SU DR SITE PERCHE' RISULTA ACCESO SU PRIMARY SITE"
$Body = "$($ ) - $($ip1) RISULTAVA RISULTAVA ACCESO SU PRIMARY SITE E NON HA RISPOSTO ALLO SHUTDOWN, EFFETTUATO POWEROFF SU DR SITE"
$SmtpClient.Send($from,$to,$title,$Body)
}
}
Disconnect-VIServer -server vcenterdr -Confirm:$false
foreach ($tentativo in $tentativi)
{
$pings = ping -n 1 $ip1
sleep 1
foreach ($ping in $pings){
Write-Host $ping
if ($ping -notmatch "TTL=63")
{Write-Host $ " non risponde al ping ("$ip1")"}
else
{Write-Host $ " OK ("$ip1")"
$result = "OK"}
}
}
if ($result -eq "KO")
{
Write-Host $ " CONNESSIONE KO, INIZIO RECOVERY SU SITO PRIMARIO ("$ip1")"
$Title = "ATTENZIONE!CONNESSIONE A SITO DR KO, INIZIO RECOVERY SU SITO PRIMARIO DI $($ ) - $($ip1)"
$Body = "INIZIATA PROCEDURA PER METTERE ONLINE $($ ) - $($ip1) SU SITO PRIMARIO"
$SmtpClient.Send($from,$to,$title,$Body)
Connect-VIServer -server vcenterdr -User USER1 -Password "psw"
$power = Get-VM $
if ($power.PowerState -eq "PoweredOn")
{Shutdown-VMGuest -VM $ -Confirm:$false}
sleep 80
if ($power.PowerState -eq "PoweredOn")
{Stop-VM $ -Confirm:$false
$Title = "ATTENZIONE! SPENTO BRUTALMENTE $($ ) - $($ip1) SU DR SITE"
$Body = "$($ ) - $($ip1) RISULTAVA ACCESO MA NON PINGABILE E NON HA RISPOSTO ALLO SHUTDOWN, EFFETTUATO POWEROFF SU DR SITE"
$SmtpClient.Send($from,$to,$title,$Body)
}
Disconnect-VIServer -server vcenterdr -Confirm:$false
Connect-VIServer -server vcenter -User USER1 -Password "psw"
New-VM -VMhost $ESX -VMFilePath "[DS_NFSH3_LOW02] $($ )_bkup/$($ ).vmx"
Get-VM -Name $ | Get-NetworkAdapter | where {$_.Name -eq "Network adapter 1"} | Set-NetworkAdapter -NetworkName Lan_centrale -Confirm:$false
sleep -Seconds:3
Move-VM $ -Destination (Get-ResourcePool -Name "
VM1 -recovery")
Get-CDDrive $ | Set-CDDrive -StartConnected:$false -Confirm:$false
Get-FloppyDrive $ | Set-FloppyDrive -StartConnected:$false -Verbose -Confirm:$false
Start-VM $ -Confirm:$false -Verbose
sleep -Seconds:10
Get-VM $ | Get-View | %{if ($_.Runtime.Question -ne $null){$_.AnswerVM($_.Runtime.Question.Id,2)}}
$Title = "ATTENZIONE!CONNESSIONE A SITO DR KO, FINE RECOVERY SU SITO PRIMARIO DI $($ ) - $($ip1)"
$Body = "TERMINATA PROCEDURA PER METTERE ONLINE $($ ) - $($ip1) SU SITO PRIMARIO, VERIFICARE CHE IL MONITORAGGIO SIA DI NUOVO ATTIVO"
$SmtpClient.Send($from,$to,$title,$Body)
}
else
{Write-Host $ " CONNESSIONE OK ("$ip1")"}
Disconnect-VIServer -server vcenter -Confirm:$false

Annunci