Storacle — un archivio di file decentralizzato

Storacle — un archivio di file decentralizzato

Prima di iniziare, devo lasciare il link all'articolo precedente, per chiarire di cosa stiamo parlando.

In questo articolo vorrei analizzare il livello che si occupa dello storage dei file e come questo possa essere utilizzato da chiunque. Storacle è una libreria autonoma, non ha alcun legame diretto con la musica. È possibile organizzare lo storage di qualsiasi tipo di file.

Nell'articolo precedente ho un po' "diluito" su ipfs, ma è stato in riferimento al task che stavo affrontando. In generale, considero questo progetto fantastico. Mi piace semplicemente di più la possibilità di creare diverse reti per compiti diversi. Questo permette di organizzare meglio la struttura e ridurre il carico sui singoli nodi e sulla rete in generale. È anche possibile, all'interno di un determinato progetto, suddividere la rete in parti in base a determinati criteri, riducendo il carico complessivo.

Quindi, storacle utilizza meccanismi spreadable per l'organizzazione della rete. Caratteristiche principali:

  • I file possono essere aggiunti allo storage tramite qualsiasi nodo.
  • I file vengono salvati integralmente, non a blocchi.
  • Ogni file ha un suo hash unico basato sul contenuto per ulteriori operazioni su di esso.
  • I file possono essere duplicati per una maggiore affidabilità
  • Il numero di file su un nodo è limitato solo dal file system (c'è un'eccezione, che verrà spiegata più avanti)
  • Il numero di file nella rete è limitato dalle capacità spreadable in relazione al numero di nodi consentiti nella rete, che nella seconda versione potranno consentire di lavorare con un numero infinito di nodi (ne parleremo in un altro articolo)

Un semplice esempio di come funziona nella pratica:

Server:

const Node = require('storacle').Node;

(async () => {
  try {
    const node = new Node({
      port: 4000,
      hostname: 'localhost'
    });
    await node.init();
  }
  catch(err) {
    console.error(err.stack);
    process.exit(1);
  }
})();

Client:

const Client = require('storacle').Client;

(async () => {
  try {
    const client = new Client({
      address: 'localhost:4000'
    });
    await client.init();
    const hash = await client.storeFile('./my-file');
    const link = await client.getFileLink(hash); 
    await client.removeFile(hash);
  }
  catch(err) {
    console.error(err.stack);
    process.exit(1);
  }
})();

Uno sguardo dall'interno

Sotto il cofano non c'è nulla di straordinario. Le informazioni sul numero di file, sulla loro dimensione complessiva e su altri aspetti sono memorizzate in un database in memoria e vengono aggiornate al momento della cancellazione e dell'aggiunta di file, quindi non è necessario accedere spesso al file system. L'eccezione è l'attivazione del garbage collector, quando è necessaria una rotazione dei file al raggiungimento di determinate dimensioni di archiviazione, piuttosto che vietare l'aggiunta di nuovi. In questo caso, è necessario eseguire una scansione dell'archivio, e lavorare con un grande numero di file (> un milione, per esempio) può comportare carichi significativi. È meglio conservare meno file e avviare più nodi. Se il "pulitore" è disattivato, questo problema non si pone.

Lo storage dei file è costituito da 256 cartelle e 2 livelli di annidamento. I file sono memorizzati nelle cartelle di secondo livello. Quindi, con 1 milione di file, ogni cartella di questo tipo avrà circa 62500 file (1000000 / sqrt(256)).

I nomi delle cartelle vengono generati dall'hash del file, in modo da poter accedere rapidamente conoscendo l'hash.

Questa struttura è stata scelta in base a un gran numero di requisiti diversi per lo storage: supporto per file system deboli, dove non è consigliabile avere molti file in una sola cartella, rapido accesso a tutte le cartelle quando necessario, ecc. Una sorta di compromesso.

Caching

Durante l'aggiunta di file, così come al momento del loro recupero, si registrano nel cache i collegamenti ai file.
Grazie a questo, spesso non è necessario scandagliare l'intera rete in cerca di un file. Ciò accelera il recupero dei collegamenti e riduce il carico sulla rete. Inoltre, la memorizzazione nella cache avviene tramite intestazioni HTTP.

Isomorfismo

Il client è scritto in JavaScript ed è isomorfo, può essere utilizzato direttamente dal browser. 
È possibile caricare un file https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js come script e accedere a window.ClientStoracle oppure importarlo tramite un sistema di bundling, ecc.

Collegamenti posticipati

Una funzione interessante è anche il "link ritardato". Questo è un link a un file che può essere ottenuto in modo sincrono, qui e ora, mentre il file viene recuperato quando già trovato nell'archivio. È molto comodo quando, per esempio, si devono mostrare alcune immagini sul sito. Basta impostare il link ritardato in src e il gioco è fatto. Si possono immaginare molti casi d'uso.

Api del cliente

  • async Client.prototype.storeFile() — salvataggio del file
  • async Client.prototype.getFileLink() — ottenimento del collegamento diretto al file
  • async Client.prototype.getFileLinks() — ottenimento dell'elenco dei collegamenti diretti al file da tutti i nodi in cui è presente
  • async Client.prototype.getFileToBuffer() — ottenere il file nel buffer
  • async Client.prototype.getFileToPath() — ottenere il file nel file system
  • async Client.prototype.getFileToBlob() — ottenere il file in blob (per la versione browser)
  • async Client.prototype.removeFile() — rimuovi file
  • Client.prototype.createRequestedFileLink() — creare un collegamento posticipato

Esportazione di file su un altro server

Per trasferire file su un altro nodo, è possibile:

  • Copiare semplicemente l'intera cartella di archiviazione insieme alle impostazioni. (in futuro potrebbe non funzionare)
  • Copiare solo la cartella con i file. Tuttavia, in questo caso, sarà necessario eseguire una volta la funzione node.normalizeFilesInfo(), per ricalcolare tutti i dati e memorizzarli nel database.
  • Utilizzare la funzione node.exportFiles(), che avvierà la copia dei file.

Impostazioni principali del nodo
Avviando il nodo di archiviazione, è possibile specificare tutte le impostazioni necessarie.
Descriverò le più importanti, il resto può essere trovato su GitHub.

  • storage.dataSize — dimensione della cartella con i file
  • storage.tempSize — dimensione della cartella temporanea
  • storage.autoCleanSize — dimensione minima di spazio di archiviazione da mantenere. Se questo parametro viene specificato, non appena lo spazio inizia a scarseggiare, i file meno utilizzati verranno eliminati.
  • file.maxSize — dimensione massima del file
  • file.minSize — dimensione minima del file
  • file.preferredDuplicates — numero preferito di duplicati del file nella rete
  • file.mimeWhitelist — tipi di file consentiti
  • file.mimeBlacklist — tipi di file non consentiti
  • file.extWhitelist — estensioni di file consentite
  • file.extBlacklist — estensioni di file non consentite
  • file.linkCache — varie impostazioni di caching dei link

Quasi tutti i parametri relativi alle dimensioni possono essere specificati sia in valori assoluti che relativi.

Utilizzo tramite riga di comando
La libreria può essere utilizzata tramite riga di comando. Per fare ciò, è necessario installarla globalmente: npm i -g storacle. Dopo di che si possono eseguire le azioni necessarie dalla directory del progetto, dove si trova Node. Ad esempio, storacle -a storeFile -f ./file.txt -c ./config.js, per aggiungere un file. Tutte le azioni possono essere trovate in https://github.com/ortexx/storacle/blob/master/bin/actions.js

Perché potresti averne bisogno

  • Se vuoi creare un progetto decentralizzato in cui prevedi di memorizzare e lavorare con file in modo conveniente. Ad esempio, il progetto musicale descritto nel link all'inizio dell'articolo utilizza storacle.
  • Se stai lavorando su altri progetti in cui è necessario memorizzare file in modo distribuito. Puoi facilmente costruire una rete privata, configurare flessibilmente i nodi e aggiungere nuovi quando necessario.
  • Se hai semplicemente bisogno di un luogo dove memorizzare i file del tuo sito e non vuoi scrivere tutto da solo. Questa libreria potrebbe essere più adatta rispetto ad altre nel tuo caso.
  • Se hai un progetto in cui lavori con file ma desideri eseguire tutte le operazioni dal browser. Puoi evitare di scrivere codice server.

I miei contatti:

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster