Storacle – dezentrale Dateispeicherung

Storacle – dezentrale Dateispeicherung

Bevor ich anfange, muss ich gehen Link zum vorherigen Artikeldamit klar ist, worüber genau wir reden.

In diesem Artikel möchte ich mir die Ebene ansehen, die für die Speicherung von Dateien verantwortlich ist, und wie sie von jedem genutzt werden kann. Storacle ist eine eigenständige Bibliothek, es gibt keinen direkten Zusammenhang mit Musik. Sie können die Speicherung beliebiger Dateien organisieren.

Im vorherigen Artikel habe ich das „Fass“ ein wenig weitergedreht ipfs, aber das geschah genau im Kontext des Problems, das ich löste. Insgesamt finde ich dieses Projekt cool. Ich bevorzuge einfach die Möglichkeit, unterschiedliche Netzwerke für unterschiedliche Aufgaben zu erstellen. Dadurch können Sie die Struktur besser organisieren und die Belastung einzelner Knoten und des Netzwerks insgesamt reduzieren. Auch im Rahmen eines Projekts können Sie bei Bedarf das Netzwerk nach bestimmten Kriterien in Teile aufteilen und so die Gesamtlast reduzieren.

Daher nutzt Storacle den Mechanismus streichfähig für die Organisation eines Netzwerks. Hauptmerkmale:

  • Dateien können über jeden Knoten zum Repository hinzugefügt werden.
  • Dateien werden vollständig und nicht in Blöcken gespeichert.
  • Jede Datei verfügt über einen eigenen, eindeutigen Inhalts-Hash für die weitere Arbeit damit.
  • Für eine höhere Zuverlässigkeit können Dateien dupliziert werden
  • Die Anzahl der Dateien auf einem Knoten ist nur durch das Dateisystem begrenzt (es gibt eine Ausnahme, mehr dazu weiter unten)
  • Die Anzahl der Dateien im Netzwerk wird durch die Spreizfähigkeiten entsprechend der Anzahl der gültigen Knoten im Netzwerk begrenzt, was in der zweiten Version das Arbeiten mit einer unendlichen Anzahl von Knoten ermöglicht (mehr dazu in einem anderen Artikel).

Ein einfaches Beispiel, wie das im Programm generell funktioniert:

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

Kunde:

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

Blick von innen

Unter der Haube ist nichts Besonderes. Informationen über die Anzahl der Dateien, ihre Gesamtgröße und andere Punkte werden in einer In-Memory-Datenbank gespeichert und aktualisiert, wenn Dateien gelöscht und hinzugefügt werden, sodass kein häufiger Zugriff auf das Dateisystem erforderlich ist. Eine Ausnahme besteht darin, den Garbage Collector zu aktivieren, wenn Sie Dateien verteilen müssen, wenn eine bestimmte Speichergröße erreicht ist, und das Hinzufügen neuer Dateien nicht zu verbieten. In diesem Fall müssen Sie den Speicher umgehen, und die Arbeit mit einer großen Anzahl von Dateien (> sagen wir eine Million) kann zu erheblichen Belastungen führen. Und es ist besser, weniger Dateien zu speichern und mehr Knoten auszuführen. Wenn der „Reiniger“ deaktiviert ist, gibt es kein solches Problem.

Der Dateispeicher besteht aus 256 Ordnern und 2 Verschachtelungsebenen. Dateien werden in Ordnern der zweiten Ebene gespeichert. Das heißt, wenn es 1 Million sind. In jedem dieser Ordner befinden sich etwa 62500 Dateien (1000000 / sqrt(256)).

Die Ordnernamen werden aus dem Datei-Hash gebildet, sodass Sie schnell darauf zugreifen können, wenn Sie den Hash kennen.

Diese Struktur wurde aufgrund einer Vielzahl unterschiedlicher Speicheranforderungen gewählt: Unterstützung schwacher Dateisysteme, bei denen es nicht wünschenswert ist, viele Dateien in einem Ordner zu haben, schnelles Durchlaufen aller Ordner bei Bedarf usw. Eine Art goldene Mitte.

Caching

Beim Hinzufügen von Dateien sowie beim Empfangen werden Links zu Dateien in den Cache geschrieben.
Dadurch ist es oft nicht nötig, das gesamte Netzwerk auf der Suche nach einer Datei zu durchqueren. Dies beschleunigt den Empfang von Links und reduziert die Belastung des Netzwerks. Das Caching erfolgt auch über http-Header.

Isomorphie

Der Client ist in Javascript geschrieben und isomorph, er kann direkt aus dem Browser verwendet werden. 
Sie können die Datei hochladen https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js als Skript und Zugriff window.ClientStoracle oder über das Build-System importieren usw.

Zurückgestellte Links

Ein interessantes Feature ist auch der „Deferred Link“. Dies ist ein Link zu einer Datei, die hier und jetzt synchron abgerufen werden kann. Die Datei wird abgerufen, wenn sie bereits im Speicher gefunden wird. Dies ist sehr praktisch, wenn Sie beispielsweise einige Bilder auf der Website anzeigen müssen. Wir haben einfach einen verzögerten Link in src eingefügt und das war’s. Es fallen Ihnen viele Fälle ein.

Client-API

  • async Client.prototype.storeFile() - Speichern der Datei
  • async Client.prototype.getFileLink() – Einen direkten Link zur Datei erhalten
  • async Client.prototype.getFileLinks() – Abrufen einer Liste direkter Links zu einer Datei von allen Knoten, auf denen sie vorhanden ist
  • async Client.prototype.getFileToBuffer() – Holen Sie sich die Datei in den Puffer
  • async Client.prototype.getFileToPath() – Holen Sie sich eine Datei in das Dateisystem
  • async Client.prototype.getFileToBlob() – Holen Sie sich die Datei in Blob (für Browserversion)
  • async Client.prototype.removeFile() - Eine Datei löschen
  • Client.prototype.createRequestedFileLink() – Erstellen Sie einen verzögerten Link

Exportieren Sie Dateien auf einen anderen Server

Um Dateien auf einen anderen Knoten zu übertragen, können Sie:

  • Kopieren Sie einfach den gesamten Speicherordner zusammen mit den Einstellungen. (Dies funktioniert möglicherweise in Zukunft nicht mehr)
  • Kopieren Sie nur den Ordner mit den Dateien. In diesem Fall müssen Sie die Funktion jedoch einmal ausführen node.normalizeFilesInfo()um alle Daten neu zu berechnen und in die Datenbank einzugeben.
  • Funktion nutzen node.exportFiles()Dadurch wird mit dem Kopieren der Dateien begonnen.

Grundlegende Knoteneinstellungen
Beim Start des Storage Nodes können Sie alle notwendigen Einstellungen vornehmen.
Ich werde die grundlegendsten beschreiben, der Rest ist auf Github zu finden.

  • storage.dataSize — Größe des Ordners mit Dateien
  • storage.tempSize — Größe des temporären Ordners
  • storage.autoCleanSize – die minimale Speichergröße, die gehalten werden muss. Wenn Sie diesen Parameter angeben, werden die am wenigsten genutzten Dateien gelöscht, sobald der Speicherplatz knapp wird.
  • file.maxSize - maximale Dateigröße
  • file.minSize — Mindestdateigröße
  • file.preferredDuplicates – bevorzugte Anzahl von Dateiduplikaten im Netzwerk
  • file.mimeWhitelist - Gültige Dateitypen
  • file.mimeBlacklist - Ungültige Dateitypen
  • file.extWhitelist - Gültige Dateierweiterungen
  • file.extBlacklist - Ungültige Dateierweiterungen
  • file.linkCache - Verschiedene Link-Caching-Einstellungen

Fast alle maßbezogenen Parameter können sowohl in absoluten als auch in relativen Werten eingegeben werden.

Arbeiten über die Kommandozeile
Die Bibliothek kann über die Kommandozeile genutzt werden. Dazu müssen Sie es global installieren: npm i -g Speicher. Anschließend können Sie die erforderlichen Aktionen aus dem Projektverzeichnis starten, in dem sich der Knoten befindet. Zum Beispiel, storacle -a storeFile -f ./file.txt -c ./config.jsum die Datei hinzuzufügen. Alle Aktionen finden Sie in https://github.com/ortexx/storacle/blob/master/bin/actions.js

Warum brauchen Sie das?

  • Wenn Sie eine Art dezentrales Projekt erstellen möchten, in dem Sie Dateien mit praktischen Methoden speichern und bearbeiten möchten. Beispielsweise verwendet das im Link am Anfang des Artikels beschriebene Musikprojekt Speicher.
  • Wenn Sie an anderen Projekten arbeiten, bei denen Sie Dateien verteilt speichern müssen. Sie können ganz einfach Ihr geschlossenes Netzwerk aufbauen, Knoten flexibel konfigurieren und bei Bedarf neue hinzufügen.
  • Wenn Sie Ihre Website-Dateien nur irgendwo speichern müssen und es Ihnen zu viel ist, alles selbst zu schreiben. Vielleicht ist diese Bibliothek in Ihrem Fall besser geeignet als andere.
  • Wenn Sie ein Projekt haben, in dem Sie mit Dateien arbeiten, aber alle Manipulationen über den Browser durchführen möchten. Sie können das Schreiben von Servercode vermeiden.

Meine Kontakte:

Source: habr.com

Kommentar hinzufügen