Per un responsabile della data protection, VSS è probabilmente una delle migliori funzioni che Microsoft ha introdotto negli ultimi 10 anni. A partire dalla sua introduzione questa funzione del sistema operativo ha consentito negli anni di realizzare backup consistenti degli applicativi, ma soprattutto di non dover più ricorrere a numerosi agenti specializzati per i singoli applicativi: è sufficiente che un programma sia compatibile con VSS, e un programma di backup può genericamente invocare le librerie VSS del sistema operativo, le quali dialogheranno con i vari applicativi registrati in VSS appunto.
Esistono oggigiorno numerosi applicativi compatibili con VSS, ovviamente tutti quelli Microsoft (Exchange, SQL, e anche Active Directory ad esempio), ma anche programmi di terze parti con ad esempio Oracle DB (a partire dalla versione 11g).
Purtroppo, esistono anche numerosi applicativi che dopo 10 anni appunto, ancora non supportano le librerie VSS. Nel mio caso specifico, ho dovuto realizzare un backup applicativo di Lotus Dominio, che non supporta VSS. Questo articolo quindi ha un doppio scopo: mostrarvi come si realizza il backup “application-aware” di Lotus Domino, e più in generale come si possono utilizzare i VMware Tools per aggirare in parte la mancanza del supporto VSS.
Innanzitutto, come indicato implicitamente nel titolo e nella precedente frase, la virtual machine di cui dobbiamo realizzare il backup deve avere i VMware tools installati e in esecuzione. I tools permettono al programma di backup di invocare due script, detti genericamente pre-freeze e post-thaw, tramite i quali è possibile compiere alcune operazioni rispettivamente prima e dopo l’esecuzione della snapshot da parte di vSphere. In questo modo, si può fare in modo che l’applicativo non compatibile con VSS venga messo in uno stato “quieto” senza dati pendenti, e in questo modo garantirne la consistenza.
Verificato il prerequisito dei tools, dovremo creare la nuova directory C:\Program Files\VMware\VMware Tools\backupscripts.d\. Se è già presente, è possibile che sia stata creata precedentemente da qualche agent di backup installato.
In questa directory, è possibile tecnicamente creare un unico script contenente tutti i comandi necessari. Io per comodità ho sempre lavorato in modo diverso: creo uno script generico, che chiamo master.bat, che contiene i puntatori per eseguire i due script finali di pre-freeze e post-thaw. Ecco il suo codice:
@echo off if "%1" == "freeze" goto dofreeze goto dothaw :dofreeze call c:\scripts\pre-freeze.bat goto EOF :dothaw call c:\scripts\post-thaw.bat :EOF
In questo modo, la parte di invocazione degli script è ultimata, ed è possibile testare i vari comandi pre e post job editando i due script specifici, migliorandoli e correggendoli dopo ogni prova. Mi è sempre sembrato un modo più pulito di gestire la quiescenza realizzata con i VMware Tools, ma ovviamente non è una regola assoluta.
Terminata la parte generale, veniamo ai due script. In molti casi, la quiescenza di un applicativo purtroppo deve essere realizzata arrestandolo completamente e riavviandolo dopo la snapshot, e Lotus Domino non fa differenza. Troverete pertanto in rete molti esempi in cui i due script non contengono altro che “net stop servizio” e “net start servizio”. Nel caso di Lotus Dominio, lo script di pre-freeze è più complesso dato che dopo aver arrestato il servizio verifica che non vi siano più processi attivi, e nel caso procede al loro arresto forzato. Ecco il codice:
pre-freeze.bat
Net Time \\%computername% >> C:\scripts\logs\freeze.log rem *************************************** rem creates and inventory of all running Domino processes rem *************************************** pslist | findstr /I /C:"nadminp" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"naldaemn" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"namgr" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"ncalconn" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"ncatalog" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nchronos" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"ncollect" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"ncompact" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nconvert" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"ndesign" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"ndircat" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"ndrt" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"ndsmgr" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nevent" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nfixup" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nhttp" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nhttpcgi" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nimap" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nimsgcnv" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nisesctl" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"niseshlr" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nldap" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nlivecs" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nlnotes" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nlogin" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nmtc" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nnntp" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nnsadmin" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nnotesmm" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nobject" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nomsgcnv" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nosesctl" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"noseshlr" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"notes" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"npop3c" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"npop3" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nreport" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nrouter" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nreplica" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nsapdmn" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nsmtpmta" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nsmtp" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nstatlog" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nstaddin" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nstats" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nsched" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nservice" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nserver" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"ntaskldr" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"ntsvinst" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nupdate" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nupdall" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nwrdaemn" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nweb" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nxpcdmn" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nccmta" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"ncctctl" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nccmctl" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nccttcp" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nccbctl" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nccmin" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nccmout" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nccdctl" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nccdin" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"nccdout" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"ngdsscan" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"ngsscan" >>C:\scripts\logs\pid.lst pslist | findstr /I /C:"ngstmgr" >>C:\scripts\logs\pid.lst rem *************************************** rem Stops Dominio daemon in a controller fashion rem *************************************** net stop "Lotus Domino Server (LotusDominoData)" rem *************************************** rem Wait a fair amount of time for processes to stop rem *************************************** Sleep 300 rem *************************************** rem If some Domino processes are hanged, it kills all of them rem *************************************** for /f "tokens=2" %%I in (C:\scripts\logs\pid.lst ) do pskill %%I Net Time \\%computername% >> C:\scripts\logs\freeze.log
Per verificare che lo script abbia fatto il suo dovere, scriviamo nel file freeze.log la data di esecuzione. L’unico parametro da variare è il tempo di Sleep: nell’esempio è impostato a 5 minuti, e potrebbe essere necessario aumentarlo in presenza di server di grandi dimensioni o particolarmente lenti.
Lo script di riavvio è ovviamente molto più semplice:
post-thaw.bat
net start "Lotus Domino Server (LotusDominodata)"
I due comandi vengono automaticamente invocati dai VMware tools in fase di creazione della snapshot della virtual machine, specificatamente prima e dopo la realizzazione della stessa. In questo modo, l’applicativo è fermo mentre la virtual machine viene congelata, e i suoi dati sono quindi consistenti. Il fermo può durare alcuni secondi o diversi minuti, in dipendenza di quali attività prevede lo script e dalla velocità dell’infrastruttura vSphere che ospita la virtual machine stessa. Bisogna quindi pianificare bene “quando” realizzare questo tipo di backup, perchè arrestando i servizi si crea un disservizio agli utenti.
Per testare lo script, è sufficiente realizzare una snapshot da vCenter scegliendo di utilizzare appunto la quiescence tramite VMware Tools. Noterete che l’esecuzione della snapshot, che solitamente impiegherebbe pochi secondi, in questo caso impiega molto più tempo, appunto per il tempo necessario ad eseguire lo script. Questo invece è lo stesso fenomeno visto dall’interno di un software di backup come Veeam.