Storacle - stockage de fichiers décentralisé

Storacle - stockage de fichiers décentralisé

Avant de commencer, je dois partir lien vers l'article précédentafin qu'il soit clair de quoi nous parlons exactement.

Dans cet article, j'aimerais examiner la couche responsable du stockage des fichiers et comment elle peut être utilisée par n'importe qui. Storacle est une bibliothèque autonome, il n’y a pas de lien direct avec la musique. Vous pouvez organiser le stockage de n'importe quel fichier.

Dans l’article précédent, j’avais un peu « fait rouler le canon » ipfs, mais cela s'est produit précisément dans le contexte du problème que je résolvais. Dans l’ensemble, je pense que ce projet est cool. Je préfère simplement la possibilité de créer différents réseaux pour différentes tâches. Cela vous permet de mieux organiser la structure et de réduire la charge sur les nœuds individuels et sur le réseau dans son ensemble. Même dans le cadre d'un même projet, si nécessaire, vous pouvez diviser le réseau en morceaux selon certains critères, réduisant ainsi la charge globale.

Donc Storecle utilise le mécanisme tartinable pour organiser un réseau. Principales caractéristiques:

  • Les fichiers peuvent être ajoutés au référentiel via n'importe quel nœud.
  • Les fichiers sont enregistrés entièrement et non par blocs.
  • Chaque fichier possède son propre hachage de contenu unique pour un travail ultérieur.
  • Les fichiers peuvent être dupliqués pour une plus grande fiabilité
  • Le nombre de fichiers sur un nœud n'est limité que par le système de fichiers (il existe une exception, plus d'informations ci-dessous)
  • Le nombre de fichiers dans le réseau est limité par les capacités de diffusion en fonction du nombre de nœuds valides dans le réseau, qui dans la deuxième version pourront fonctionner avec un nombre infini de nœuds (plus de détails à ce sujet dans un autre article)

Un exemple simple de la façon dont cela fonctionne généralement à partir du programme :

Serveur:

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);
  }
})();

Vue intérieure

Il n'y a rien d'extraordinaire sous le capot. Les informations sur le nombre de fichiers, leur taille totale et d'autres points sont stockées dans une base de données en mémoire et sont mises à jour lorsque des fichiers sont supprimés et ajoutés, il n'est donc pas nécessaire d'accéder fréquemment au système de fichiers. Une exception consiste à activer le garbage collector lorsque vous devez faire circuler des fichiers lorsqu'une certaine taille de stockage est atteinte, et à ne pas interdire l'ajout de nouveaux. Dans ce cas, vous devez contourner le stockage, et travailler avec un grand nombre de fichiers (> disons un million) peut entraîner des charges importantes. Et il est préférable de stocker moins de fichiers et d'exécuter plus de nœuds. Si le "nettoyeur" est désactivé, ce problème ne se pose pas.

Le stockage de fichiers se compose de 256 dossiers et de 2 niveaux d'imbrication. Les fichiers sont stockés dans des dossiers de deuxième niveau. Autrement dit, s'il y en a 1 million. Il y aura environ 62500 1000000 fichiers dans chacun de ces dossiers (256 XNUMX XNUMX / sqrt(XNUMX)).

Les noms de dossiers sont formés à partir du hachage du fichier afin que vous puissiez y accéder rapidement si vous connaissez le hachage.

Cette structure a été choisie en fonction d'un grand nombre d'exigences de stockage différentes : prise en charge des systèmes de fichiers faibles, où il n'est pas souhaitable d'avoir plusieurs fichiers dans un seul dossier, parcours rapide de tous les dossiers si nécessaire, etc. Une sorte de juste milieu.

mise en cache

Lors de l'ajout de fichiers, ainsi que lors de leur réception, des liens vers les fichiers sont écrits dans le cache.
Grâce à cela, il n'est très souvent pas nécessaire de parcourir tout le réseau à la recherche d'un fichier. Cela accélère la réception des liens et réduit la charge sur le réseau. La mise en cache s'effectue également via les en-têtes http.

Isomorphie

Le client est écrit en javascript et est isomorphe, il peut être utilisé directement depuis le navigateur. 
Vous pouvez télécharger le fichier https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js en tant que script et accès window.ClientStoracle ou importer via le système de construction, etc.

Liens différés

Une fonctionnalité intéressante est également la « référence différée ». Il s'agit d'un lien vers un fichier qui peut être obtenu de manière synchrone, ici et maintenant, et le fichier sera extrait lorsqu'il sera déjà trouvé dans le stockage. C'est très pratique lorsque, par exemple, vous devez afficher des photos sur le site. On vient de mettre un lien différé dans src et c'est tout. Vous pouvez proposer de nombreux cas.

API cliente

  • async Client.prototype.storeFile() - sauvegarde du fichier
  • async Client.prototype.getFileLink() — obtenir un lien direct vers le fichier
  • async Client.prototype.getFileLinks() — obtenir une liste de liens directs vers un fichier à partir de tous les nœuds où il existe
  • async Client.prototype.getFileToBuffer() — mettre le fichier dans le tampon
  • async Client.prototype.getFileToPath() — mettre un fichier dans le système de fichiers
  • async Client.prototype.getFileToBlob() — récupérer le fichier en blob (pour la version navigateur)
  • async Client.prototype.removeFile() - supprimer un fichier
  • Client.prototype.createRequestedFileLink() — créer un lien différé

Exporter des fichiers vers un autre serveur

Afin de transférer des fichiers vers un autre nœud, vous pouvez :

  • Copiez simplement l'intégralité du dossier de stockage ainsi que les paramètres. (cela pourrait ne pas fonctionner à l'avenir)
  • Copiez uniquement le dossier contenant les fichiers. Mais, dans ce cas, vous devrez exécuter la fonction une fois noeud.normalizeFilesInfo()pour recalculer toutes les données et les saisir dans la base de données.
  • utiliser la fonction noeud.exportFiles()qui commencera à copier les fichiers.

Paramètres de base du nœud
Lors du démarrage du nœud de stockage, vous pouvez spécifier tous les paramètres nécessaires.
Je vais décrire les plus basiques, le reste se trouve sur Github.

  • stockage.dataSize — taille du dossier contenant les fichiers
  • stockage.tempSize — taille du dossier temporaire
  • stockage.autoCleanSize — la taille de stockage minimale à conserver. Si vous spécifiez ce paramètre, dès que l'espace commence à manquer, les fichiers les moins utilisés seront supprimés.
  • fichier.maxSize — taille maximale du fichier
  • fichier.minTaille — taille minimale du fichier
  • fichier.preferredDuplicates — nombre préféré de doublons de fichiers sur le réseau
  • fichier.mimeWhitelist - types de fichiers valides
  • file.mimeListe noire - types de fichiers invalides
  • fichier.extWhitelist - extensions de fichiers valides
  • fichier.extListe noire - extensions de fichiers invalides
  • fichier.linkCache - divers paramètres de mise en cache des liens

Presque tous les paramètres liés aux dimensions peuvent être saisis en valeurs absolues et relatives.

Travailler via la ligne de commande
La bibliothèque peut être utilisée via la ligne de commande. Pour ce faire, vous devez l'installer globalement : npm i -g stockage. Après cela, vous pouvez lancer les actions nécessaires depuis le répertoire du projet où se trouve le nœud. Par exemple, storacle -a storeFile -f ./file.txt -c ./config.jspour ajouter le fichier. Toutes les actions se trouvent dans https://github.com/ortexx/storacle/blob/master/bin/actions.js

Pourquoi pourriez-vous en avoir besoin ?

  • Si vous souhaitez créer une sorte de projet décentralisé dans lequel vous envisagez de stocker et de travailler avec des fichiers à l'aide de méthodes pratiques. Par exemple, le projet musical décrit dans le lien au début de l'article utilise stockage.
  • Si vous travaillez sur d'autres projets où vous devez stocker des fichiers de manière distribuée. Vous pouvez facilement créer votre réseau fermé, configurer des nœuds de manière flexible et en ajouter de nouveaux si nécessaire.
  • Si vous avez juste besoin de stocker les fichiers de votre site Web quelque part et que c’est trop pour vous de tout écrire vous-même. Peut-être que cette bibliothèque est mieux adaptée que d’autres à votre cas.
  • Si vous avez un projet dans lequel vous travaillez avec des fichiers, mais que vous souhaitez effectuer toutes les manipulations depuis le navigateur. Vous pouvez éviter d'écrire du code serveur.

Mes contacts:

Source: habr.com

Ajouter un commentaire