FOPENP

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.

2023
08 dic