Redis su Docker Swarm - Brutta idea
Ho fatto molte prove con docker swarm per vedere come funzionava lo scaling orizzontale di Redis. Sono
giunto alla conclusione che scalare in tempo reale con Docker Swarm è una brutta idea.
Sono partito provando gli esempi che trovavo su Internet. Credo di averli provati un po' tutti! Questi esempi
promettevano di funzionare, ma in realtà funzionavano senza persistenza dei dati oppure c'era una istanza che,
se killata, interrompeva tutto il database.
Mi sono studiato in maniera approfondita il funzionamento di Redis e sono giunto alla conclusione che Redis,
per come funziona internamente, non lo si può scalare orizzontalmente in tempo reale (come promette Docker
Swarm).
Docker configura le interfacce di rete con un indirizzo IP dinamico. Questo indirizzo IP cambia ogni volta che
si fa lo scaling del servizio Redis. L'unica soluzione (come consigliato anche dalla documentazione ufficiale)
è di impostare la rete in “host”.
Redis cataloga le chiavi tramite un modulo 16384. Questi 16384 elementi vengono sparsi per i nodi master (del
cluster). Questo sistema si chiama “sharding”, e quando si vuole aggiungere un nuovo server master bisogna
rifare lo sharding. Questa cosa non è facilmente automatizzabile con docker swarm.
Un altro problema è la persistenza dei dati: Redis non ha un sistema per fare il DUMP e il RESTORE di tutte le
chiavi del database; si puo' fare al massimo un DUMP per una singola chiave. Nella documentazione ufficiale
parlano di salvare il file dump.rdb, ma questo è fuorviante: Redis salva solo una parte delle chiavi nel file
dump.rdb. Bisogna salvare tutti i file dump.rdb di tutte le istanze per poter avere un backup del database.
Inoltre il sistema non è a prova di futuro. Bisogna quindi farsi un backup e un restore a livello applicativo.
Quando questo non è possibile (perchè si hanno migliaia di chiavi con nome random) bisogna salvare i file
dump.rdb. Ma i docker sono effimeri e bisogna quindi usare un bind mount per far persistere il database.
Docker Swarm non garantisce che le istanze verranno allocate sempre nello stesso posto. Questo è un problema
perchè gli shards vengono catalogati al di fuori di dump.rdb e il database si trova su dump.rdb (un file che si
troverà su una macchina ma non verrà spostato automaticamente).
Quando Redis viene configurato come cluster, vengono eletti i master e le repliche. Ognuno di questi ha un
ruolo preciso, ma Docker Swarm non ne tiene conto.
Ho provato Redis con Docker Swarm e mi sono accorto che mi complicava la vita piuttosto che migliorarla. A mio
avviso è meglio configurare manualmente le istanze (quando il numero di server è basso) oppure usare strumenti
del tipo Ansible™ per automatizzare le installazioni.
08 dic