2013-01-21 8 views
7

Non abbiamo alcuna configurazione di integrazione continua (, ancora). Ma voglio distribuire molto frequentemente. Una volta al giorno o giù di lì.Distribuire l'applicazione Django senza interruzione del servizio/senza tempi di inattività

Abbiamo un'applicazione Django piuttosto standard con un server Postgres separato. Utilizziamo le normali macchine virtuali noleggiate (NO Amazon o Rackspace).

Come possiamo ridurre al minimo i tempi di inattività della nostra applicazione? Il migliore sarebbe azzerare i tempi di inattività. Abbiamo pensato a una configurazione con due applicazioni uguali e due server di database e distribuire una coppia di server app/db dopo l'altra.

Il problema è mantenere i dati coerenti. Mentre una coppia di server app/db sta aggiornando la coppia di server con il vecchio codice può servire agli utenti. Ma se gli utenti scrivono sul db perdiamo i dati quando passiamo alla coppia aggiornata. Soprattutto quando spingiamo le migrazioni dello schema.

Come possiamo gestire questo? Questo deve essere un problema molto comune ma non riesco a trovare buone risposte. Come gestisci questo problema?

risposta

1

Nel caso in cui non si hanno le migrazioni di schema, io ti do uno scenario di pratica:

mantenere due versioni di processi Django (A e B), che si controlla con, diciamo, supervisore. Mantieni un processo nginx davanti ai tuoi processi django, che inoltra tutte le richieste a A. Quindi, carichi la versione B sul server, avvia il processo django B con supervisore, quindi modifica il file conf di nginx in modo che punti a B, quindi ricarica la tua processo nginx ..

Nel caso in cui si abbiano migrazioni di schema, le cose si complicano. Le tue opzioni includono:

  • Si potrebbe considerare l'utilizzo di una soluzione NoSQL, come mongoDB (in questo caso è possibile mantenere una singola istanza DB).
  • Provate a registrare manualmente tutte le richieste di scrittura durante il caricamento, in modo da inviarle successivamente al nuovo database.
+2

I upvoted, ma solo perché si dispone di una migrazione dello schema non è un motivo immediato per la migrazione a MongoDB. È sufficiente scrivere le migrazioni di schema in modo da poter eseguire questa operazione: aggiornare lo schema, distribuire la nuova app, aggiornare di nuovo lo schema per aggiungere eventuali vincoli che sarebbero stati incompatibili con la versione precedente dell'app. Ora la tua più grande preoccupazione sarà il blocco: non vuoi che l'app non risponda mentre la tua migrazione è in esecuzione. Fare qualche test di solito ci dice se questo è un problema (la migrazione a lungo termine significa che probabilmente lo sarà). Se è così, è necessaria la replicazione ... –

+0

E poi si dovrebbe prima migrare il non primario, quindi promuoverlo in primario e spingere il vecchio primario in non primario, quindi migrarlo. I dettagli di ciò dipenderanno dalla soluzione di replica, ma dovrebbe essere fattibile. –

+0

Bene noSQL non è un'opzione. Siamo abbastanza felici con Postgres. Potete consigliare una buona soluzione di replica? – j7nn7k

Problemi correlati