“We have found that the best defense against major unexpected failures is to fail often”. Questa è la prima frase dell’articolo con cui Cory Bennett e Ariel Tseitlin hanno annunciato il rilascio pubblico da parte di Netflix di Chaos Monkey il 30 Luglio 2012.

Nella vita, così come in ambito lavorativo, un percorso di crescita si basa su azioni andate a buon fine ma anche e soprattutto su errori che portano ad un apprendimento e ad una conoscenza talvolta più profondi.
Le aziende che esprimono la volontà di introdurre l’innovazione nella propria struttura, ad esempio, si trovano inevitabilmente a mettere in discussione basi più o meno solide su cui ha poggiato fino a quel momento l’organizzazione, attraverso un cambiamento culturale che in prima battuta destabilizza e provoca incertezze ma che a lungo andare rende la struttura più solida e forte.
E’ su questo principio che si basa Chaos Monkey, software open source che, terminando secondo una logica del tutto casuale le istanze di produzione, offre la possibilità all’azienda e agli stessi tecnici di scoprire le debolezze del sistema imparando a rafforzarlo, a creare sistemi di recovery automatica e assicurando in questo modo che niente, neanche l’imprevedibile, possa causare un’interruzione del servizio.
Fallire di proposito per migliorare, è questo il motto di Chaos Monkey!

Cos’è Chaos Monkey?chaos_monkey

Chaos Monkey è un software prodotto da Netflix che prende di mira gli Auto Scaling Groups di Amazon Web Service e che, in maniera casuale, termina alcune delle istanze presenti. La sua flessibilità permette di decidere la probabilità di terminazione delle istanze di ogni gruppo ed il range di orari in cui può accadere.

Perché usare Chaos Monkey?

Pensare di eseguire un software che randomicamente termina istanze può sembrare qualcosa di molto azzardato, soprattutto se questo strumento viene utilizzato in un ambiente di produzione, ma dopo alcune analisi è facile capire quale prezioso contributo possa fornire.

Partiamo da un’assunzione: i malfunzionamenti, prima o poi, arriveranno. Anche se le probabilità possono essere basse, ad un certo punto ogni team che lavora con infrastrutture cloud si troverà di fronte ad un server che non risponde, o che per qualche motivo non funziona come dovrebbe, causando (in caso non sia gestito a dovere) un’interruzione del servizio.

Il vantaggio che possiamo avere con Chaos Monkey è quello di poter limitare questi malfunzionamenti ad un periodo della giornata in cui il team è pronto ad intervenire, e soprattutto poter essere a conoscenza di quale istanza è stata terminata. Ad ogni guasto programmato si può analizzare la situazione e vedere se il sistema è riuscito ad adattarsi prontamente, o se nella progettazione non si era tenuto in considerazione l’avverarsi di quella condizione. In questo modo si riescono ad evidenziare le debolezze rendendo l’intero sistema più robusto, fino al momento in cui i fallimenti non verranno più notati.

Proprio con questo intento Netflix ha sviluppato Chaos Monkey, e lo mantiene in esecuzione nella sua architettura cloud senza che nessun utente si renda contro delle istanze che vengono terminate; in un solo anno (2012) Chaos Monkey ha terminato più di 65000 istanze EC2 di Netflix, contribuendo a rendere il servizio più robusto ed affidabile.

Ovviamente la sua utilità è proporzionale alla dimensione dell’architettura, pensiamo a quelle molto complesse dove è tutt’altro che banale riuscire ad analizzare quali punti richiedono più ridondanza e dove possono essere presenti punti deboli.

Per utilizzarlo è necessario avere almeno un Auto Scaling Group, cioè un gruppo di istanze EC2 dinamico che varia di dimensione man mano che alcune metriche lo richiedono.
Questi gruppi permettono di definire il numero di istanze desiderate a seconda di parametri predefiniti, ed il sistema avvia e termina macchine in modo da soddisfare questo requisito. Ad esempio, in caso un’istanza termini per un malfunzionamento una nuova prende il suo posto, in modo che il servizio non si interrompa.
Tuttavia, anche se le istanze vengono sostituite non è detto che il servizio sia immune da conseguenze, dato che è necessario che le macchine precedentemente connesse modifichino correttamente il loro comportamento, ad esempio tramite un bilanciatore che riesca a rilevare lo scambio tra le due istanze.

Utilizzo pratico

 

schema_amazon

Vi proponiamo di seguito una guida pratica sul funzionamento di Chaos Monkey, con un focus particolare sulle modalità di installazione e configurazione del tool. Crediamo in questo strumento tanto da fornirvi le sue “istruzioni all’uso”, perché siamo convinti che possa essere utile, oltre che dal punto di vista tecnico, anche come incentivo ad “aprire la mente” verso un modo di lavorare più strutturato ed affidabile.

Configurazione

Come detto precedentemente, per utilizzare questo strumento è necessario disporre di un Auto Scaling Group (ASG) e per questa prova ne abbiamo creato uno molto basilare composto da due o più istanze EC2. L’architettura prevede un bilanciatore che permette di accedere alle istanze dell’Auto Scaling Group tramite il forward della porta 80. Le macchine del gruppo vengono create dinamicamente, in caso di scale-up dell’architettura, a partire da un AMI basata su Ubuntu 14.04 LTS su cui è stato installato un server web (Apache) che ha il compito di distribuire una pagina di esempio. L’hardware di ogni istanza possiede un single core con 1 GB di RAM (t2 micro).

Installazione

Chaos Monkey può essere installato ed eseguito in ogni macchina connessa ad Internet, quindi sul proprio computer o in una istanza EC2.
Il requisito fondamentale è quello di avere a disposizione la AWS CLI configurata con un account che abbia i permessi per lo svoglimento delle operazioni necessarie.

I permessi IAM da fornire all’account sono i seguenti:

  • EC2
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1446800047000",
            "Effect": "Allow",
            "Action": [
                "ec2:CreateTags",
                "ec2:DescribeImages",
                "ec2:DescribeInstances",
                "ec2:DescribeSnapshots",
                "ec2:DescribeVolumes",
                "ec2:TerminateInstances",
                "elasticloadbalancing:*",
                "autoscaling:DescribeAutoScalingGroups"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
  • SimpleDB
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1446806832000",
            "Effect": "Allow",
            "Action": [
                "sdb:BatchDeleteAttributes",
                "sdb:BatchPutAttributes",
                "sdb:CreateDomain",
                "sdb:DomainMetadata",
                "sdb:GetAttributes",
                "sdb:ListDomains",
                "sdb:PutAttributes",
                "sdb:Select"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

I permessi per EC2 sono necessari per fare in modo che Chaos Monkey abbia accesso agli Auto Scaling Group per poter visualizzare e teminare le istanze. Le policy per SimpleDB (SDB) sono utilizzate per il sistema di logging di Chaos Monkey, in modo da mantenere organizzati e facilmente accessibili i dati sulle sue azioni. La configurazione di SimpleDB non è necessaria, dato che viene effettuata dal software al primo avvio.

Oltre ai log su SimpleDB è possibile attivare il sistema di notifica tramite email, ed in tal caso sarà necessario fornire anche l’autorizzazione “ses:SendEmail”.

A questo punto si deve scaricare e compilare il software tramite i comandi:

git clone git://github.com/Netflix/SimianArmy.git
cd SimianArmy
./gradlew build

La compilazione potrà richiedere diversi minuti, dato che prevede il download delle dipendenze mancanti.

Le credenziali dell’account devono essere impostate tramite il file di configurazione src/main/resources/client.properties, all’interno delle stringhe:

set simianarmy.aws.account_key <account key>
set simianarmy.aws.secretKey <secret key>
set simianarmy.aws.region <region>

sostituendo <account key> e <secret key> con le credenziali dell’account (con le policy definite precedentemente) e <region> con la regione di AWS dove è in esecuzione l’Auto Scaling Group.

Di default l’orario di esecuzione di Chaos Monkey è tra le 9 di mattina e le 3 di pomeriggio (escludendo il weekend), ma per fare dei test è possibile rimuovere questa limitazione tramite il file src/main/resources/simianarmy.properties nell’impostazione:

set simianarmy.calendar.isMonkeyTime=true

L’ultima parte della configurazione è presente nel file src/main/resources/chaos.properties, dove devono essere impostati i seguenti valori:

set simianarmy.chaos.ASG.enabled=false
set simianarmy.chaos.ASG.<ASG name>.enabled=true
set simianarmy.chaos.ASG.<ASG name>.probability=1.0

sostituendo <ASG name> con il nome dell’Auto Scaling Group. La prima stringa indica a Chaos Monkey di non prendere tutti gli Auto Scaling Group presenti nella region, ma solo quelli esplicitamente indicati nelle righe successive. Dare piena libertà a Chaos Monkey o limitarlo solo ad alcuni Auto Scaling Group è una scelta che deve essere fatta a seconda delle esigenze.
La terza stringa indica la probabilità complessiva giornaliera di spegnimento di una istanza di quel gruppo.

Per comprendere meglio questo punto è necessario sapere che Chaos Monkey si “risveglia” 6 volte al giorno, genera un numero random tra 0 ed 1 e termina una istanza solo se il numero è minore di una certa probabilità.
Quindi, se la probabilità complessiva giornaliera è impostata ad 1.0, significa che ad ogni risveglio Chaos Monkey terminerà una istanza con probabilità 0.166666 (1.0 / 6). Di conseguenza non ci si deve far ingannare dalla notazione 1.0; può succedere che in un’intera giornata nessuna istanza venga terminata.
Se per un test vogliamo essere sicuri di ottenere una terminazione, sarà sufficiente impostare la probabilità complessiva giornaliera a 6.0 (600%), in modo che ad ogni risveglio la probabilità specifica sia 1.0 (6.0 / 6).

Le impostazioni descritte sono quelle basilari, ma nella documentazione è possibile trovare il modo per personalizzare tutti gli aspetti del funzionamento del tool, come ad esempio il numero di terminazioni massime per giorno o settimana, gli orari di attivazione e molto altro.

Dato che le operazioni compiute da Chaos Monkey sono potenzialmente pericolose, di default le azioni vengono bloccate e viene impedita la terminazione delle istanze. Questa modalità denominata leashed è utile per vedere dai log le azioni che sarebbero state compiute, senza però causare danni accidentali.

Per attivare realmente il funzionamento di Chaos Monkey è necessario modificare il file di configurazione src/main/resources/chaos.properties impostando

set simianarmy.chaos.leashed=false

L’avvio del tool avviene tramite il comando

./gradlew jettyRun

e finché rimarrà in esecuzione continuerà a selezionare casualmente istanze per la terminazione.

Nei log si potranno vedere due tipi di output ad ogni risveglio: in caso l’istanza non venga terminata verrà riportato un messaggio simile a

INFO  c.n.s.b.c.BasicChaosInstanceSelector - Group <ASG name> [type ASG] got lucky: 0.5676795962102251 > 0.16666666666666666

altrimenti

INFO  c.n.s.basic.chaos.BasicChaosMonkey - Terminated i-d5e1126c from group <ASG name> [ASG] with ShutdownInstance

da dove è possibile vedere quale istanza è stata terminata.

Risultati

In un contesto semplificato come quello proposto in precedenza, Chaos Monkey ha deciso di terminare una delle due istanze dell’Auto Scaling Group mentre l’architettura ha continuato ad erogare correttamente il servizio grazie alla disponibilità di un’altra risorsa. Dopo pochi secondi dalla terminazione della seconda istanza (decisa sempre da Chaos Monkey) l’Auto Scaling Group ne ha creata automaticamente una nuova risolvendo in automatico l’esigenza di altre risorse per sopperire al fallimento delle precedenti. Con questo semplice esempio è stato possibile verificare la corretta configurazione di Chaos Monkey ma soprattutto quella dell’Auto Scaling Group, ovvero di aggiungere risorse in caso di necessità.

Conclusioni

Il fallimento è una condizione che tipicamente crea imbarazzo nella vita delle persone, nonostante molto spesso sia di fondamentale importanza per la costruzione di qualcosa di solido e duraturo.

Nella vita, quando ciò si verifica, prendiamo coscienza degli errori commessi e delle azioni da mettere in atto per ripartire o a volte ricominciare e così può avvenire anche nell’ambito tecnologico. A seguito di uno stimolo generato da Chaos Monkey, grazie alla sua capacità di produrre fallimenti che portano a galla delle problematiche, i DevOps riescono ad assumere una nuova consapevolezza tale da favorire il miglioramento dell’architettura Cloud a supporto dei servizi software che l’azienda eroga.

Se consideriamo l’esempio citato in questo articolo, infatti, scopriamo che l’utilizzo di Chaos Monkey permette:

  • Una continuità del servizio in caso di termine di una delle due istanze
  • Il verificarsi della correttezza del workflow in occasione di un’eventuale fallimento dell’unica istanza
  • Un’evidenziazione dei problemi nel software, forzando la dinamicità dell’archittetura.

Chaos Monkey è un tool che unito ad altri (Janitor Monkey, Conformity Monkey, ecc.), permette ai progettisti di verificare la bontà delle soluzioni proposte consentendo un miglioramento continuo del servizio.

Anche noi usiamo Chaos Monkey per validare la qualità dei nostri progetti, se ti interessa approfondire l’argomento o raccontarci la tua esperienza contattaci o lascia un commento!

 

Leave a Comment