Storacle: almacenamiento de archivos descentralizado

Storacle: almacenamiento de archivos descentralizado

Antes de comenzar, debo irme. enlace al artículo anteriorpara que quede claro de qué estamos hablando exactamente.

En este artículo me gustaría analizar la capa responsable de almacenar archivos y cómo cualquier persona puede utilizarla. Storacle es una biblioteca independiente, no existe una conexión directa con la música. Puede organizar el almacenamiento de cualquier archivo.

En el artículo anterior, “hice rodar el barril” un poco ipfs, pero esto sucedió precisamente en el contexto del problema que estaba resolviendo. En general, creo que este proyecto es genial. Simplemente prefiero la posibilidad de crear diferentes redes para diferentes tareas. Esto le permite organizar mejor la estructura y reducir la carga en los nodos individuales y en la red en su conjunto. Incluso dentro de un proyecto, si es necesario, es posible dividir la red en partes según algunos criterios, reduciendo la carga total.

Entonces Storacle usa el mecanismo. untable para organizar una red. Características clave:

  • Los archivos se pueden agregar al repositorio a través de cualquier nodo.
  • Los archivos se guardan por completo, no en bloques.
  • Cada archivo tiene su propio hash de contenido único para seguir trabajando con él.
  • Los archivos se pueden duplicar para una mayor confiabilidad.
  • La cantidad de archivos en un nodo está limitada únicamente por el sistema de archivos (hay una excepción, más sobre esto a continuación)
  • La cantidad de archivos en la red está limitada por las capacidades distribuibles según la cantidad de nodos válidos en la red, que en la segunda versión podrá trabajar con una cantidad infinita de nodos (más sobre esto en otro artículo)

Un ejemplo sencillo de cómo funciona esto generalmente desde el programa:

Servidor:

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

Cliente:

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

Vista interior

No hay nada lujoso debajo del capó. La información sobre la cantidad de archivos, su tamaño total y otros puntos se almacena en una base de datos en memoria y se actualiza cuando se eliminan y agregan archivos, por lo que no es necesario acceder con frecuencia al sistema de archivos. Una excepción es habilitar el recolector de basura cuando necesita circular archivos cuando se alcanza un cierto tamaño de almacenamiento, y no prohibir agregar otros nuevos. En este caso, debe omitir el almacenamiento y trabajar con una gran cantidad de archivos (> digamos un millón) puede generar cargas significativas. Y es mejor almacenar menos archivos y ejecutar más nodos. Si el "limpiador" está desactivado, entonces no existe tal problema.

El almacenamiento de archivos consta de 256 carpetas y 2 niveles de anidamiento. Los archivos se almacenan en carpetas de segundo nivel. Es decir, si hay 1 millón. Habrá alrededor de 62500 archivos en cada carpeta (1000000 / sqrt(256)).

Los nombres de las carpetas se forman a partir del hash del archivo para que pueda acceder rápidamente a él si conoce el hash.

Esta estructura se eligió en función de una gran cantidad de requisitos de almacenamiento diferentes: soporte para sistemas de archivos débiles, donde no es deseable tener muchos archivos en una carpeta, recorrido rápido de todas las carpetas si es necesario, etc. Una especie de media dorada.

almacenamiento en caché

Al agregar archivos, así como al recibirlos, los enlaces a los archivos se escriben en el caché.
Gracias a esto, muy a menudo no es necesario recorrer toda la red en busca de un archivo. Esto acelera la recepción de enlaces y reduce la carga en la red. El almacenamiento en caché también se produce mediante encabezados http.

isomorfia

El cliente está escrito en javascript y es isomórfico, se puede utilizar directamente desde el navegador. 
Puedes subir el archivo https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js como guión y acceso ventana.ClientStoracle o importar a través del sistema de compilación, etc.

Enlaces diferidos

Una característica interesante es también la "referencia diferida". Este es un enlace a un archivo que se puede obtener sincrónicamente, aquí y ahora, y el archivo se recuperará cuando ya se encuentre en el almacenamiento. Esto es muy conveniente cuando, por ejemplo, necesita mostrar algunas imágenes en el sitio. Simplemente ponemos un enlace diferido en src y listo. Puedes encontrar muchos casos.

API de cliente

  • Asincrónico Cliente.prototipo.storeFile() - guardando el archivo
  • Asincrónico Cliente.prototipo.getFileLink() — obtener un enlace directo al archivo
  • Asincrónico Cliente.prototipo.getFileLinks() — obtener una lista de enlaces directos a un archivo desde todos los nodos donde existe
  • Asincrónico Cliente.prototype.getFileToBuffer() — colocar el archivo en el búfer
  • Asincrónico Cliente.prototipo.getFileToPath() — obtener un archivo en el sistema de archivos
  • Asincrónico Cliente.prototipo.getFileToBlob() — obtener el archivo en blob (para la versión del navegador)
  • Asincrónico Cliente.prototipo.removeFile() - eliminar un archivo
  • Cliente.prototipo.createRequestedFileLink() — crear un enlace diferido

Exportar archivos a otro servidor

Para transferir archivos a otro nodo, puede:

  • Simplemente copie toda la carpeta de almacenamiento junto con la configuración. (Esto puede no funcionar en el futuro)
  • Copie solo la carpeta con archivos. Pero, en este caso, necesitarás ejecutar la función una vez. nodo.normalizeFilesInfo()para recalcular todos los datos e ingresarlos en la base de datos.
  • función de uso nodo.exportarArchivos()que comenzará a copiar archivos.

Configuración básica del nodo
Al iniciar el nodo de almacenamiento, puede especificar todas las configuraciones necesarias.
Describiré los más básicos, el resto se puede encontrar en Github.

  • almacenamiento.tamaño de datos — tamaño de la carpeta con archivos
  • almacenamiento.tempSize — tamaño de carpeta temporal
  • almacenamiento.autoCleanSize — el tamaño mínimo de almacenamiento que debe mantenerse. Si especifica este parámetro, tan pronto como el espacio comience a agotarse, se eliminarán los archivos menos utilizados.
  • archivo.maxSize - Tamaño máximo de archivo
  • archivo.minTamaño — tamaño mínimo de archivo
  • archivo.preferidoDuplicados — número preferido de archivos duplicados en la red
  • archivo.mimeLista blanca - tipos de archivos válidos
  • archivo.mimeLista negra - tipos de archivos no válidos
  • archivo.extLista blanca - extensiones de archivo válidas
  • archivo.extLista negra - extensiones de archivo no válidas
  • archivo.linkCache - varias configuraciones de almacenamiento en caché de enlaces

Casi todos los parámetros relacionados con las dimensiones se pueden ingresar tanto en valores absolutos como relativos.

Trabajar a través de la línea de comando
La biblioteca se puede utilizar a través de la línea de comando. Para hacer esto necesitas instalarlo globalmente: npm i -g almacenamiento. Después de esto, puedes iniciar las acciones necesarias desde el directorio del proyecto donde se encuentra el nodo. Por ejemplo, almacenamiento -a storeFile -f ./file.txt -c ./config.jspara agregar el archivo. Todas las acciones se pueden encontrar en https://github.com/ortexx/storacle/blob/master/bin/actions.js

¿Por qué podrías necesitar esto?

  • Si desea crear algún tipo de proyecto descentralizado en el que planea almacenar y trabajar con archivos utilizando métodos convenientes. Por ejemplo, el proyecto musical descrito en el enlace al principio del artículo utiliza almacén.
  • Si trabaja en otros proyectos en los que necesita almacenar archivos de forma distribuida. Puede construir fácilmente su red cerrada, configurar nodos de manera flexible y agregar otros nuevos cuando sea necesario.
  • Si solo necesita almacenar los archivos de su sitio web en algún lugar y es demasiado para usted escribirlo todo usted mismo. Quizás esta biblioteca sea más adecuada que otras en su caso.
  • Si tiene un proyecto en el que trabaja con archivos, pero desea realizar todas las manipulaciones desde el navegador. Puede evitar escribir código de servidor.

Mis contactos:

Fuente: habr.com

Añadir un comentario