I log e le unità dati hanno diversi modelli di accesso ai dati che sono in conflitto tra loro (almeno in teoria) quando condividono un'unità.
Scrive log
L'accesso al registro è costituito da un numero molto elevato di piccole scritture sequenziali. Un po 'semplicisticamente, i registri DB sono buffer di anello contenenti un elenco di istruzioni per scrivere elementi di dati in posizioni particolari sul disco. Il modello di accesso è costituito da un gran numero di piccole scritture sequenziali che devono essere garantite per il completamento, quindi vengono scritte su disco.
Idealmente, i registri dovrebbero essere su un volume RAID-1 o RAID-10 silenzioso (cioè non condiviso con nient'altro). Logicamente, è possibile visualizzare il processo come DBMS principale che scrive le voci di registro e uno o più thread del lettore di registri che consumano i registri e scrivono le modifiche sui dischi di dati (in pratica, il processo è ottimizzato in modo che le scritture dei dati vengano scritte immediatamente fuori dove possibile). Se c'è altro traffico sui dischi di registro, le testine vengono spostate da questi altri accessi e le scritture sequenziali del registro diventano scritture casuali. Questi sono molto più lenti, quindi i dischi di log occupati possono creare un hotspot che funge da collo di bottiglia sull'intero sistema.
Scrittura dati
(aggiornato) Le scritture del registro devono essere impegnate sul disco (indicato come supporto stabile) affinché una transazione sia valida e idonea al commit. È logicamente possibile visualizzarlo come voci di registro in fase di scrittura e quindi utilizzate come istruzioni per scrivere pagine di dati sul disco mediante un processo asincrono. In pratica, le scritture della pagina del disco vengono effettivamente preparate e memorizzate nel buffer al momento dell'inserimento della voce di registro, ma non è necessario che vengano scritte immediatamente per il commit della transazione. I buffer del disco vengono scritti su supporti stabili (disco) dal processo Lazy Writer (grazie a Paul Randal per averlo segnalato) di cui questo articolo Technet discute in modo un po 'più dettagliato.
Questo è un modello di accesso fortemente casuale, quindi condividere gli stessi dischi fisici con i log può creare un collo di bottiglia artificiale sulle prestazioni del sistema. Le voci del registro devono essere scritte per il commit della transazione, quindi avere ricerche casuali che rallentano questo processo (l'I / O casuale è molto più lento dell'I / O sequenziale del registro) trasformerà il registro da un sequenital in un dispositivo ad accesso casuale. Ciò crea un grave collo di bottiglia nelle prestazioni di un sistema occupato e dovrebbe essere evitato. Lo stesso vale quando si condividono aree temporanee con volumi di registro.
Il ruolo della memorizzazione nella cache
I controller SAN tendono ad avere cache RAM di grandi dimensioni, che possono assorbire il traffico ad accesso casuale in una certa misura. Tuttavia, per integrità transazionale è auspicabile che le scritture su disco da un DBMS siano completate. Quando un controller è impostato per utilizzare la memorizzazione nella cache write-back, i blocchi sporchi vengono memorizzati nella cache e la chiamata I / O viene segnalata come completa all'host.
Questo può risolvere molti problemi di contesa poiché la cache può assorbire molti I / O che altrimenti andrebbero sul disco fisico. Può anche ottimizzare le letture e le scritture di parità per RAID-5, riducendo l'effetto sulle prestazioni dei volumi RAID-5.
Queste sono le caratteristiche che guidano la scuola di pensiero "Lascia che la SAN lo affronti", sebbene questa visione abbia alcune limitazioni:
La memorizzazione nella cache di write-back ha ancora modalità di errore che possono perdere dati e il controller si è bloccato sul DBMS, dicendo che i blocchi sono stati scritti su disco dove in realtà non lo sono. Per questo motivo, potresti non voler utilizzare la memorizzazione nella cache del write-back per un'applicazione transazionale, in particolare qualcosa che contiene dati mission-critical o finanziari in cui i problemi di integrità dei dati potrebbero avere gravi conseguenze per l'azienda.
SQL Server (in particolare) utilizza l'I / O in una modalità in cui un flag (chiamato FUA o Accesso di aggiornamento forzato) forza le scritture fisiche sul disco prima che la chiamata ritorni. Microsoft ha un programma di certificazione e molti fornitori di SAN producono hardware che onora queste semantiche (requisiti riassunti qui ). In questo caso, nessuna quantità di cache ottimizzerà le scritture su disco, il che significa che il traffico dei registri si bloccherà se si trova su un volume condiviso occupato.
Se l'applicazione genera molto traffico su disco, il suo set di lavoro potrebbe sovraccaricare la cache, causando anche problemi di conflitto di scrittura.
Se la SAN è condivisa con altre applicazioni (in particolare sullo stesso volume del disco), il traffico proveniente da altre applicazioni può generare colli di bottiglia nel registro.
Alcune applicazioni (ad es. Data warehouse) generano picchi di carico transitorio di grandi dimensioni che li rendono piuttosto anti-social sulle SAN.
Anche su una grande SAN volumi di log separati sono ancora raccomandati. Potresti evitare di preoccuparti del layout di un'applicazione leggermente utilizzata. Su applicazioni molto grandi, potresti persino trarre vantaggio da più controller SAN. Oracle pubblica una serie di case study sul layout del data warehouse in cui alcune delle configurazioni più grandi coinvolgono più controller.
Metti la responsabilità delle prestazioni a cui appartiene
Su qualcosa con grandi volumi o in cui le prestazioni potrebbero essere un problema, rendere responsabile il team SAN per le prestazioni dell'applicazione. Se ignoreranno i tuoi consigli per la configurazione, assicurati che la direzione sia consapevole di ciò e che la responsabilità delle prestazioni del sistema sia nel posto giusto. In particolare, stabilire linee guida accettabili per le statistiche chiave sulle prestazioni dei DB come attese di I / O o attese di blocco della pagina o SLA di I / O applicativi accettabili.
Si noti che avere la responsabilità della suddivisione delle prestazioni tra più team crea un incentivo a puntare il dito e passare il dollaro all'altra squadra. Questo è un anti-modello di gestione noto e una formula per problemi che si trascinano per mesi o anni senza mai essere risolti. Idealmente, dovrebbe esistere un unico architetto con l'autorità per specificare le modifiche alla configurazione dell'applicazione, del database e della SAN.
Inoltre, confronta il sistema sotto carico. Se riesci a organizzarlo, i server di seconda mano e gli array ad attacco diretto possono essere acquistati in modo abbastanza economico su Ebay. Se si imposta una casella come questa con uno o due array di dischi, è possibile utilizzare la configurazione del disco fisico e misurare l'effetto sulle prestazioni.
Ad esempio, ho fatto un confronto tra un'applicazione in esecuzione su una SAN di grandi dimensioni (uno squalo IBM) e una scatola a due socket con un array U320 a collegamento diretto. In questo caso, £ 3.000 di hardware acquistato da ebay hanno sovraperformato una SAN di fascia alta £ 1M di un fattore due - su un host con una configurazione di CPU e memoria approssimativamente equivalente.
Da questo particolare incidente, si potrebbe sostenere che avere qualcosa del genere in giro è un ottimo modo per mantenere onesti gli amministratori SAN.