Le sfide
Sono consapevole che esistono pratiche come l'aggiunta di soli oggetti di database, ovvero tabelle e colonne, senza mai modificarli o rimuoverli
In un'azienda per cui ho lavorato, una finestra mobile di dati grezzi equivaleva a circa 6 mesi e ha consumato fino a 10 TB. I dati sono stati quindi elaborati in un formato RDBMS che costava 6 TB di dati utilizzabili che rappresentavano circa 10 anni di dati da segnalare. Il punto è che su larga scala, questo tipo di pratiche non sono semplicemente pratiche. Lo spazio di archiviazione è costoso - probabilmente la più grande spesa di calcolo. Ciò offre diverse sfide interessanti:
- Backup : i plugin innodb sono fantastici e tutti, ma i tempi di backup su così tanti dati non sono poi così pratici
- Tempi di ripristino - per set di dati di grandi dimensioni - soprattutto se è necessario eseguire la replica per recuperare dopo che un ripristino per tornare a uno stato operativo può richiedere giorni o addirittura settimane
- Creazione / seeding di nuove istanze : spesso il lavoro che si sta svolgendo in sviluppo / test comporta processi ETL (Estrai, Trasforma e Carica) nel set di dati. Questi devono essere convalidati utilizzando le unità di test QA, ma ciò deve essere fatto in modo non distruttivo in modo da preservare il set di dati di produzione originale. Durante un disastro, potresti essere disposto a gestire un lungo periodo di ripristino sulla comprensione del fatto che i backup sono una polizza assicurativa e l'intenzione è di evitarli, il flusso di lavoro di sviluppo DevOps richiede che, essenzialmente, tu sia in grado di eseguire un ripristino o copia dei dati su base regolare (forse più volte al giorno)
- Capacità : la gestione di molti dati sulla scala appena descritta può richiedere molto I / O. Non solo devi affrontare i problemi descritti in 1-3, ma devi farlo in un modo che non causi interruzioni o rallentamenti delle prestazioni dei tuoi sistemi di produzione.
Mentre le considerazioni di cui sopra potrebbero non essere una preoccupazione su scale più piccole, su scale più grandi, questi diventano enormi problemi. Ciò significa che è estremamente importante definire i requisiti e prevedere le dimensioni del set di dati.
Definizione dei requisiti
Di conseguenza, è necessario definire diversi requisiti:
- RTO - RTO o Restore Time Objective per i backup sono uno dei driver più importanti delle soluzioni di backup del database. Mentre all'inizio potrebbe non sembrare pertinente per la maggior parte degli altri problemi, diventa estremamente rilevante quando mi chiedi "Cosa succede se ho usato la mia soluzione di backup per creare o eseguire il seeding di nuove istanze?". Tratterò alcune tecniche per farlo nella prossima sezione.
- RPO - RPO o Obiettivo punto di ripristino per i backup definisce A) quanto tempo è possibile ripristinare (minuti, ore, giorni, settimane, mesi o anni) B) L'intervallo di backup a diversi livelli e C) con quanta precisione è possibile ripristinare . Ad esempio, per i database di posta elettronica, vengono spesso cercati backup a livello di messaggio - ripristino di una specifica posta elettronica. Allo stesso modo, potresti scoprire che i dati nel giro di pochi giorni sono completamente inutili, quindi non ha senso ripristinare un anno.
- Dimensioni del set di dati : questo è importante perché per un database da 1 MB, l'RTO può essere realizzato con la maggior parte dei prodotti e delle soluzioni di backup. Tuttavia, per un database da 10 TB, scoprirai che un backup completo a livello di riga sul nastro LTO 3 probabilmente non raggiungerà il tuo RTO e potrebbe interferire con il tuo RPO perché i backup iniziano a superare la finestra di backup. Non puoi semplicemente fare un mysqldump su un set di dati così grande, ma probabilmente potresti farcela con questo sul database da 1 MB.
- Coerenza del database - Un'ultima cosa che fa un'enorme differenza nella distribuzione continua, nell'affidabilità del sito, nella scalabilità e nell'alta disponibilità quando si lavora con i database è la necessità (o la mancanza di ciò) di coerenza. Esistono tre tipi di base: coerenza immediata, coerenza Just-In-Time (JIT) ed eventuale coerenza
Oltre alle precedenti considerazioni principali, è necessario considerare anche i requisiti di licenza e supporto (open source o closed source; in house support, supporto di terze parti o supporto del fornitore) requisiti di applicazione / lingua (i connettori per molti database possono essere importanti; è la tua app è compilata? Hai accesso al codice sorgente? Puoi ricompilarlo o è fornito da un fornitore? O funziona in un linguaggio interpretato?) Requisiti politici (La tua organizzazione si fida solo di Oracle? Odiano l'oracolo? ? Non si fidano di MySql? Cosa ne pensi di MariaDB o Postgres?) E del motore di database (innoDB? MyISAM? Blackhole? NDB Cluster? Spider?) E requisiti storici o di compatibilità (abbiamo usato PL / SQL per anni e metà del nostro codice è integrato nel motore Oracle! Come potremmo mai portarci su MariaDB?!?)
Tutte queste cose (significativamente) incidono sugli strumenti a tua disposizione.
Alcune opzioni per la gestione interna dei dati
Nota: quanto segue non è esaustivo e gli altri utenti SE dovrebbero intervenire con ulteriori suggerimenti.
Con le considerazioni generiche fuori mano, lascia che ti fornisca alcune tecniche e tecnologie per affrontare quanto sopra. Innanzitutto, chiediti se hai davvero bisogno di usare un RDBMS o se i dati non strutturati con qualcosa come Hadoop, CouchDB o anche Object Oriented Storage (qualcosa come swift) sono un'opzione.
In secondo luogo, considera la possibilità di esaminare una soluzione basata su cloud. Ciò esternalizza parte di questo mal di testa e lascia i complicati problemi a persone altamente qualificate (e pagate). Su vasta scala, tuttavia, puoi trovare che questo influisce davvero sul tuo budget (i fornitori di servizi cloud ne traggono profitto e, a una certa scala, puoi semplicemente permetterti di impiegare questi esperti tu stesso) o se stai lavorando in sicurezza o politica specifica requisiti (leggi: non possiamo fare cloud) considerare un filer ibrido NFS / FibreChannel. La maggior parte di questi filer, come quelli di NetApp, Pure Storage e Tegile, supporta una tecnica di snapshot e clonazione basata su delta che può essere molto utile per A) eseguire backup, B) Ripristinare backup e C) Effettuare il seeding di nuovi backup.
A questo punto, devo notare che non sono un esperto di backup e archiviazione, quindi ci sono alcune parti di questo problema che non sono mai stato in grado di risolvere prima di passare ad altri problemi (e pascoli più verdi).
Ma questo detto, questi prodotti consentono di scattare istantanee differenziali sotto il vostro databse. Dovrai creare uno script di "tabelle di blocco con blocco di lettura" complete su una delle istanze del tuo database (si consiglia uno slave di sola lettura) e scaricare la posizione binlog o GTID, ma per questi filer, una volta fatto, sarai in grado per utilizzare questi snap per creare nuove istanze del database. Dovrai mettere i binlog su una partizione separata e mettere solo i dati del tuo database su queste partizioni. Una volta fatto, sarai in grado di clonare queste partizioni (su NetApps, questo è noto come " FlexClone "
Questo perché per ogni blocco letto il filer deve determinare se i dati risiedono nell'istantanea originale congelata o nel delta. Per volumi / negozi con più istantanee, potrebbe essere necessario verificarlo più volte. Puoi ovviare a questo aggiornando i dati (ovvero scartando la tua istantanea e clonandola di nuovo periodicamente - cosa che potrebbe accadere in modo naturale e organico per un buon ambiente di distribuzione continua) o dividendo permanentemente il volume (noto come "divisione flessibile" nella terminologia di NetApp ), che richiederà un momento per risolvere definitivamente i delta e creare un volume completamente nuovo e separato.
Questi cloni delta hanno l'ulteriore vantaggio di ridurre i requisiti di archiviazione complessivi: è possibile generare diversi cloni o istanze dei dati del database di produzione per eseguire sviluppo, test e convalida. Se stai conservando solo una copia del tuo set di dati di grandi dimensioni più i piccoli delta (che probabilmente saranno), riduci i costi di archiviazione e il footprint complessivi.
L'unico trucco qui è che questo potrebbe non costituire una soluzione di backup completo poiché il "backup" risiede ancora nel tuo filer. Per questo potrebbe essere necessario utilizzare qualcosa che NetApp chiama Snap Mirror che rispecchierà i dati (utilizzando la tecnologia in stile rsync) tra filer e persino datacenter, oppure utilizzare un tipo di soluzione di backup integrata che può eseguire il backup su nastro di uno dei tuoi snapshot delta o un flex-clone.
Questo ha tuttavia un grosso difetto: tutti i tuoi dati - dev, test e prod stanno ancora usando l'I / O sullo stesso filer e sulla stessa testa di archiviazione. Per ovviare a questo, prendere in considerazione la creazione di un'istanza del database slave su un secondo filer che può essere il punto di seeding per il tuo test e / o dev filer, oppure prendere in considerazione l'utilizzo di un bilanciamento del carico / controller di consegna applcation per il livello dell'applicazione per rispecchiare le richieste di produzione nel ambienti di testing (e / o dev). Ciò ha l'ulteriore vantaggio di lanciare traffico di prodcution nell'ambiente QA / Test prima di promuoverlo alla produzione per problemi che potrebbero non essere immediatamente notati. È quindi possibile verificare la presenza di errori nei registri in base al traffico di produzione e al comportamento dell'utente.
Ciò dovrebbe quindi consentire di utilizzare alcuni script per generare e distruggere programmaticamente interi (e grandi) set di dati da utilizzare con metodologie di distribuzione continua.
Scalabilità e alta disponibilità
Mentre hai chiesto informazioni sulla distribuzione continua, DevOps non si preoccupa solo della distribuzione continua, quindi includerò alcune informazioni su ridondanza, scalabilità e disponibilità elevata.
Ho detto, JIT, coerenza immediata ed eventuale. È qui che entrano in gioco vari motori RDBMS. L'eventuale coerenza è relativamente semplice semplicemente configurando la replica asincrona circolare. Ciò può tuttavia causare alcune collisioni * (cosa succede se il livello dell'applicazione aggiorna i dati su un lato del cluster e sull'altro lato del cluster prima che la replica sia completata?) Per consistenza immediata, guarda il cluster Galera che forza la replica sincrona, ma causa problemi di scalabilità (come eseguirai la replica sul tuo sito di Disaster Recovery o il bilanciamento del carico geograficamente senza incorrere in una latenza significativa a causa del ritardo di propulsione a livello di rete?) Puoi anche vedere se puoi eseguire la replica sincrona all'interno del datacenter e la replica asincrona tra siti, ma questo sembra il peggiore di entrambi i mondi.
In genere, tuttavia, la maggior parte delle persone non ha bisogno di una replica completamente sincrona, di solito è necessaria solo per ambienti molto specifici (ed esotici) a scrittura elevata in cui è necessario il multi-master con lo sharding della tabella. La maggior parte delle app è in grado di gestire la coerenza Just-In-Time utilizzando un proxy del database. Ad esempio, ScaleArc monitorerà lo stato della replica e traccerà dove sono appena state scritte le scritture (per inviare richieste di lettura secondarie fino a quando la replica non raggiunge) per fornire coerenza e aspetto just-in-timedi coerenza del database. ScaleArc è compatibile con Postgres, MySQL, MariaDB, Oracle e MSSQL e può utilizzare espressioni regolari per frammentare / partizionare i database per applicazioni che non possono usare le chiavi shard. Ha anche una robusta API REST per interagire con il tuo software di gestione della configurazione - e il loro team di supporto è eccezionale
Allo stesso modo, potresti prendere in considerazione un'alternativa gratuita, MaxScale sviluppata dal team MariaDB per MariaDB. Manca tuttavia la GUI e alcune delle funzionalità di memorizzazione nella cache di ScaleArc.
Infine, il tessuto MySQL (e il solo cluster MySQL in-RAM - se puoi permetterti così tanta RAM) sono altri potenziali - specialmente con il nuovo proxy MySQL. Ciò può fornire la componente di ridondanza e scalabilità al proprio ambiente.
Postgres e Oracle dovrebbero avere le funzionalità di replica e sharding di cui hai bisogno, ma ScaleArc si accoppierà bene se hai bisogno di un proxy.
In definitiva, tutti questi peices si sommano a un ambiente altamente flessibile adatto alla distribuzione e allo sviluppo continui se non si è in grado di utilizzare semplicemente un ambiente basato su cloud e lasciare che il proprio fornitore di servizi cloud si occupi dei suddetti problemi.