Opzioni per sincronizzare in modo efficiente 1 milione di file con server remoti?


27

In un'azienda per cui lavoro abbiamo una cosa chiamata "playlist" che sono piccoli file ~ 100-300 byte ciascuno. Ce ne sono circa un milione. Circa 100.000 di loro vengono cambiati ogni ora. Queste playlist devono essere caricate su altri 10 server remoti in diversi continenti ogni ora e deve avvenire rapidamente in meno di 2 minuti idealmente. È molto importante che anche i file eliminati sul master vengano eliminati su tutte le repliche. Attualmente utilizziamo Linux per la nostra infrastruttura.

Stavo pensando di provare rsync con l'opzione -W per copiare interi file senza confrontare i contenuti. Non l'ho ancora provato, ma forse le persone che hanno più esperienza con rsync potrebbero dirmi se è un'opzione praticabile?

Quali altre opzioni vale la pena considerare?

Aggiornamento: ho scelto l'opzione lsyncd come risposta, ma solo perché era la più popolare. Altre alternative suggerite sono valide anche a modo loro.


1
Hai un registro che indica quali file sono stati modificati o eliminati?
Oliver,

3
Se solo le playlist fossero dischi mysql. È quindi possibile utilizzare la replica del database e ottenere mysql per capire cosa è necessario per essere inviato / ricevuto.
Matt,

@oliver lo facciamo. Tuttavia, è necessario fidarsi di quel registro che significa che il codice che lo genera deve essere corretto e quindi è necessario un codice personalizzato per elaborare quel registro che deve anche essere corretto. Preferirei evitare il codice interno per farlo su qualcosa che è stato ampiamente testato dalla comunità.
Zilvinas,

Vuoi che la modifica venga applicata solo ogni ora? O è accettabile anche la replica istantanea?
falso

1
Non sottovalutare il tempo impiegato da rsync per funzionare attraverso un milione di file. Provalo e vedrai cosa stai facendo. Se si dispone di quel registro, utilizzarlo o provare qualsiasi altra delle soluzioni proposte.
Oliver,

Risposte:


39

Poiché anche gli aggiornamenti istantanei sono accettabili, è possibile utilizzare lsyncd .
Guarda le directory (inotify) e si rsynctrasforma in slave.
All'avvio farà un pieno rsync, quindi ci vorrà del tempo, ma dopo che verranno trasmessi solo i cambiamenti.
La visione ricorsiva delle directory è possibile, se un server slave non è attivo, la sincronizzazione verrà ritentata fino al suo ritorno.

Se questo è tutto in una singola directory (o in un elenco statico di directory) puoi anche usare incron .
Lo svantaggio è che non consente la visualizzazione ricorsiva delle cartelle ed è necessario implementare la funzionalità di sincronizzazione da soli.


Ancora un consiglio brillante :)
Zilvinas,

1
+1 Questo è essenzialmente un problema di coerenza della cache, un monitor che invia modifiche è la soluzione più semplice. lsyncdattua che ...
Chris S,

1
Vorrei indagare lsyncde inotifyapprofondire come si applica al sistema operativo del server specifico. Esiste un limite al numero di orologi inotify disponibili. Credo che il valore predefinito sia circa 1500 o 8000 a seconda della tua particolare versione di Linux. La maggior parte dei kernel consente di aumentare il limite, ma il monitoraggio di 1 milione di file potrebbe essere più di quanto sia pratico. Non ha funzionato per me nel 2008. Inoltre, la coda di eventi inotify può traboccare causando la perdita di eventi e devi avere un modo per recuperare da quello. lsyncdUn'implementazione attentamente calibrata e un quotidiano rsyncpotrebbero funzionare ora nel 2012 per coprire le tue basi.
Old Pro,

2
In realtà fa un iontifynella directory non i singoli file. Quante directory puoi vedere? Controllare /proc/sys/fs/inotify/max_user_watches(di solito 8192).
falso

2
Con ~ 50k le directory inotify probabilmente non si ridimensioneranno bene. Quando abbiamo provato un approccio simile nel 2009 con directory da 100k, il kernel ha impiegato molto tempo per iscriversi a tutte le directory. Per quanto riguarda @OldPro, non ha funzionato per noi.
neovatar,

11

Prendi in considerazione l'utilizzo di un filesystem distribuito, come GlusterFS . Progettato pensando alla replica e al parallelismo, GlusterFS può scalare fino a 10 server molto più agevolmente rispetto alle soluzioni ad hoc che coinvolgono inotify e rsync.

Per questo particolare caso d'uso, è possibile creare un volume GlusterFS a 10 server di 10 repliche (ovvero 1 replica / mattone per server), in modo che ogni replica sia un mirror esatto di ogni altra replica nel volume. GlusterFS propagherà automaticamente gli aggiornamenti del filesystem a tutte le repliche.

I client in ogni posizione contatteranno il loro server locale, quindi l'accesso in lettura ai file sarebbe veloce. La domanda chiave è se la latenza di scrittura può essere mantenuta accettabilmente bassa. L'unico modo per rispondere è provarlo.


+1 per Glusterfs
Tom O'Connor,

8

Dubito rsyncche funzionerebbe normalmente, perché scansionare un milione di file e confrontarlo con il sistema remoto 10 volte richiederebbe troppo tempo. Vorrei provare a implementare un sistema con qualcosa del genere inotifyche mantiene un elenco di file modificati e li invia ai server remoti (se comunque queste modifiche non vengono registrate in altro modo). È quindi possibile utilizzare questo elenco per identificare rapidamente i file necessari per il trasferimento, magari anche con rsync (o meglio 10 istanze parallele di esso).

Modifica: con un po 'di lavoro, potresti persino usare questo approccio inotify / log watch per copiare i file non appena si verifica la modifica.


5

Alcune altre alternative:

  • Inserisci un lavoro in RabbitMQ o Gearman per spegnerlo in modo asincrono ed eliminare (o aggiungere) lo stesso file su tutti i server remoti ogni volta che elimini o aggiungi un file sul server primario.
  • Archivia i file in un database e utilizza la replica per mantenere sincronizzati i server remoti.
  • Se si dispone di ZFS è possibile utilizzare la replica ZFS .
  • Alcune SAN hanno la replica dei file. Non ho idea se questo può essere utilizzato su Internet.

4

Questo sembra essere un caso d'uso ideale per il libro di fiabe per MongoDB e forse GridFS . Poiché i file sono relativamente piccoli, MongoDB da solo dovrebbe essere sufficiente, sebbene possa essere conveniente usare l'API GridFS.

MongoDB è un database nosql e GridFS è un archivio di file costruito su di esso. MongoDB ha molte opzioni integrate per la replica e lo sharding , quindi dovrebbe adattarsi molto bene nel tuo caso d'uso.

Nel tuo caso probabilmente inizierai con un set di repliche che consiste nel master situato nel tuo datacenter primario (forse un secondo, nel caso in cui desideri eseguire il failover nella stessa posizione) e i tuoi dieci "slave" distribuiti in tutto il mondo. Quindi eseguire i test di carico per verificare se le prestazioni di scrittura sono sufficienti e controllare i tempi di replica sui nodi. Se hai bisogno di più prestazioni, puoi trasformare l'installazione in una più frammentata (principalmente per distribuire il carico di scrittura su più server). MongoDB è stato progettato con il ridimensionamento di enormi configurazioni con hardware "economico", in modo da poter inserire un gruppo di server economici per migliorare le prestazioni.


0

Vorrei usare un backend S3 e poi montarlo su tutti i server di cui ho bisogno - In questo modo, tutti sono sincronizzati all'istante comunque


Mentre l'archiviazione sarebbe sincronizzata, dovresti notificare l'applicazione, quindi torneresti al punto di partenza o l'app dovrebbe eseguire il polling dell'archiviazione ogni volta che qualcuno accede a queste playlist. Le prestazioni sarebbero orribili in entrambi i casi.
Chris S,

L'applicazione non deve eseguire il polling dell'archiviazione ogni volta che qualcuno accede alle playlist, solo abbastanza volte entro un'ora per assicurarsi che l'applicazione sia in esecuzione senza dati obsoleti. Inoltre, se S3 viene utilizzato come backend, perché l'applicazione dovrebbe innanzitutto eseguire il polling dei file? Saranno sempre aggiornati
Mister IT Guru,

0

Un'opzione che non sembra essere stata ancora menzionata è l'archiviazione di tutti i file in un file compresso. Ciò dovrebbe ridurre in modo significativo le dimensioni totali e rimuovere tutte le spese generali derivanti dalla gestione di milioni di singoli file. Sostituendo l'intero set di file in un unico grande aggiornamento, puoi anche essere certo che i file rimossi vengono rimossi dalle repliche.

Il rovescio della medaglia è ovviamente che stai trasferendo molti file inutilmente. Ciò può essere compensato o meno dalle dimensioni ridotte grazie alla compressione. Inoltre non ho idea di quanto tempo ci vorrebbe per comprimere quel numero di file.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.