Il modo migliore per migrare un enorme database di SQL Server con tempi di inattività ridotti sulla rete


22

Definizione del problema

Il nostro server di database deve essere trasferito su un altro datacenter. Funziona su Microsoft SQL Server 2012 Enterprise (64 bit) e contiene due database di circa 2 TB e 1 TB.

Avere poco o nessun tempo morto per questo sarebbe l'ideale.

Carico di lavoro

Tali database vengono utilizzati per un sito Web .NET e vengono costantemente aggiornati.

Avere non disponibile durante il fine settimana sarebbe accettabile però. Il DB attualmente in uso rimarrà l'unico in uso fino al passaggio al nuovo.

Idealmente, questo passaggio verrebbe effettuato semplicemente modificando le voci DNS in modo che puntino al nuovo server DB assicurandosi che il DB non venga aggiornato.

Inoltre, il tempo impiegato da questa operazione non ha importanza fino a quando il passaggio da un server all'altro (downtime) è ridotto.

Approcci considerati

  • Backup e ripristino

    Ciò è stato fatto in passato ma ha comportato tempi di inattività elevati anche se è stato effettuato attraverso una rete interna, in modo più efficiente rispetto a Internet

  • Log shipping

    Per quanto ho capito, questo approccio minimizzerebbe i tempi di inattività configurando un master / slave e trasferendo una copia esatta del DB master al suo slave in sola lettura. Come accennato in precedenza, non sarebbe necessario l'accesso allo slave e abbiamo solo bisogno di un modo per avere una replica del DB master senza corruzione dei dati.

    Sembra anche essere abbastanza efficiente in termini di utilizzo delle risorse e non influirebbe molto sulle prestazioni principali.

    Potrei sbagliarmi su questo approccio, quindi sentiti libero di correggermi.

  • Mirroring del database

    Non sono troppo consapevole di questo approccio ma sembra un'opzione valida. Non è necessario avere la sincronizzazione in tempo reale e le prestazioni del master sono piuttosto importanti, quindi sarebbe asincrono la strada da percorrere se si dovesse scegliere questo approccio.

  • Altre opzioni?

    Quel server funziona direttamente su hardware bare metal, quindi le soluzioni di livello inferiore non sono purtroppo un'opzione. Forse c'è un modo migliore per farlo?

vincoli

Come descritto, quei database sono abbastanza grandi al punto che sono difficili da mantenere ma questo è un altro problema.

Le versioni di SQL Server saranno le stesse (Microsoft SQL Server 2012 Enterprise 64-bit).

Dovrà essere trasferito in rete tra due datacenter, quindi molto probabilmente su Internet. Sfortunatamente avere dischi inviati da un sito all'altro per una sincronizzazione iniziale non è purtroppo un'opzione. Avere una sorta di sicurezza per il trasferimento sarebbe l'ideale ma faremo il meglio di questa situazione.

Ciò dovrebbe fornire una panoramica abbastanza buona delle nostre esigenze per questo compito e spero che alcuni di voi abbiano dovuto affrontare quella situazione prima.

Risposte:


20

Il backup e il ripristino semplici sono ovviamente fuori. Inoltre non prenderei in considerazione la replica di alcun tipo.

Il mirroring del database è relativamente semplice da configurare, ma richiede la connettività in tempo reale tra i due server, l'impostazione di partner ed endpoint, ecc. I gruppi di disponibilità potrebbero essere un'opzione, ma oltre alle complicazioni di rete è necessario disporre anche di entrambi i server come membri dello stesso WSFC, il che significa che devono trovarsi entrambi nello stesso dominio. Questa non è un'impostazione tipica (o potrebbe persino essere fatta funzionare temporaneamente) per uno spostamento del data center.

Il mio voto sarebbe per la spedizione dei log. La cosa bella di questo è che puoi usare i backup e i backup dei log che stai già eseguendo (giusto?) E non devi necessariamente avere una connettività in tempo reale tra i due database - non hanno bisogno di conoscere ciascuno di essi altro, non è necessario impostare endpoint per mirroring, partner, sicurezza, ecc. È sufficiente un modo per trasferire i file dal vecchio server in un luogo in cui possano essere ripristinati sul nuovo server. È possibile eseguire un backup completo con largo anticipo, trasferirlo sul nuovo server, ripristinarlo, quindi applicare (eventualmente diff e) backup di log incrementali da quel punto fino al momento del cut-over. Il processo è in realtà abbastanza semplice e ci sono molti tutorial sulla spedizione dei log disponibili online se si incontrano difficoltà.

Se l'app Web si sta spostando con il database, poiché la propagazione del DNS può richiedere del tempo, è possibile che si desideri cambiare le stringhe di connessione della vecchia app per farle puntare all'IP del nuovo server di database una volta che è scrivibile , poiché - anche dopo il passaggio e anche se le impostazioni TTL sono rigorose - i client possono continuare a colpire i vecchi server Web. Tutto dipende da quanto rispetto i loro fornitori danno ai tuoi TTL.


16

Di recente ho migrato 15 TB su 6 database utilizzando il mirroring. Molto semplice e perfettamente funzionante con solo un paio di secondi di tempo di failover.

modifiche:

Avevo due nuovi server SQL virtualizzati. I database provenivano da 3 server che avevano appena superato e incidevano sulle prestazioni dei database più piccoli ospitati su di essi.

Il processo è stato molto semplice.

  1. Attendere il completamento dei backup completi del fine settimana
  2. Ripristina senza ripristino su nuovi server
  3. Al termine di tali ripristini, sospendere i backup
  4. Eseguire un ripristino aggiuntivo fino all'ultimo backup del registro dagli originali, senza alcun ripristino
  5. Inizia il mirroring su tutti e sei
  6. Riprendi i backup

Ho scelto di lasciarli in modalità asincrona fino a quando non eravamo pronti a eseguirne il failover per ridurre il carico sulla rete, ecc. Il mirroring ha una certa reputazione per aver causato latenza durante la manutenzione (indice / statistiche) e altre attività ad alto volume, ma non l'ho fatto scopri che è vero. Devono essere passati alla modalità sincrona prima del failover manuale.

Durante la successiva finestra di manutenzione, ho eseguito manualmente il failover di ciascun database e, dopo alcuni test del fumo, ho disattivato il mirroring e infine rimosso i vecchi file di dati dai server di origine. Una stranezza in questo processo è che il fallimento di un database con mirroring lascia il precedente primario in uno stato di recupero, quindi a meno che tu non sia a tuo agio nel rilasciarli, devi riportarli online e quindi staccarli, o qualunque sia il tuo metodo preferito di rimozione è . Inoltre, non ho configurato un testimone per questo perché non volevo il failover automatico. Questo è stato un evento controllato.

Per favore fatemi sapere se desiderate ulteriori dettagli. Ho lasciato fuori le specifiche del server e della rete, ma posso fornire se lo desideri.

Grazie

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.