Per fare la differenza nel mercato competitivo odierno, avere un servizio sempre disponibile<\/strong> \u00e8 un aspetto imprescindibile.\u00a0<\/p>\n\n\n\n
Mentre progettare infrastrutture in alta affidabilit\u00e0 \u00e8 ormai una best practice, l\u2019approccio Multi-Region resta una strada relativamente poco battuta a causa di alcune complessit\u00e0 che la sua implementazione comporta.<\/p>\n\n\n\n
Una strategia mutli-region richiede una pianificazione attenta che deve tenerer conto di moltissimi fattori. Lo scenario si complica ulteriormente nel caso di progetti data-driven in cui bisogna prestare particolare attenzione anche a tutti gli aspetti infrastrutturali legati al dato: dal trasferimento, alla gestione, fino all\u2019archivio e all\u2019integrit\u00e0 delle informazioni.<\/p>\n\n\n\n
I vantaggi offerti da un approccio multi-region sono moltissimi: distribuendo i dati su diverse posizioni geografiche le applicazioni possono resistere a interruzioni a livello di Region assicurando cos\u00ec integrit\u00e0 del servizio e continuit\u00e0 operativa<\/strong>.\u00a0<\/p>\n\n\n\n
Ma non solo: i benefici vanno oltre alta disponibilit\u00e0, RTO\/RPO e resielineza: progettare in Multi-region permette di supportare anche la scalabilit\u00e0 globale<\/strong>, consentendo alle applicazioni di servire una base di utenti mondiale con latenza ridotta e prestazioni superiori.<\/p>\n\n\n\n
In questo articolo, forniremo una panoramica completa su questo approccio: partiremo dai PRO e i CONTRO di questa strategia e daremo uno sguardo agli aspetti da curare durante l’implementazione, con particolare attenzione ai database e, in generale, a tutti gli aspetti legati al dato.\u00a0<\/p>\n\n\n\n
Cominciamo!<\/p>\n\n\n\n
Tipicamente, quando iniziamo un nuovo progetto, cerchiamo di utilizzare solo servizi serverless o gestiti (come AWS Lambda, Amazon APIGateway, Amazon DynamoDB, Amazon Cognito, Amazon SQS e tutti i numerosi servizi gestiti di AWS) pensando di ottenere automaticamente tolleranza ai guasti e alta disponibilit\u00e0.<\/p>\n\n\n\n
E questo \u00e8 vero; utilizzare servizi serverless ci consente di sfruttare tutte le zone di disponibilit\u00e0 in una regione, rendendo la nostra applicazione resistente ai fallimenti dei singoli data center.<\/p>\n\n\n\n
Ma cosa succede se un’intera regione o, pi\u00f9 realisticamente, un servizio in tutta la regione, smette di funzionare?<\/p>\n\n\n\n
Come possiamo vedere da questo sito<\/a> che registra tutte le interruzioni dei servizi AWS<\/strong> negli ultimi anni, i fallimenti di una regione<\/strong>, sebbene molto rari, possono accadere.<\/p>\n\n\n\n
E per quanto riguarda il logging e il monitoring<\/strong>? <\/p>\n\n\n\n
Come per ogni soluzione, ci sono pro e contro da considerare prima di scegliere ci\u00f2 che \u00e8 appropriato per la nostra applicazione. Quindi non perdiamo tempo e iniziamo ad analizzare tutti i vantaggi e gli svantaggi della soluzione Multi-Region – Active \/ Active.<\/p>\n\n\n\n
PRO:<\/strong><\/p>\n\n\n\n
CONTRO:<\/strong><\/p>\n\n\n\n
Ora che abbiamo visto alcuni pro e contro della soluzione multi-region, andiamo ad approfondire il cuore di questo articolo.<\/p>\n\n\n\n
Immaginiamo una semplice applicazione in cui dobbiamo gestire delle API CRUD con paradigma REST. Avremo un database con alcune tabelle e un layer API che ci consente di creare, aggiornare, eliminare e ottenere tutti i dati da quelle tabelle.<\/p>\n\n\n\n
Una possibile infrastruttura per questo tipo di applicazione \u00e8 la classica API Gateway \/ Lambda Function per esporre le API e DynamoDB o RDS Aurora per la parte di database.<\/p>\n\n\n\n
Ora che abbiamo definito la nostra infrastruttura di base mono-region, possiamo iniziare a pensare a come riprogettarla nel paradigma multi-region. Per i componenti Amazon APIGateway e AWS Lambda, non ci sono particolari considerazioni. Possiamo semplicemente distribuirli in tutte le regioni scelte.<\/p>\n\n\n\n
Il primo oggetto che merita qualche considerazione, quindi, \u00e8 il nostro database<\/strong>. Per evitare fastidiosi problemi di sistema come gli scenari di split-brain, dobbiamo renderlo globalmente distribuito<\/strong> in tutte le regioni senza compromettere la struttura dei dati. Per questo, il cloud AWS ci viene in aiuto, mettendo a nostra disposizione diverse soluzioni<\/strong> in base al servizio che stiamo utilizzando.<\/p>\n\n\n\n
Una delle migliori soluzioni \u00e8 Amazon DynamoDB. <\/p>\n\n\n\n
AWS ha creato una configurazione perfetta di DynamoDB che ci permette di distribuire la stessa tabella in diverse regioni in modo multi-master chiamato DynamoDB Global Tables<\/strong>. Grazie a questo, l’applicazione pu\u00f2 leggere e scrivere dati nella tabella regionale, la quale verr\u00e1 replicata automaticamente in tutte le regioni configurate. \u00c8 importante ricordare che se diverse istanze scrivono lo stesso record in regioni diverse e nello stesso istante di tempo, AWS utilizza un meccanismo di riconciliazione last-writer-wins<\/strong> per salvare e replicare gli aggiornamenti concorrenti<\/strong>. Un’altra cosa da sapere \u00e8 che le scritture transazionali funzionano all’interno della regione e non a livello globale. Il record viene replicato nelle altre regioni solo quando viene salvato nella regione corrente. Quindi, prestate attenzione a questi limiti durante lo sviluppo della vostra applicazione.<\/p>\n\n\n\n
Ma cosa succede se abbiamo bisogno di database relazionali <\/strong>tradizionali o di altri tipi di database? Fortunatamente, AWS ha creato configurazioni globali per alcuni dei suoi servizi di database, tra cui AWS RDS Aurora e AWS ElastiCache. Ma sono un po’ diversi dalla soluzione DynamoDB. Sfortunatamente, non sono in una configurazione multi-master, consistono, invece, in un’istanza master attiva in una regione scelta e diverse istanze di replica<\/strong> (in sola lettura) in tutte le altre regioni. In caso di guasti regionali, AWS promuove automaticamente una delle repliche a nodo principale entro pochi minuti. Per soluzioni relazionali multi-region active-active \u00e8 necessaria una progettazione pi\u00f9 complessa, ma oggi ci accontenteremo solo delle configurazioni active-passive.<\/p>\n\n\n\n
Con questa soluzione, abbiamo trasformato il nostro database deployato in una singola regione in un database globalmente distribuito che ci permette di salvare e leggere i nostri dati in diverse regioni.<\/p>\n\n\n\n
Ora dobbiamo solo instradare il traffico verso la nostra infrastruttura multi-region, e per questo sono necessarie ulteriori considerazioni.<\/p>\n\n\n\n
E i dati che non sono memorizzati nel database?<\/p>\n\n\n\n
Uno dei metodi di archiviazione dati pi\u00f9 comuni \u00e8 sicuramente quello basato su Amazon S3.<\/p>\n\n\n\n
Grazie alla funzionalit\u00e0 Amazon S3 Cross Region Replication (CRR) replicare e sincronizzare i dati su S3 \u00e8 molto semplice.<\/p>\n\n\n\n
CRR copia asincronamente ogni oggetto in uno o pi\u00f9 bucket di destinazione in diverse Region di AWS. Il processo di replica include non solo l’oggetto stesso, ma anche i suoi metadati e le access control list conservando le propriet\u00e0 originali dell’oggetto.<\/p>\n\n\n\n
Similmente all’approccio con i database relazionali, anche questo \u00e8 un sistema di replica primary – standby, quindi con un bucket primario che viene replicato tra le regioni. Sfortunatamente, l’aggiornamento delle repliche non propaga le modifiche agli altri bucket.<\/p>\n\n\n\n
Con questa configurazione possiamo trasformare il nostro database single-region in uno distribuito a livello globale <\/p>\n\n\n\n
A questo punto, non ci resta che instradare il traffico verso la nostra infrastruttura multi-region. A questo proposito, vanno fatte ulteriori considerazioni.<\/p>\n\n\n\n
Possiamo usare diverse soluzioni. La scelta dipende dagli obiettivi. <\/p>\n\n\n\n
La prima domanda a cui dobbiamo rispondere \u00e8: Come vogliamo dividere il traffico nelle regioni configurate? Vogliamo dividere il traffico in base al volume? Prossimit\u00e0 dell’utente? Latenza dell’utente? Disponibilit\u00e0 del servizio? <\/p>\n\n\n\n
Approfondiamo alcune di queste soluzioni.<\/p>\n\n\n\n
La soluzione pi\u00f9 semplice \u00e8 dividere il traffico bilanciandolo su tutte le regioni disponibili utilizzando i record di tipo weighted<\/strong>. Questo ci permetter\u00e1 di avere circa lo stesso traffico in entrata<\/strong> su tutte le regioni. <\/p>\n\n\n\n
Supponiamo di aver configurato tre regioni per la nostra applicazione. Possiamo creare tre diversi record di tipo weighted (uno per ciascuna regione) con un peso di 85 (255 come peso massimo diviso sulle 3 regioni). Con questa configurazione, Route53 bilancer\u00e0<\/strong> automaticamente il traffico in entrata nelle tre regioni.<\/p>\n\n\n\n
<\/p>\n\n\n