Si legge spesso su internet che eseguire una macchina windows con SQL Server in esecuzione in un ambiente virtualizzato non è sicuro.
La spiegazione principale è che la VM scrive non sul disco direttamente, ma passa le scritture da registrare alla cache del server host. Pertanto, se l’host stesso si spegne improvvisamente non tutte le transazioni vengono registrate e il database risulta corrotto.
Spesso però gli articoli che danno queste motivazioni (come ad esempio questo) non scendono molto nei particolari di quale versione di SQL usano, e soprattutto quale ambiente vmware, se esx, virtual server, o workstation, riducendo il tutto a un generico “vmware”.
Osservando lo schema che viene riportato:
sembra che l’autore stia utilizzando una versione hosted di vmware. E proprio perchè le varie versioni di vmware hanno comportamenti diversi riguardo la cache, è bene chiarire alcuni concetti:
– su hosts linux, vmware usa sempre transazioni IO bufferizzate
– su hosts windows, vmware usa IO di tipo unbuffered
– su hosts mac (ovvero vmware fusion) attualmente vengono usati IO bufferizzati; pare che in una delle prossime versioni si passerà anche su questa piattaforma a transazioni non bufferizzate
Dando per probabile che la versione host di vmware utilizzata sarà stata una qualche versione per windows, come spesso accade a chi deve creare VM windows, vediamo quindi dalla lista che le scritture IO “NON” sono bufferizzate, pertanto è impossibile che una scrittura venga trattenuta nella cache di vmware ma comunicata come avvenuta alla VM.
Ho volutamente ignorato ESX server, dato che qua tutte le scritture sono da sempre unbuffered; ragion per cui non c’è alcuna differenza nell’eseguire SQL server in un ambiente fisico o in uno virtualizzato.
Prenderemo ovviamente le stesse precauzioni, come l’installazione di batterie tampone sui raid, e un’adeguata protezione dell’alimentazione elettrica tramite UPS. Esattamente come in un sistema fisico.