# Sistema de archivos distribuido

Un sistema de archivos distribuido o sistema de archivos de red es un sistema de archivos de computadoras que sirve para compartir archivos, impresoras y otros recursos como un almacenamiento persistente en una red de computadoras. El primer sistema de este tipo fue desarrollado en la década de 1970, y en 1985 Sun Microsystems creó el sistema de archivos de red NFS, que fue ampliamente utilizado como sistema de archivos distribuido. Otros sistemas notables utilizados fueron el sistema de archivos Andrew (AFS) y el sistema Server Message Block (SMB), también conocido como CIFS.
Un sistema de archivos distribuido es una solución para almacenar y acceder a datos basada en una arquitectura cliente/servidor. Los datos se almacenan en un dispositivo de almacenamiento central, pero se accede a ellos y se procesan como si estuvieran almacenados en una máquina cliente local. Con un sistema de archivos distribuido, los usuarios en la misma red comparten fácilmente información en los archivos de manera controlada y autorizada.
Un sistema de archivos distribuido va a permitir almacenar y acceder a archivos remotos como si fueran locales, esto sin notar pérdidas en el rendimiento. Este sistema es útil cuando es necesario que los usuarios tengan acceso a información compartida en diferentes ubicaciones de forma ininterrumpida.
Una de las ventajas de este tipo de sistemas es que se puede optimizar la carga de la red para que los nodos con mucho tráfico deriven recursos compartidos a otras ubicaciones de la red con lo cual se minimiza el riesgo de cuello de botella y se optimiza la velocidad de acceso a la información.
Una de las desventajas de este tipo de sistemas es que, al igual que el mismo sistema operativo del sistema distribuido, los sistemas de archivo suelen ser muy complejos, ya que muchas veces hay que llevar a cabo la sincronización de la lectura y escritura con el fin de proteger la integridad de los datos.

## Historia

El desarrollo de sistemas computacionales surgió primero de forma centralizada, es decir, una sola computadora que trabaja de manera autónoma desde un lugar específico. La interacción era estática y el funcionamiento enfocado a trabajos muy específicos. A gran escala, un sistema trabajaba de la manera siguiente: se ingresaban los datos de entrada (tarjetas perforadas o cintas magnéticas), se esperaba a que la computadora procesara esas entradas y, cuando terminaba, regresaba los resultados obtenidos.
Después se desarrollaron sistemas operativos con modelos de tiempo compartido y la implementación de varias terminales conectadas a una computadora que se evolucionó a una manera más interactiva para el usuario y menos centralizada, pues ya no era necesario que los usuarios del sistema se encontraran presencialmente en el mismo lugar que el sistema; sólo necesitaba que su terminal estuviera conectada a la computadora central.
Aunque trabajar con terminales remotas ya era un avance, el problema era que el número de estas que podían estar conectadas a una computadora era limitado. Es por eso por lo que al abaratarse los precios de las estaciones de trabajo se dejó de trabajar con terminales y se optó por compartir y acceder a la información a través de una red, como la Ethernet. Así es como comienza el concepto de sistema de archivos distribuidos, con el objetivo de disponer de una manera conveniente y eficiente para compartir la información en una red local.
Los sistemas de archivos distribuidos surgieron con la necesidad de tener acceso de forma más rápida a archivos que se encontraban en otros equipos, ya que antes la forma de compartir archivos era mediante disquetes: se copiaba el archivo original a este y posteriormente se colocaba una copia al otro dispositivo. Esto no era del todo eficiente, ya que se necesitaban disponer de estos dispositivos de almacenamiento. Por ello, se comenzó a utilizar FTP (File Transfer Protocol), que eliminaba la necesidad de usar dispositivos extraíbles, pero seguía planteando el problema de tener varias copias de un archivo, en este caso el archivo original se debía copiar al servidor y posteriormente del servidor a la computadora destino. Este no era el único problema, ya que para poder comprar los archivos era necesario contar con las direcciones físicas de los equipos.

## Clasificaciones de los sistemas de archivos

Existen cuatro principales clasificaciones de sistemas de archivos y cada una de ellas contiene subdivisiones o categorías.
La primera clasificación contine dos clases principales:
* Servidor de archivos real: es un sistema de archivos completo, reconoce nombres de archivos textuales y administra directorios de archivos para usuarios.
* Servidor de almacenamiento: este almacena datos en objetos no estructurados haciendo que únicamente sean accesibles por identificadores primitivos.
En esta siguiente, sus clases están basadas en tres parámetros (acceso a unidad de datos, unidad de bloqueo y ámbito de actualizaciones atómicas.
* Sistema de archivos simple
* Sistema de archivos universal
* Servidor de soporte de administración para bases de datos
Esta clasificación tres cuenta con dos tipos:
* Servicio tradicional de archivos: los archivos pueden ser abiertos, leídos y reescritos.
* Servicio de archivos robusto: para aplicaciones que requieren una alta fiabilidad
En la última clasificación se encuentran los sistemas de archivos distribuidos y la transferencia de archivos explícita. Esta clasificación está asociada a la primera y toma acceso remoto de archivos en consideración:
* Transferencia de archivos explícita: el cliente debe invocar una utilidad de transferencia de archivo para transferir un archivo remoto.
* Sistema de archivos distribuido: la ubicación del archivo es transparente a los usuarios, los cuales hacen referencia al archivo por su nombre. Ubica el servidor que almacena el archivo referenciado, hace las operaciones orientadas a la seguridad, como la autenticación, sincronizar el acceso al archivo y transferir el archivo. Por razones de desempeño algunos datos y directorios son almacenados en caché, y por fiabilidad algunos son replicados.

## Servicios que proporciona un sistema de archivos distribuido

Los sistemas de archivos son muy importantes en los sistemas operativos pues actúan como una interfaz entre el mismo sistema y todos los dispositivos conectados al equipo ya sean, dispositivos internos o externos.
Un servidor de archivos proporciona los siguientes servicios.
* Copia de respaldo y recuperación automática: realizado como medida preventiva contra fallas del medio y errores de usuario.
* Movilidad de usuario: permitir al usuario el uso de un entorno de trabajo independiente de la computadora o de la ubicación sin necesidad de dispositivos de almacenamiento secundario.
* Estaciones de trabajo sin disco: son deseadas debido a que generan menos calor y menor ruido.
* Transparencia de escalabilidad: Los usuarios pueden acceder a los archivos sin preocuparse por la cantidad de nodos de almacenamiento o su ubicación. La escalabilidad del sistema de archivos se maneja de manera transparente.
* Manejo de la concurrencia: El sistema de archivos distribuido gestiona la concurrencia, permitiendo que múltiples usuarios accedan y modifiquen archivos simultáneamente de manera coordinada y consistente.
* Manejo de fallos: Proporciona mecanismos para la detección y recuperación de fallos. Si un nodo de almacenamiento falla, el sistema de archivos distribuido debe ser capaz de mantener la integridad y disponibilidad de los datos.

## Componentes de un sistema de archivos distribuido

Este tipo de sistema tiene dos componentes que son esencialmente importantes;
* Servidor de archivos: es el encargado de las operaciones que se pueden hacer sobre los archivos individuales, tales como la lectura, escritura o modificación de archivos. Dentro de los aspectos importantes se encuentra la administración de los atributos, esta es información que no es parte del archivo mismo. El servidor de archivos también es el responsable de la protección contra accesos no permitidos, donde se puede hacer uso de las listas de control de acceso.
* Servidor de directorios: es el que ofrece las operaciones que pueden realizarse sobre los directorios, como la creación y borrado de directorios, así como de copiar y mover los archivos entre los directorios. También es el responsable de resolver el nombre de los archivos porque debe de proveer transparencia de los nombres con respecto a la localización, y debe de ofrecer nombres de dos niveles, nombres simbólicos y nombres binarios, también administra la organización de los archivos en un sistema jerárquico y por último ese encarga de manejar los enlaces lógicos y físicos.
La búsqueda de nombres puede darse de las siguientes maneras:
* Búsqueda iterativa: el cliente envía el nombre al servidor, este realiza la traducción hasta que termina en un componente que pertenece a otro servidor, finalmente el servidor envía el resultado al cliente, el cual si no ha terminado la traducción continua con el servidor correspondiente.
* Búsqueda automática o recursiva: el cliente manda el nombre al servidor, este comienza a contactarse con los demás servidores y el último de ellos devuelve el resultado al servidor anterior y así sucesivamente, hasta llegar al primer servidor que es con el que el cliente se contacto para que este primer servidor sea quien le devuelva la respuesta al cliente.
* Búsqueda transitiva: los sistemas implicados se contactan para llevar a cabo la traducción y el último servidor es el que devuelve la solución al cliente. Este tipo de resolución rompe el modelo cliente/servidor.

## Requisitos de un sistema de archivos distribuido

Inicialmente se ofrecían como requisitos la transparencia de acceso y la transparencia de ubicación, los demás requisitos fueron surgiendo en fases posteriores del desarrollo. Entre los principales requisitos a considerar para el desarrollo de un sistema de archivos distribuido se encuentran:
* Transparencia: Se refiere al encubrimiento de la separación de los componentes en un sistema distribuido al usuario y al programador de la aplicación, de modo que el sistema se perciba como un todo y no como una colección de componentes independientes. Los tipos de transparencia que requiere un SAD son:
** De acceso:Los programas clientes no deben estar al tanto de la distribución de archivos. Se proporciona un conjunto único de operaciones para acceder a archivos locales y remotos. Los programas escritos para operar en archivos locales pueden acceder a archivos remotos sin necesidad de modificaciones.
** De ubicación:Los programas clientes deben ver un espacio de nombres de archivo (namespace) uniforme. Los archivos o grupos de archivos pueden ser reubicados sin cambiar sus nombres de ruta, y los programas de usuario en el mismo espacio de nombres dondequiera que se ejecuten.
** De movilidad: Ni los programas clientes ni las tablas de administración del sistema en los nodos clientes necesitan ser cambiados cuando los archivos son movidos. Esto permite la movilidad de archivos, archivos o conjuntos o volúmenes de archivos pueden ser movidos, ya sea por los administradores del sistema o automáticamente.
** De rendimiento:Los programas clientes deben seguir funcionando de manera satisfactoria mientras que la carga en el servicio varía dentro de un rango especificado.
** De escalabilidad: El servicio puede ser ampliado mediante el crecimiento incremental para tratar con una amplia gama de cargas y tamaños de red.
* Heterogeneidad: las interfaces del servicio deben de estar definidas de tal modo que el software del cliente y el del servidor puedan estar implementadas en diferentes sistemas operativo, este es un aspecto importante dentro de la extensibilidad.
* Concurrencia: hace referencia a que los cambios realizados por un cliente no deben de interferir con la operación de otros clientes que accedan o modifiquen simultáneamente el mismo archivo.
* Eficiencia: el rendimiento debe de ser parecido al de un sistema de archivos local, ya que debe de proporcionar un servicio que sea comparable o mejor que los sistemas de archivos locales. Debe ser adecuado para administrar, proporcionando operaciones y herramientas que permitan a los administradores del sistema instalar y operar un sistema de una manera conveniente.
* Seguridad: los sistemas de archivos proporcionan un sistema de control de acceso, los cuales están basados en el uso de listas de control de acceso. Dentro de los sistemas de archivos distribuidos surge la necesidad de autenticar las solicitudes de un cliente, por lo que el control de acceso en el servidor se basa en identificar al usuario correcto y también se encarga de proteger el contenido de los mensajes de solicitud y respuesta a través de formas digitales y de encriptación de datos.
* Tolerancia a fallos: una de las funciones importantes en los sistemas de archivos distribuidos es que este siga funcionando aunque haya fallos del cliente o del servidor. Los servidores pueden ser sin estado, lo que significa que pueden ser reiniciados y el servicio establecido sin la necesidad de recuperar el estado previo.
* Replicación: en un servicio de archivos que soporta replicación, un archivo puede estar representado por varias copias de su contenido en diferentes ubicaciones, lo cual trae consigo dos beneficios, ya que permite que múltiples servidores compartan la carga de proporcionar un servicio a los clientes que acceden al mismo conjunto de archivos, mejorando así la escalabilidad del servicio y también la tolerancia a fallos, lo que permite a los clientes localizar otro servidor en donde esta guardada una copia del archivo cuando falló el primer servidor al que intentó acceder.
* Consistencia: hace referencia a que todos los procesos ven el mismo archivo. En caso de haber una replicación, los cambios tardan en propagarse, por lo que la consistencia puede ser menor.

## Sistemas de archivos distribuidos
### AFS

El Andrew file system es un sistema de archivos distribuido comercial (CMU 1983, Transarc 1989, IBM 1998) para compartir archivos de manera transparente, escalable e independiente de la ubicación real.
Características
* Para archivos compartidos que no son frecuentemente actualizados (como ser comandos UNIX o librerías) y para archivos que normalmente son accedidos por un único usuario (como ser el home directory y su subárbol), las copias localmente cacheadas permanecerán válidas por largos períodos. En el primer caso por ser poco actualizados y el segundo porque la actualización se lleva a cabo en la propia estación de trabajo. Esta clase de archivos representa la gran mayoría de los accesos.
* El caché local debe tener tamaño suficiente para almacenar un conjunto de archivos de trabajo que asegure que los archivos de uso regular en una estación de trabajo se encuentran disponibles en forma local.
* La estrategia de diseño está basada en algunas suposiciones acerca del tamaño promedio y máximo de archivos y el tipo de acceso, basadas en observaciones en ámbitos académicos.
** Los archivos son pequeños, usualmente menores que 10K.
** Las operaciones de lectura son alrededor de 6 veces más frecuentes que las de escritura.
** Son comunes los accesos secuenciales y raros los accesos random.
** La mayoría de los archivos son escritos por un único usuario. Cuando los archivos se comparten, usualmente un solo usuario es el que lo modifica.
** Los archivos son referenciados en ráfagas. Si un archivo ha sido referenciado recientemente, hay entonces gran probabilidad de que sea referenciado nuevamente en un futuro cercano
Implementaciones de AFS:
* OpenAFS: Versión open-source de AFS (IBM 2000).
* XCoda: Sistema de archivos distribuido experimental open-source derivativo de AFS (CMU 1987). Se distingue por soportar dispositivos móviles.

### Ceph

Ceph File System es un sistema de archivos distribuido libre, está diseñado para el uso con gran cantidad de datos, está muy enfocado para el uso con macrodatos (Big Data, en idioma inglés). Ceph tiene como objetivo ser POSIX-compatible y completamente distribuido sin ningún punto único de fallo. Los datos tienen replicación libre de errores, haciéndolo tolerante de fallos.

### DCE DFS

DCE Distributed File System es un sistema de ficheros distribuido de DCE que permite agrupar archivos repartidos en diferentes máquinas, en un espacio de nombres único. Está basado casi por completo en el sistema de ficheros AFS pero con ligeras diferencias.

### NFS

Primer sistema comercial de archivos en red (Sun Microsystems, 1984) estándar, multiplataforma que permite acceder y compartir archivos en una red C/S heterogénea como si estuvieran en un solo disco, es decir, montar un directorio de una máquina remota en una máquina local.
Las ventajas que tiene NFS en cuanto a sistemas distribuidos son, transparencia de acceso, como se describe anteriormente, permite el acceso remoto como si los archivos estuvieran en un sistema local, además es compatible con una gran variedad de sistemas y también es altamente escalable.

### HDFS

Es el componente principal de Hadoop, hace posible almacenar conjuntos de datos masivos con tipos de datos estructurados, semiestructurados y no estructurados. Está optimizado para almacenar grandes cantidades de datos y mantener varias copias para garantizar una alta disponibilidad y tolerancia a fallos.
Está basado en Java, que permite una visión de los recursos como una sola unidad. Para ello crea una capa de abstracción como un sistema de archivos único. Se encarga de almacenar los datos en varios nodos manteniendo sus metadatos, distribuir los datos en varios nodos de almacenamiento aumenta la velocidad de procesamiento, el paralelismo en las operaciones y permite la replicación de los datos.

#### Características

* Los archivos se almacenan en bloques de 128 MB, y estos se distribuyen en los nodos que forman el clúster.
* Para conseguir una alta escalabilidad, usa almacenamiento local que escala horizontalmente. Aumentar el espacio de almacenamiento solamente supone añadir discos duros a nodos existentes o más nodos al sistema. Tienen un coste reducido, al tratarse de hardware básico con almacenamiento conectado.
* En el caso de la integridad de los datos, almacena por defecto 3 copias de cada bloque de datos. Aunque la replicación de datos no es necesaria para el funcionamiento de HDFS, almacenar solamente una copia podría suponer pérdida de datos por fallos o corrupción de archivos, eliminando la durabilidad del dato.
* Se trata de un sistema de archivos jerárquico, es decir, el usuario debe crear primero un directorio, dentro del cual se podrán crear, eliminar, mover o renombrar archivos.

#### Arquitectura y componentes

Es de tipo maestro-esclavo, basado en dos componentes principales: NameNodes y DataNodes.
* NameNode (NN): es el maestro o nodo principal del sistema. Se encarga de gestionar su acceso y almacenar sus metadatos. Por tanto, necesita menos espacio de disco pero más recursos computacionales (memoria y CPU).Es el único nodo que conoce la lista de archivos y directorios del clúster. En Hadoop 2 se introduce el concepto de alta disponibilidad evitando que exista un único punto de fallo en el sistema, HDFS se puede configurar para que exista un NN primario activo y otro secundario en espera (o más en Hadoop 3) que actúa como esclavo. Este último toma el control y responde a las peticiones de los clientes si se detecta algún fallo o el nodo primario deja de estar disponible. Los nodos deben estar sincronizados y tener los mismos metadatos almacenados.
* DataNode (DN): corresponde con los nodos del clúster que almacenan los datos. Se encarga de gestionar el almacenamiento del nodo. Generalmente usan hardware básico con varios discos y una gran capacidad.

#### Funcionamiento

Tiene un modelo Write once, read many. Significa que no se pueden editar archivos almacenados, pero sí se pueden añadir datos.
En las operaciones de escritura, el cliente debe comunicar la instrucción previamente al NN, este comprueba los permisos y responde entonces al cliente con la dirección de los DN en los que el cliente deberá empezar a escribir. El primer DN copiará el bloque a otro DN, que copiará a un tercero. Una vez que se completaron todas las copias, se enviará al cliente la confirmación de escritura.
Las operaciones de lectura, el cliente pide al NN la localización de un archivo. Una vez comprobados los permisos, el NN envía la localización de los DN que contienen los bloques que componen el archivo al cliente. También envía un token de seguridad que usará en los DN como autenticación.

### Sistema de archivos Cassandra

El sistema de archivos Cassandra (CFS) es un sistema de archivos compatible con HDFS construido para reemplazar los demonios tradicionales Hadoop NameNode, Secondary NameNode y DataNode.
Sus principales objetivos son, simplificar la sobrecarga operativa de Hadoop eliminando los puntos únicos de falla en Hadoop NameNode, ofrecer una integración sencilla de Hadoop para los usuarios de Cassandra.
Se modela como un espacio de claves con dos familias de columnas en Cassandra. El espacio de claves es donde se encuentran las configuraciones de replicación, por lo que, a diferencia de HDFS, no puede cambiar la replicación por archivo. Las dos familias de columnas representan los dos servicios HDFS principales.
* Servicio HDFS NameNode: rastrea los metadatos de cada archivo y las ubicaciones de los bloques, se reemplaza con la familia de columnas “inodo”.
* Servicio HDFS DataNode: almacena bloques de archivos, se reemplaza con la familia de columnas “sblocks”.
La familia de columnas ‘inodo’ contiene metainformación sobre un archivo, esta metainformación incluye:
* nombre del archivo
* ruta principal
* usuario
* grupo
* permisos
* tipo de archivo
* una lista de identificadores de bloque que componen el archivo
Utiliza un Comparador DynamicCompositeType. Para los identificadores de bloque, usa TimeUUID por lo que los bloques se ordenan secuencialmente de forma natural.
Los índices secundarios se utilizan para admitir operaciones. El centinela es necesario debido a cómo Cassandra implementa índices secundarios. Elige el predicado con la mayor selectividad y filtra desde allí.
Dado que los índices secundarios acceden a los identificadores de archivo, puede utilizar un UUID como clave de fila, lo cual brinda una buena distribución de datos en todo el clúster, es decir, la metainformación de un archivo completo se almacena en una clave de fila ancha.
La segunda familia de columnas “sblocks” almacena el contenido real del archivo.
Cada fila representa un bloque de datos asociado con un registro de inodo. Las columnas son subbloques comprimidos ordenados en el tiempo que, cuando se descomprimen y combinan, equivalen a un bloque HDFS.

#### Ruta de escritura CFS

Hadoop tiene el parámetro “dfs.block.size” para indicar qué tan grande debe ser un bloque de archivo por escritura de archivo. Cuando entra un archivo, escribe los atributos estáticos en la familia de columnas de inodo.
Luego asigna un nuevo objeto de bloque y lee los datos del parámetro de Hadoop. A medida que se leen esos datos, los divide en subbloques de tamaño “cfs.local.subblock.size”, esos subbloques se comprimen. Una vez que se termina un bloque, la identificación del bloque se escribe en la fila de inodo y los subbloques se escriben en cassandra con la identificación del bloque como la clave de fila y los identificadores de subbloque como columnas.
CFS divide un bloque en subbloque. Sin embargo, para Hadoop, el bloque parece un solo bloque, por lo que no causa ningún cambio en la lógica de división de trabajos de map reduce.

#### Ruta de lectura CFS

Cuando entra una lectura para un archivo o parte de un archivo (Hadoop busca el UUID en el índice secundario) lee la información del inodo y encuentra el bloque y subbloque para leer. Posteriormente, CFS ejecuta una llamada de ahorro personalizada que devuelve los datos del subbloque especificado o, si la llamada se realizó en un nodo con los datos localmente, el archivo y la información de compensación del archivo Cassandra SSTable con el subbloque.
Esto se realiza dado que, durante una tarea de reducción de mapas, el rastreador de trabajos intenta colocar cada cálculo en el nodo con los datos reales. Al usar la información de SSTable, es mucho más rápido, ya que el mapeador puede acceder a los datos directamente.