ARPA-SIMC / arkimet

A set of tools to organize, archive and distribute data files.
Other
15 stars 5 forks source link

(quasi-)atomic import of data in arkimet #309

Open dcesari opened 1 year ago

dcesari commented 1 year ago

Premetto che questa richiesta al momento non è stringente perché non abbiamo le corse modellistiche di backup al momento, la documento come possibile sviluppo futuro, per il momento la teniamo congelata.

In Arpae-SIMC vi sono alcuni flussi di importazione in archivi Arkimet di grossi dati previsionali che provengono da sorgenti ridondate e indipendenti (tipicamente due) per cui:

  1. è necessario importare, per uno specifico istante di emissione della sorgente, solo i dati provenienti dalla sorgente che termina per prima la produzione dei dati
  2. è importante evitare latenze e cominciare lo scanning dei dati il più presto possibile, mentre vengono generati
  3. i dati finali, per la corrente sessione di importazione, devono provenire tutti da una sola sorgente, non si possono mescolare, anche se in teoria sono equivalenti.

La funzionalità da implementare riguarda quindi la possibilità, mediante arki-scan o altro comando specifico, di pre-importare (-scannerizzare-indicizzare) i dati in Arkimet da tutte le sorgenti, ma fare il merge in modo atomico nel dataset finale di una sola della sorgenti, tipicamente quella che per prima ha completato, rendendoli disponibili ai client solo a merge effettuato. La cosa potrebbe essere implementata prevedendo la possibilità, anche per i dataset iseg grib/bufr, di avere un segmento distribuito anche su diversi file in sottocartelle, come per hdf, e fare sì che il merge finale consista solo in un mv di un file grosso sullo stesso filesystem e merge degli indici.

Sarebbe utile avere anche un comando di repack che permetta di impacchettare a bocce ferme tutti i file del segmento in un unico file per coerenza negli archivi storici.

dcesari commented 9 months ago

La issue non è al momento urgente, per il momento chiediamo un giudizio di sensatezza/fattibilità e una stima dei tempi di realizzazione.

spanezz commented 9 months ago

Mi sembra fattibile.

Come strategia di base:

  1. Aprire una transazione in sqlite per ogni import, oppure creare un file stile journal con le modifiche che sarebbero apportate al file sqlite del segmento
  2. Importare creando i segmenti in una directory temporanea. Si può fare un seek alla dimensione del segmento originale prima dell'import, per creare un buco all'inizio del segmento temporaneo in modo che gli offset dei dati importati siano in sincrono col segmento vero
  3. Quando si decide quale import va a buon fine:

    1. Si annullano gli altri import che stanno girando in parallelo, che faranno ROLLBACK in sqlite e cancelleranno i loro file temporanei
    2. Si copiano i dati dai segmenti temporanei a quelli online. L'operazione può essere ottimizzabile a livello di sistema operativo, per esempio usando copy_file_range
    3. Si esegue COMMIT su sqlite

Con alcune limitazioni:

Considerazioni extra:

Tempo di lavorazione: