Presentazione di Rump: sincronizzazione a caldo di due database Redis tramite dump
Pubblicato da Marco Lisci il
Siamo entusiasti di annunciare il nostro primo progetto open source: Rump!
Rump è un piccolo strumento che si concentra su un unico obiettivo: raccogliere dati in tempo reale da un cluster Redis AWS ElastiCache.
Abbiamo affrontato questo problema quando abbiamo cercato di sincronizzare i container Redis di staging con il cluster di produzione. In Sticker Mule utilizziamo moltissimo Docker e CoreOS, facendo affidamento su un cluster ElastiCache per le nostre esigenze Redis in produzione.
Di recente avevamo deciso di rendere l'ambiente di staging quanto più prossimo possibile all'ambiente di produzione e Redis ne è un aspetto. Ecco il percorso che alla fine ci ha portati a Rump.
Evitare blocchi
Avevamo un unico, semplice requisito: non bloccare la produzione durante il recupero dei dati. Il fatto che Redis funzioni a thread singolo è un aspetto importante da tenere in considerazione.
Siamo rimasti sorpresi nello scoprire che ElastiCache viene fornito con alcuni comandi disabilitati. Essenzialmente, si tratta di tutti i comandi che puoi utilizzare per il trasferimento sicuro dei dati.
BGSAVE
Il metodo standard per attivare manualmente un backup di un database Redis è immettere il comando "BGSAVE" e attendere il completamento in background, un'operazione che non provoca blocchi. Purtroppo questa funzionalità è disabilitata, a meno che non si scelga di adottare l'implementazione interna della funzionalità di snapshot di AWS.
SLAVEOF
L'impostazione di slave è un'altra opzione interessante di Redis e per noi sarebbe stata la scelta ideale.
Il piano era impostare temporaneamente i container di staging Redis come slave del nostro cluster di produzione e ottenere così i dati in tempo reale. Purtroppo, anche lo strumento "SLAVEOF" è disabilitato e non c'è modo di aggiungere slave a un'istanza ElastiCache.
Strumenti esistenti
Esistono molti eccellenti strumenti per Redis che tentano di semplificare l'amministrazione dei server Redis, il dump su JSON, ecc.
Il problema è che gli strumenti più stabili e meglio gestiti utilizzano il comando "KEYS" per recuperare le chiavi per poi operare su tali chiavi. Il comando "KEYS" ha una complessità O(N) che blocca in modo serio Redis quando N è alto, fino a che non vengono restituite tutte le chiavi. I container di staging vengono creati ed eliminati di frequente e abbiamo un buon numero di chiavi: non vogliamo sferrare un attacco DoS contro il nostro stesso server!
Era chiaro che avevamo bisogno di uno strumento semplice che eseguisse la sola sincronizzazione. Abbiamo cominciato a sperimentare con "SCAN" per recuperare le chiavi e "DUMP/RESTORE" per recuperare/impostare i valori.
"SCAN" è un comando O(1), sicuro da eseguire su un server di produzione per ottenere tutte le chiavi, e per questo motivo la sua implementazione deve essere diversa rispetto a "KEYS". "SCAN" restituisce un gruppo di chiavi attualmente presente nel DB e un cursore al gruppo successivo.
"DUMP/RESTORE" rende indipendente la lettura/scrittura dei valori rispetto al tipo di chiave.
Tenendo a mente tutto questo, ecco cosa offre Rump:
- Lettura progressiva delle chiavi senza provocare blocchi tramite "SCAN".
- Operazioni sui valori indipendenti da "TYPE" tramite "DUMP/RESTORE".
- Operazioni "SCAN" e "DUMP/RESTORE" in pipeline.
- Lettura dal server di origine e scrittura sul server di destinazione simultanee. Rump non archivia tutte le chiavi prima di scriverle sul server di destinazione.
- Unico file binario compatibile con più piattaforme, senza dipendenze.
- Ingombro minimo, filosofia UNIX, esegue un'unica funzione con due flag.
Speriamo che lo strumento sarà utile a quanti sperimentano i nostri stessi problemi e un ringraziamento di cuore a Redis per il supporto di una tale varietà di comandi!
P.S. Se l'argomento ti interessa e sei alla ricerca di un'organizzazione in cui è un piacere lavorare per le persone di talento, stiamo assumendo.