26

La mia comprensione di Elastic Beanstalk è che quando si distribuisce una nuova versione della propria app, questa viene distribuita alle istanze Amazon EC2 una alla volta (se ne sono presenti più di una). Tuttavia, anche con un minimo di due istanze, la mia applicazione subisce un breve periodo di inattività quando carico un nuovo .war quando lo distribuisce, come se lo stesse aggiornando entrambi contemporaneamente. C'è un modo per garantire che non ci siano tempi di inattività e che un'istanza sia completamente aggiornata e che accetti le richieste prima del prossimo avvio: ecco come appaiono gli eventi. Nota questo è con carico zero sull'app, quindi peggiorerà solo con il traffico di produzione.Come prevenire i tempi di inattività durante l'implementazione di AWS Elastic Beanstalk di una nuova versione dell'app?

INFO 
Environment update completed successfully. 

INFO 
New application version was deployed to running EC2 instances. 

ERROR 
The application did not respond at the health check URL. 

INFO 
Waiting for 8 seconds while EC2 instances download the updated application version. 

INFO 
Deploying version SomethingMore to 2 instance(s). 

risposta

19

Per raggiungere questo obiettivo in Elastic Beanstalk, avrete bisogno di espandere la vostra procedura di distribuzione per facilitare più ambienti (vedi AWS Elastic Beanstalk Components):

Un ambiente è una versione che viene distribuito su AWS risorse. Ogni ambiente esegue solo una versione singola, tuttavia è possibile eseguire la stessa versione o versioni diverse in molti ambienti contemporaneamente. [...] Per ulteriori informazioni sull'ambiente e sulle risorse che sono create, vedere Architectural Overview. [sottolineatura mia]

Questa funzione è utile per il test/debug versioni separate già, ma in particolare ciò consente la sostituzione a caldo di ambienti così, vedere Deploying Versions With Zero Downtime per un rispettivo walkthrough:

Dal AWS Elastic Beanstalk esegue un aggiornamento sul posto quando si aggiornano le versioni dell'applicazione , si verificheranno alcuni tempi di inattività. Tuttavia, è possibile evitare questo tempo di inattività scambiando i CNAME per gli ambienti. Questa sezione illustra come eseguire uno scambio CNAME utilizzando la Console di gestione AWS, l'interfaccia della riga di comando o le API. [sottolineatura mia]

+0

Grazie, lo scambio CNAME dell'ambiente è esattamente quello che stavo cercando. – Peter

+6

L'ho provato sulla mia app di produzione e ho osservato che anche dopo lo scambio di CNAME e l'attesa per la scadenza dei TTL DNS, una parte considerevole del traffico si dirigeva ancora verso il vecchio ambiente beanstalk. Sospetto che ciò sia dovuto al fatto che i client mantengono la cache DNS più a lungo di quanto dovrebbero. Se non si può fare affidamento sui client per obbedire ai TTL, allora questa tecnica di scambio CNAME non sembra essere un modo affidabile per eseguire distribuzioni ZDD con Beanstalk. –

+0

@AaronIba Un'ottima osservazione. Ti è venuto in qualche modo alternativo?Sto pensando di sovrascrivere semplicemente la versione dell'applicazione esistente e di chiudere manualmente le istanze esistenti (ASG dovrebbe incrementare le nuove e tirare la versione dell'applicazione aggiornata). Ma questo è un processo manuale/lento/ingombrante e si sente come un hack. –

6

So che questo è una vecchia questione, ma per le persone googling (come me), Elastic Beanstalk rilasciato rotolamento Versione applicazione implementazioni oggi (2014/11/02).

http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.rolling-version-deploy.html?sc_ichannel=em&sc_icountry=global&sc_icampaigntype=launch&sc_icampaign=em_125873140&sc_idetail=em_14124901705&ref_=pe_411040_125873140_8

Questo consente di aggiornare parte della vostra flotta con la nuova applicazione per volta, assicurando che c'è sempre host disponibili a prendere il traffico.

+0

Funziona solo se stai eseguendo più istanze dietro un load balancer? Da come viene descritto, sembra che una singola istanza continui a cadere. –

+1

Sì, hai bisogno di più di un'istanza nel tuo ambiente Elastic Beanstalk per evitare tempi di inattività. Questo è vero ovunque però; se offri traffico da un host e aggiorni l'host (anche se è sul posto), rischi di interromperti. – zongweil

+0

L'affermazione di cui sopra non è semplicemente vera. Ho eseguito zero downtime su un singolo host con nginx. (Non su beanstalk elastico.) –

Problemi correlati