Storacle - αποκεντρωμένη αποθήκευση αρχείων

Storacle - αποκεντρωμένη αποθήκευση αρχείων

Πριν ξεκινήσω, πρέπει να φύγω σύνδεσμος στο προηγούμενο άρθροώστε να είναι ξεκάθαρο για τι ακριβώς μιλάμε.

Σε αυτό το άρθρο θα ήθελα να εξετάσω το επίπεδο που είναι υπεύθυνο για την αποθήκευση αρχείων και πώς μπορεί να χρησιμοποιηθεί από οποιονδήποτε. Η Storacle είναι μια αυτόνομη βιβλιοθήκη, δεν υπάρχει άμεση σχέση με τη μουσική. Μπορείτε να οργανώσετε την αποθήκευση οποιωνδήποτε αρχείων.

Στο προηγούμενο άρθρο, «κύλησα το βαρέλι» λίγο σφάλματα μη έγκυρης σελίδας, αλλά αυτό συνέβη ακριβώς στο πλαίσιο του προβλήματος που έλυνα. Γενικά, νομίζω ότι αυτό το έργο είναι ωραίο. Απλώς προτιμώ τη δυνατότητα δημιουργίας διαφορετικών δικτύων για διαφορετικές εργασίες. Αυτό σας επιτρέπει να οργανώσετε καλύτερα τη δομή και να μειώσετε το φορτίο σε μεμονωμένους κόμβους και στο δίκτυο συνολικά. Ακόμη και στο πλαίσιο ενός έργου, εάν είναι απαραίτητο, μπορείτε να χωρίσετε το δίκτυο σε κομμάτια σύμφωνα με ορισμένα κριτήρια, μειώνοντας το συνολικό φορτίο.

Οπότε το storacle χρησιμοποιεί τον μηχανισμό επάλειψη για την οργάνωση ενός δικτύου. Βασικά χαρακτηριστικά:

  • Τα αρχεία μπορούν να προστεθούν στο αποθετήριο μέσω οποιουδήποτε κόμβου.
  • Τα αρχεία αποθηκεύονται εξ ολοκλήρου, όχι σε μπλοκ.
  • Κάθε αρχείο έχει το δικό του μοναδικό κατακερματισμό περιεχομένου για περαιτέρω εργασία μαζί του.
  • Τα αρχεία μπορούν να αντιγραφούν για μεγαλύτερη αξιοπιστία
  • Ο αριθμός των αρχείων σε έναν κόμβο περιορίζεται μόνο από το σύστημα αρχείων (υπάρχει μια εξαίρεση, περισσότερα για αυτό παρακάτω)
  • Ο αριθμός των αρχείων στο δίκτυο περιορίζεται από τις δυνατότητες διασποράς σύμφωνα με τον αριθμό των έγκυρων κόμβων στο δίκτυο, οι οποίοι στη δεύτερη έκδοση θα μπορούν να λειτουργούν με άπειρο αριθμό κόμβων (περισσότερα για αυτό σε άλλο άρθρο)

Ένα απλό παράδειγμα του πώς λειτουργεί γενικά από το πρόγραμμα:

Υπηρέτης:

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

Πελάτης:

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

Εσωτερική όψη

Δεν υπάρχει τίποτα φανταχτερό κάτω από την κουκούλα. Οι πληροφορίες σχετικά με τον αριθμό των αρχείων, το συνολικό τους μέγεθος και άλλα σημεία αποθηκεύονται σε μια βάση δεδομένων στη μνήμη και ενημερώνονται όταν τα αρχεία διαγράφονται και προστίθενται, επομένως δεν χρειάζεται να έχετε συχνή πρόσβαση στο σύστημα αρχείων. Εξαίρεση αποτελεί η ενεργοποίηση του συλλέκτη απορριμμάτων όταν χρειάζεται να κυκλοφορήσετε αρχεία όταν επιτευχθεί ένα συγκεκριμένο μέγεθος αποθήκευσης και όχι να απαγορεύσετε την προσθήκη νέων. Σε αυτήν την περίπτωση, πρέπει να παρακάμψετε τον χώρο αποθήκευσης και η εργασία με μεγάλο αριθμό αρχείων (> ας πούμε ένα εκατομμύριο) μπορεί να οδηγήσει σε σημαντικά φορτία. Και είναι καλύτερο να αποθηκεύετε λιγότερα αρχεία και να τρέχετε περισσότερους κόμβους. Εάν η "καθαρίστρια" είναι απενεργοποιημένη, τότε δεν υπάρχει τέτοιο πρόβλημα.

Η αποθήκευση αρχείων αποτελείται από 256 φακέλους και 2 επίπεδα ένθεσης. Τα αρχεία αποθηκεύονται σε φακέλους δεύτερου επιπέδου. Δηλαδή αν είναι 1 εκατομμύριο. Θα υπάρχουν περίπου 62500 αρχεία σε κάθε τέτοιο φάκελο (1000000 / sqrt(256)).

Τα ονόματα των φακέλων σχηματίζονται από τον κατακερματισμό του αρχείου, ώστε να μπορείτε να έχετε γρήγορη πρόσβαση σε αυτόν εάν γνωρίζετε τον κατακερματισμό.

Αυτή η δομή επιλέχθηκε με βάση έναν μεγάλο αριθμό διαφορετικών απαιτήσεων αποθήκευσης: υποστήριξη για αδύναμα συστήματα αρχείων, όπου δεν είναι επιθυμητό να υπάρχουν πολλά αρχεία σε έναν φάκελο, γρήγορη διέλευση όλων των φακέλων εάν είναι απαραίτητο, κ.λπ. Κάποιο χρυσό μέσο.

Προσωρινή αποθήκευση

Κατά την προσθήκη αρχείων, καθώς και κατά τη λήψη τους, οι σύνδεσμοι προς τα αρχεία εγγράφονται στην κρυφή μνήμη.
Χάρη σε αυτό, πολύ συχνά δεν χρειάζεται να διασχίσετε ολόκληρο το δίκτυο αναζητώντας ένα αρχείο. Αυτό επιταχύνει τη λήψη συνδέσμων και μειώνει το φορτίο στο δίκτυο. Η προσωρινή αποθήκευση πραγματοποιείται επίσης μέσω των κεφαλίδων http.

Ισομορφία

Ο πελάτης είναι γραμμένος σε javascript και είναι ισόμορφος, μπορεί να χρησιμοποιηθεί απευθείας από το πρόγραμμα περιήγησης. 
Μπορείτε να ανεβάσετε το αρχείο https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js ως σενάριο και πρόσβαση παράθυρο.ClientStoracle ή εισαγωγή μέσω του συστήματος κατασκευής κ.λπ.

Αναβαλλόμενοι σύνδεσμοι

Ένα ενδιαφέρον χαρακτηριστικό είναι επίσης η "αναβαλλόμενη αναφορά". Αυτός είναι ένας σύνδεσμος προς ένα αρχείο που μπορεί να ληφθεί συγχρονισμένα, εδώ και τώρα, και το αρχείο θα ανασυρθεί όταν βρεθεί ήδη στο χώρο αποθήκευσης. Αυτό είναι πολύ βολικό όταν, για παράδειγμα, πρέπει να εμφανίσετε μερικές φωτογραφίες στον ιστότοπο. Απλώς βάλαμε έναν αναβαλλόμενο σύνδεσμο στο src και αυτό είναι. Μπορείτε να καταλήξετε σε πολλές περιπτώσεις.

Client API

  • Async Client.prototype.storeFile() - αποθήκευση του αρχείου
  • Async Client.prototype.getFileLink() — λήψη απευθείας συνδέσμου με το αρχείο
  • Async Client.prototype.getFileLinks() — λήψη μιας λίστας άμεσων συνδέσμων σε ένα αρχείο από όλους τους κόμβους όπου υπάρχει
  • Async Client.prototype.getFileToBuffer() — μεταφέρετε το αρχείο στο buffer
  • Async Client.prototype.getFileToPath() — λάβετε ένα αρχείο στο σύστημα αρχείων
  • Async Client.prototype.getFileToBlob() — λάβετε το αρχείο σε blob (για έκδοση προγράμματος περιήγησης)
  • Async Client.prototype.removeFile() - διαγράψτε ένα αρχείο
  • Client.prototype.createRequestedFileLink() — δημιουργήστε έναν αναβαλλόμενο σύνδεσμο

Εξαγωγή αρχείων σε άλλο διακομιστή

Για να μεταφέρετε αρχεία σε άλλο κόμβο, μπορείτε:

  • Απλώς αντιγράψτε ολόκληρο τον φάκελο αποθήκευσης μαζί με τις ρυθμίσεις. (αυτό μπορεί να μην λειτουργήσει στο μέλλον)
  • Αντιγράψτε μόνο το φάκελο με αρχεία. Αλλά, σε αυτήν την περίπτωση, θα χρειαστεί να εκτελέσετε τη λειτουργία μία φορά node.normalizeFilesInfo()για να υπολογίσετε ξανά όλα τα δεδομένα και να τα εισαγάγετε στη βάση δεδομένων.
  • λειτουργία χρήσης node.exportFiles()που θα ξεκινήσει την αντιγραφή αρχείων.

Βασικές ρυθμίσεις κόμβου
Κατά την εκκίνηση του κόμβου αποθήκευσης, μπορείτε να καθορίσετε όλες τις απαραίτητες ρυθμίσεις.
Θα περιγράψω τα πιο βασικά, τα υπόλοιπα θα τα βρείτε στο Github.

  • αποθήκευση.dataSize — μέγεθος του φακέλου με αρχεία
  • αποθήκευση.tempΜέγεθος — προσωρινό μέγεθος φακέλου
  • storage.autoCleanSize — το ελάχιστο μέγεθος αποθήκευσης που πρέπει να διατηρηθεί. Εάν καθορίσετε αυτήν την παράμετρο, τότε μόλις αρχίσει να εξαντλείται ο χώρος, τα αρχεία που χρησιμοποιούνται λιγότερο θα διαγραφούν.
  • αρχείο.maxSize — μέγιστο μέγεθος αρχείου
  • file.minSize — ελάχιστο μέγεθος αρχείου
  • file.preferredDuplicates — προτιμώμενος αριθμός διπλότυπων αρχείων στο δίκτυο
  • file.mimeWhitelist - έγκυροι τύποι αρχείων
  • file.mimeBlacklist - Μη έγκυροι τύποι αρχείων
  • file.extWhitelist - έγκυρες επεκτάσεις αρχείων
  • file.extBlacklist - Μη έγκυρες επεκτάσεις αρχείων
  • file.linkCache - διάφορες ρυθμίσεις προσωρινής αποθήκευσης συνδέσμων

Σχεδόν όλες οι παράμετροι που σχετίζονται με διαστάσεις μπορούν να εισαχθούν τόσο σε απόλυτες όσο και σε σχετικές τιμές.

Εργασία μέσω της γραμμής εντολών
Η βιβλιοθήκη μπορεί να χρησιμοποιηθεί μέσω της γραμμής εντολών. Για να το κάνετε αυτό, πρέπει να το εγκαταστήσετε καθολικά: npm i -g storacle. Μετά από αυτό, μπορείτε να ξεκινήσετε τις απαραίτητες ενέργειες από τον κατάλογο του έργου όπου βρίσκεται ο κόμβος. Για παράδειγμα, storacle -a storeFile -f ./file.txt -c ./config.jsγια να προσθέσετε το αρχείο. Όλες οι ενέργειες βρίσκονται στο https://github.com/ortexx/storacle/blob/master/bin/actions.js

Γιατί μπορεί να χρειαστείτε αυτό;

  • Εάν θέλετε να δημιουργήσετε κάποιο είδος αποκεντρωμένου έργου στο οποίο σκοπεύετε να αποθηκεύσετε και να εργαστείτε με αρχεία χρησιμοποιώντας βολικές μεθόδους. Για παράδειγμα, το μουσικό έργο που περιγράφεται στον σύνδεσμο στην αρχή του άρθρου χρησιμοποιεί αποθήκη.
  • Εάν εργάζεστε σε άλλα έργα όπου πρέπει να αποθηκεύετε αρχεία με κατανεμημένο τρόπο. Μπορείτε να δημιουργήσετε εύκολα το κλειστό σας δίκτυο, να διαμορφώσετε ευέλικτα κόμβους και να προσθέσετε νέους όταν χρειάζεται.
  • Αν χρειάζεται απλώς να αποθηκεύσετε τα αρχεία του ιστότοπού σας κάπου και είναι πολύ για σας να γράψετε τα πάντα μόνοι σας. Ίσως αυτή η βιβλιοθήκη είναι πιο κατάλληλη από άλλες στην περίπτωσή σας.
  • Εάν έχετε ένα έργο στο οποίο εργάζεστε με αρχεία, αλλά θέλετε να εκτελέσετε όλους τους χειρισμούς από το πρόγραμμα περιήγησης. Μπορείτε να αποφύγετε τη σύνταξη κώδικα διακομιστή.

Οι επαφές μου:

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο