Introducción
Los sistemas distribuidos son una colección de computadoras independientes que parecen un único sistema coherente para los usuarios. Estos sistemas permiten la distribución de tareas y recursos a través de múltiples nodos, lo que puede mejorar la eficiencia, la escalabilidad y la disponibilidad. En esta sección, exploraremos los conceptos fundamentales de los sistemas distribuidos.
Objetivos de Aprendizaje
Al finalizar esta sección, deberías ser capaz de:
- Definir qué es un sistema distribuido.
- Comprender las características clave de los sistemas distribuidos.
- Identificar los componentes principales de un sistema distribuido.
- Reconocer ejemplos comunes de sistemas distribuidos en la vida real.
Definición de Sistemas Distribuidos
Un sistema distribuido es un conjunto de computadoras independientes que trabajan juntas para proporcionar un servicio o resolver un problema. Estas computadoras, también conocidas como nodos, se comunican y coordinan sus acciones mediante el intercambio de mensajes.
Características Clave
-
Transparencia: Los usuarios y las aplicaciones no deben notar la distribución del sistema. Esto incluye:
- Transparencia de Acceso: Oculta las diferencias en la representación de datos y cómo se accede a ellos.
- Transparencia de Ubicación: Oculta dónde se encuentran los recursos.
- Transparencia de Migración: Oculta el hecho de que los recursos pueden moverse de un lugar a otro.
- Transparencia de Replicación: Oculta el hecho de que los recursos pueden estar replicados.
- Transparencia de Concurrencia: Oculta el hecho de que los recursos pueden ser compartidos por varios usuarios.
- Transparencia de Fallos: Oculta los fallos y la recuperación de los mismos.
-
Escalabilidad: La capacidad del sistema para manejar el crecimiento, ya sea en términos de número de nodos, usuarios o volumen de datos.
-
Confiabilidad y Disponibilidad: La capacidad del sistema para seguir funcionando correctamente incluso cuando algunos de sus componentes fallan.
-
Heterogeneidad: La capacidad del sistema para operar en diferentes plataformas y con diferentes tecnologías.
Componentes Principales
- Nodos: Las computadoras individuales que forman parte del sistema distribuido.
- Red de Comunicación: El medio a través del cual los nodos se comunican entre sí.
- Middleware: Software que proporciona servicios y capacidades comunes para las aplicaciones distribuidas, facilitando la comunicación y la gestión de datos.
Ejemplos de Sistemas Distribuidos
- World Wide Web (WWW): Una red de servidores web distribuidos que proporcionan acceso a información y servicios.
- Sistemas de Archivos Distribuidos: Como NFS (Network File System) y HDFS (Hadoop Distributed File System).
- Bases de Datos Distribuidas: Como Google Spanner y Amazon DynamoDB.
- Computación en la Nube: Servicios como AWS, Google Cloud y Microsoft Azure que proporcionan recursos de computación distribuidos.
Ejemplo Práctico
Para ilustrar cómo funciona un sistema distribuido, consideremos un sistema de archivos distribuido simple. Supongamos que tenemos tres nodos (A, B y C) que almacenan archivos. Cuando un usuario quiere acceder a un archivo, el sistema debe determinar en qué nodo se encuentra el archivo y luego recuperar el archivo para el usuario.
# Ejemplo de un sistema de archivos distribuido simple class Nodo: def __init__(self, nombre): self.nombre = nombre self.archivos = {} def almacenar_archivo(self, nombre_archivo, contenido): self.archivos[nombre_archivo] = contenido def obtener_archivo(self, nombre_archivo): return self.archivos.get(nombre_archivo, None) # Crear nodos nodo_a = Nodo("A") nodo_b = Nodo("B") nodo_c = Nodo("C") # Almacenar archivos en nodos nodo_a.almacenar_archivo("archivo1.txt", "Contenido del archivo 1") nodo_b.almacenar_archivo("archivo2.txt", "Contenido del archivo 2") nodo_c.almacenar_archivo("archivo3.txt", "Contenido del archivo 3") # Función para obtener un archivo de cualquier nodo def obtener_archivo_distribuido(nombre_archivo): for nodo in [nodo_a, nodo_b, nodo_c]: contenido = nodo.obtener_archivo(nombre_archivo) if contenido: return contenido return "Archivo no encontrado" # Obtener un archivo print(obtener_archivo_distribuido("archivo2.txt"))
Explicación del Código
- Clase Nodo: Representa un nodo en el sistema distribuido. Cada nodo tiene un nombre y un diccionario de archivos.
- Métodos almacenar_archivo y obtener_archivo: Permiten almacenar y recuperar archivos en un nodo.
- Creación de Nodos: Se crean tres nodos (A, B y C).
- Almacenamiento de Archivos: Se almacenan archivos en diferentes nodos.
- Función obtener_archivo_distribuido: Busca un archivo en todos los nodos y lo devuelve si lo encuentra.
Ejercicio Práctico
Ejercicio 1
Modifica el ejemplo anterior para que cada nodo registre en un log cada vez que se almacena o se recupera un archivo. El log debe incluir el nombre del archivo y la acción realizada (almacenamiento o recuperación).
Solución
class Nodo: def __init__(self, nombre): self.nombre = nombre self.archivos = {} self.log = [] def almacenar_archivo(self, nombre_archivo, contenido): self.archivos[nombre_archivo] = contenido self.log.append(f"Almacenado: {nombre_archivo}") def obtener_archivo(self, nombre_archivo): contenido = self.archivos.get(nombre_archivo, None) if contenido: self.log.append(f"Recuperado: {nombre_archivo}") return contenido def mostrar_log(self): return self.log # Crear nodos nodo_a = Nodo("A") nodo_b = Nodo("B") nodo_c = Nodo("C") # Almacenar archivos en nodos nodo_a.almacenar_archivo("archivo1.txt", "Contenido del archivo 1") nodo_b.almacenar_archivo("archivo2.txt", "Contenido del archivo 2") nodo_c.almacenar_archivo("archivo3.txt", "Contenido del archivo 3") # Función para obtener un archivo de cualquier nodo def obtener_archivo_distribuido(nombre_archivo): for nodo in [nodo_a, nodo_b, nodo_c]: contenido = nodo.obtener_archivo(nombre_archivo) if contenido: return contenido return "Archivo no encontrado" # Obtener un archivo print(obtener_archivo_distribuido("archivo2.txt")) # Mostrar logs print(nodo_a.mostrar_log()) print(nodo_b.mostrar_log()) print(nodo_c.mostrar_log())
Explicación de la Solución
- Atributo
log
: Se añade un atributolog
a la claseNodo
para registrar las acciones. - Métodos
almacenar_archivo
yobtener_archivo
: Se actualizan para añadir entradas al log cada vez que se almacena o se recupera un archivo. - Método
mostrar_log
: Se añade para mostrar el log de acciones realizadas en el nodo.
Conclusión
En esta sección, hemos cubierto los conceptos básicos de los sistemas distribuidos, incluyendo sus características clave, componentes principales y ejemplos prácticos. Estos fundamentos son esenciales para comprender cómo funcionan los sistemas distribuidos y cómo se pueden utilizar para resolver problemas complejos de manera eficiente y escalable. En la próxima sección, exploraremos los diferentes modelos de sistemas distribuidos.
Curso de Arquitecturas Distribuidas
Módulo 1: Introducción a los Sistemas Distribuidos
- Conceptos Básicos de Sistemas Distribuidos
- Modelos de Sistemas Distribuidos
- Ventajas y Desafíos de los Sistemas Distribuidos