Un sistema distribuido es una colección de computadoras y dispositivos independientes que trabajan juntos a través de una red de modo que, desde el exterior, parecen ser un sistema único y unificado.
Los sistemas distribuidos dividen el trabajo y los datos en muchas máquinas que se ejecutan simultáneamente, por lo que un trabajo que podría haber tardado semanas en completar una máquina grande puede terminar en horas o incluso minutos. Cada máquina (o “nodo”) del sistema tiene su propia CPU, memoria y, a menudo, su propio almacenamiento. Los nodos pueden enviar mensajes entre sí para coordinar el intercambio de datos, dividir el trabajo y combinar su trabajo hacia un objetivo común.
En un sistema distribuido, los equipos pueden estar ubicados en el mismo rack de servidores (de un centro de datos), en diferentes centros de datos o en entornos de nube híbrida repartidos por todo el mundo. Independientemente de la configuración, los sistemas distribuidos están diseñados para que los usuarios y las aplicaciones cliente interactúen con ellos como si fueran un solo servicio (“una base de datos”, “un sitio web” o “un servicio de almacenamiento”), no un conjunto de servidores individuales.
Los sistemas distribuidos ofrecen a las empresas una solución a un desafío informático moderno apremiante. Muchas de las aplicaciones actuales son demasiado grandes, están demasiado ocupadas o son demasiado críticas para funcionar bien en una sola máquina. Estas aplicaciones manejan con frecuencia volúmenes masivos de datos y solicitudes que podrían saturar un solo servidor. Gestionan flujos de tráfico irregulares que requieren capacidades ágiles de balanceo de carga. Gestionan procesos de misión crítica en los que un tiempo de inactividad prolongado puede ser catastrófico (sistemas bancarios, por ejemplo).
Los sistemas distribuidos reparten las cargas de trabajo entre muchos nodos y pueden agregar automáticamente más nodos a la red según sea necesario. Esta escalabilidad permite que el sistema se adapte a más usuarios y más datos, incluso cuando los flujos de tráfico son impredecibles. La escalabilidad de los sistemas distribuidos es la razón por la que las plataformas de streaming, por ejemplo, pueden dar servicio a millones de usuarios en todo el mundo, a menudo de forma simultánea.
Los sistemas distribuidos también pueden optimizar la confiabilidad y la tolerancia a fallas de una arquitectura de TI. Cuando un nodo falla, otros nodos pueden asumir su trabajo para que el servicio general siga funcionando. Esta característica reduce los puntos únicos de falla y ayuda a las empresas a mantener sistemas de alta disponibilidad, lo cual es crucial para los sistemas que requieren un tiempo de actividad de casi el 100 %.
Además, en un sistema distribuido, los nodos separados cooperan estrechamente, pero tienen sus propias bases de datos y sistemas de almacenamiento. Esta configuración facilita a los equipos de TI la creación de arquitecturas modulares en las que las distintas partes del sistema pueden ampliarse y evolucionar de forma independiente.
Manténgase al día sobre las tendencias más importantes e intrigantes de la industria sobre IA, automatización, datos y más con el boletín Think. Consulte la Declaración de privacidad de IBM.
Los sistemas distribuidos abarcan una amplia gama de arquitecturas diferentes, pero todas comparten un conjunto de características fundamentales.
Las máquinas en un sistema distribuido pueden agrupar datos, almacenamiento, potencia de procesamiento y servicios. El uso compartido de recursos aumenta la eficiencia de todo el sistema porque los recursos se pueden agrupar y utilizar donde más se necesitan.
La concurrencia permite que varias partes de un sistema distribuido se ejecuten al mismo tiempo, por lo que diferentes nodos pueden procesar solicitudes de datos simultáneamente. La sincronización de nodos contribuye a aumentar el rendimiento de todo el sistema.
La escalabilidad permite a los sistemas distribuidos gestionar un mayor número de usuarios y datos mediante la incorporación de más máquinas, en lugar de sustituir todo el sistema. Por ejemplo, los servicios de transmisión pueden agregar más servidores a medida que más personas comienzan a ver un evento en vivo al mismo tiempo.
La disponibilidad y la tolerancia a fallas son conceptos relacionados que se centran en minimizar el tiempo de inactividad del sistema mediante el uso de un proceso llamado replicación (donde los sistemas almacenan copias de datos y servicios en múltiples nodos).
La disponibilidad garantiza que los usuarios puedan seguir accediendo al sistema aunque algunas partes no estén disponibles. La tolerancia a fallas permite que los sistemas distribuidos continúen funcionando mediante el uso de réplicas si uno o más nodos fallan.
La heterogeneidad significa que un sistema distribuido puede incluir, y probablemente así sea, diferentes tipos de hardware, sistemas operativos, lenguajes de programación y middleware. Los nodos de red no tienen que ser idénticos, por lo que los equipos pueden agregar nuevas máquinas sin comprometer la interoperabilidad y crear arquitecturas que seleccionen automáticamente la mejor herramienta para cada trabajo.
La unificación permite a los sistemas distribuidos ocultar su complejidad interna a los usuarios. Un usuario no necesita saber qué servidor respondió a su solicitud o dónde se encuentran físicamente los datos. Debería ser capaz de interactuar con un sistema unificado.
Para entender cómo funcionan los sistemas distribuidos, tomemos como ejemplo los juegos multijugador masivos en línea (MMOG).
Los MMOG utilizan arquitecturas distribuidas en las que numerosos servidores y nodos colaboran para mantener un universo de juego persistente, de modo que miles de jugadores puedan volar, comerciar, luchar y explorar al mismo tiempo.
Debido a que el mundo del juego es enorme y el número de jugadores es muy alto, el backend del juego se divide en un clúster de máquinas en lugar de que lo maneje un solo sistema. Un conjunto de servidores rastrea las características del universo del juego (posiciones de los jugadores, daños, inventario), mientras que otras partes de la infraestructura manejan el inicio de sesión de los usuarios, las características de chat y la persistencia del universo. La división ayuda a que el juego siga respondiendo incluso cuando muchos jugadores están activos en la misma región a la vez.
Durante cada sesión de juego, el sistema debe mantener sincronizado el estado del juego entre todos los jugadores. Cuando un jugador realiza una acción (por ejemplo, mover una nave durante una batalla naval), el cliente envía la acción al servidor correspondiente a esa parte del mundo del juego. Luego, el servidor actualiza el estado del juego compartido en tiempo real y comparte el resultado con los otros jugadores que necesitan verlo.
Además, el sistema de juego distribuido utiliza protocolos especializados para ayudar a garantizar que todos los jugadores vean los mismos eventos del juego aproximadamente al mismo tiempo.
Si un servidor falla durante el juego, los otros servidores están diseñados para tomar el relevo y continuar operando normalmente para que los jugadores no experimenten interrupciones.
Los sistemas distribuidos son el opuesto funcional de los sistemas centralizados. Mientras que los sistemas distribuidos utilizan un conjunto de dispositivos para llevar a cabo sus operaciones, los sistemas centralizados se basan en un único servidor principal.
En un sistema centralizado, un nodo central coordina la mayoría o la totalidad de las operaciones. Los clientes suelen enviar solicitudes a ese nodo, y el nodo decide cómo procesarlas. Esta dinámica hace que el sistema sea más fácil de entender porque la autoridad se encuentra en un solo lugar.
Sin embargo, un solo nodo significa un único punto de falla. En un sistema centralizado, si el servidor central deja de funcionar, todo el sistema deja de estar disponible, por lo que la centralización puede presentar problemas importantes en situaciones en las que la alta disponibilidad es importante.
Los sistemas centralizados suelen escalar verticalmente. Si un equipo de TI quiere mejorar el servidor principal, lo haría dándole más procesadores, memoria o almacenamiento. Desafortunadamente, el escalado vertical no es una práctica sostenible a largo plazo. Con el tiempo, exige demasiado hardware y se vuelve demasiado costoso.
Como tal, los sistemas centralizados se adaptan mejor a situaciones en las que la simplicidad arquitectónica y la supervisión centralizada importan más que la resiliencia. La centralización se utiliza comúnmente para redes informáticas más pequeñas, sistemas empresariales internos, servidores de archivos y aplicaciones cliente-servidor donde una autoridad necesita un control estricto.
En un sistema distribuido, ninguna máquina tiene el control total. Varios nodos cooperan, y cada nodo puede manejar parte de la carga de trabajo o almacenar parte de los datos. La estructura es inherentemente más flexible, pero requiere coordinación entre nodos.
Los sistemas distribuidos son más tolerantes a fallas porque otros nodos pueden seguir funcionando si falla un nodo. Un sistema distribuido aún puede fallar, pero tiende a degradarse de manera más elegante que un sistema centralizado.
Los sistemas distribuidos se basan en el escalado horizontal, donde el sistema agrega más máquinas para adaptarse a la creciente demanda de recursos.
Por lo tanto, los entornos distribuidos suelen ser la opción preferida en situaciones en las que el gran número de usuarios, los conjuntos de datos de gran tamaño o la dispersión geográfica hacen que el uso de un único servidor central resulte poco práctico. Los sistemas distribuidos son comunes para servicios web, plataformas en la nube, redes blockchain y servicios a gran escala que requieren alta disponibilidad y escalabilidad.
Los sistemas distribuidos se pueden clasificar en unos cuantos tipos comunes, según cómo estén organizadas las máquinas y cómo se comunican entre sí.
En un sistema cliente-servidor, un servidor central (o un pequeño grupo de servidores) proporciona servicios, mientras que otras máquinas, los “clientes”, dependen del trabajo del servidor central.
El servidor central, que suele ser el equipo más potente en cuanto a hardware, se encarga de gestionar los recursos compartidos (archivos, bases de datos, impresoras y cuentas de usuario). Los clientes suelen ser máquinas de usuarios finales (computadoras portátiles, teléfonos móviles, navegadores) que se centran en interactuar con el usuario y manejar solicitudes y respuestas.
Dado que los clientes y el servidor central se ejecutan en máquinas distintas y se comunican a través de una red, los sistemas cliente-servidor se consideran sistemas distribuidos. Sin embargo, la comunicación entre los nodos en una arquitectura cliente-servidor es centralizada.
Cada cliente depende del servidor central para acceder a los recursos compartidos, y los clientes no hablan directamente entre sí sobre esos recursos. En cambio, la comunicación entre los clientes y el servidor suele seguir un patrón de solicitud-respuesta.
Cuando el usuario realiza una acción (como hacer clic en un botón), el cliente convierte la acción en un mensaje de solicitud y lo envía a través de la red al servidor. El servidor recibe la solicitud, la procesa y luego envía una respuesta. A continuación, el cliente interpreta la respuesta y muestra el resultado al usuario de una forma comprensible.
Por ejemplo, una aplicación web podría usar un navegador (cliente) que envía solicitudes HTTP a un servidor web, que lee o escribe en una base de datos y luego envía una respuesta HTML o JSON.
La comunicación centralizada facilita la actualización de los sistemas cliente-servidor, la aplicación de políticas de seguridad y la gestión de datos. Sin embargo, la contrapartida es que la centralización puede crear cuellos de botella y puntos únicos de falla.
En los sistemas peer-to-peer, todos los nodos, llamados “pares”, tienen roles aproximadamente iguales. Cada nodo aporta parte de sus propios recursos y consume los recursos que ofrecen los demás nodos. Cada par puede solicitar recursos y proporcionarlos a otros nodos.
Por lo tanto, “cliente” y “servidor” en un sistema P2P son solo roles que desempeña temporalmente un nodo, no identidades fijas.
En un sistema puramente P2P, los pares se descubren entre sí y se comunican a través de una red superpuesta, una red lógica construida sobre conexiones físicas a Internet. La red superpuesta decide quién habla con quién y cómo se enrutan los datos entre pares.
Cuando un par necesita algo (un fragmento de archivo, por ejemplo), envía solicitudes directamente a otros pares que podrían tenerlo. Y cuando otro nodo recibe la solicitud, puede responder y enviar los datos solicitados, actuando efectivamente como un servidor en ese momento. Después, los roles pueden intercambiarse y los mismos dos nodos pueden revertir quién proporciona datos y quién los solicita.
Dado que todos los pares pueden tanto enviar como recibir datos, las cargas de trabajo de procesamiento de datos tienden a distribuirse de manera más uniforme por toda la red. Y a medida que se incorporan más nodos, estos aportan más capacidad, lo que puede facilitar la escalabilidad del sistema.
Las redes clásicas de intercambio de archivos son un buen ejemplo de sistemas P2P. La computadora de cada usuario almacena fragmentos de archivos y los envía a otros nodos, al tiempo que descarga los fragmentos que le faltan.
Los sistemas P2P son más robustos frente a puntos de fallo únicos que los sistemas cliente-servidor. Si un par se desconecta, todo el sistema generalmente sigue funcionando porque otros pares tienen copias de los datos o pueden enrutar los datos alrededor del nodo fallido.
Los sistemas multinivel amplían el modelo básico cliente-servidor y lo organizan en múltiples capas claramente separadas, cada una con su propio trabajo. Las estructuras más comunes son las de dos niveles, tres niveles y n niveles.
Un sistema de dos niveles es, en otras palabras, una arquitectura cliente-servidor. El cliente contiene la mayor parte de la lógica de la aplicación y se comunica directamente con la base de datos del servidor para ejecutar consultas y actualizaciones. El proceso es sencillo, pero vincula estrechamente la interfaz de usuario con los datos. Cualquier cambio en la estructura de datos puede forzar cambios en muchos otros clientes.
Las arquitecturas de tres niveles usan tres capas. La capa de presentación maneja la interfaz de usuario (páginas web, interfaz de usuario móvil, interfaz de usuario de escritorio). La capa de aplicación, o “lógica de negocio”, implementa reglas y flujos de trabajo (validaciones, cálculos, decisiones). La capa de datos almacena y recupera datos de bases de datos distribuidas u otros sistemas de almacenamiento.
Los sistemas de n niveles amplían la idea de tres niveles al agregar capas más especializadas. Por ejemplo, los equipos de TI podrían optar por crear una interfaz de programación de aplicaciones (API) o una capa de servicio independiente que exponga endpoints REST o GraphQL . También podrían separar una capa de autenticación y otra de cifrado para gestionar los inicios de sesión de los usuarios y los tokens.
Los niveles adicionales siguen el mismo principio que los tres primeros. Cada nivel tiene una responsabilidad principal y los niveles se comunican a través de interfaces bien definidas. Esta modularidad permite a los equipos trabajar, actualizar o reemplazar diferentes niveles de forma independiente, tal vez incluso utilizando diferentes tecnologías para cada uno.
Los sistemas multinivel se utilizan comúnmente para ejecutar sitios web de comercio electrónico y aplicaciones bancarias.
Un clúster es un grupo de computadoras ubicadas muy juntas que funcionan como si fueran una sola máquina más potente. Los nodos de un clúster están estrechamente acoplados, por lo que suelen:
Debido a que los nodos son similares y están bien conectados, el clúster puede dividir una gran tarea en partes más pequeñas para el procesamiento paralelo en diferentes nodos y luego combinar los resultados.
Los clústeres se gestionan mediante un software especial, como middleware de clúster, un programador o un administrador de recursos. El software decide qué nodos ejecutan cada tarea, supervisa el estado de los nodos, gestiona el enrutamiento de datos y equilibra las cargas de trabajo entre los nodos. Esta capa de gestión es lo que convierte “un montón de computadoras en una red” en un clúster. Permite a los usuarios enviar un trabajo al clúster en su conjunto, en lugar de tener que iniciar sesión manualmente en cada máquina.
Los sistemas de clúster son útiles en situaciones que requieren computación de alto rendimiento, como el análisis de big data, el entrenamiento de modelos de IA y las simulaciones científicas.
La computación en malla consiste en agrupar muchas computadoras independientes, a menudo dispersas en diferentes ciudades y países, y hacer que cooperen en una sola tarea computacional de gran tamaño.
Cada máquina participante en una red puede pertenecer a una organización o a una persona diferente. Todos pueden tener diferentes CPU, tamaños de memoria, sistemas operativos y políticas locales. No obstante, aceptan compartir algunos de sus recursos disponibles para problemas comunes.
Debido a que una malla abarca múltiples dominios administrativos, ninguna organización posee ni controla completamente todas las máquinas. Esta es una diferencia fundamental entre las mallas y los clústeres, en los que una institución posee y gestiona servidores que residen en un centro de datos.
En un sistema de red, cada nodo sigue siendo autónomo. Puede incorporarse a la malla o salir de ella, cuenta con su propio administrador de recursos local y puede tener diferentes reglas de seguridad o prioridades. El middleware de red proporciona una capa común para enviar trabajos, detectar recursos disponibles, programar tareas, transferir datos y recopilar resultados. Este middleware permite que toda la red funcione como una supercomputadora virtual para los usuarios finales.
Cuando un usuario envía un trabajo grande (como una simulación de plegamiento de proteínas o un cálculo de riesgo financiero), el middleware divide automáticamente el trabajo en muchas tareas más pequeñas. A continuación, busca máquinas inactivas o infrautilizadas en cualquier parte de la malla para asignarles partes del trabajo. Cada máquina trabaja por su cuenta y luego envía resultados que se combinan en la respuesta final.
Es importante destacar que los nodos de la malla no están dedicados exclusivamente a la red. Pueden ser computadoras de escritorio o servidores normales que donan ciclos de CPU de sobra cuando no están ocupados con su trabajo local principal.
Los sistemas distribuidos basados en la nube se construyen sobre grandes centros de datos que gestionan los proveedores de la nube.
En lugar de adquirir servidores físicos, las organizaciones alquilan recursos informáticos distribuidos a través de Internet. Esos recursos se ofrecen en forma de máquinas virtuales (VM), contenedores, bases de datos, colas y otros servicios gestionados.
Los sistemas en la nube son, ante todo, elásticos. Las empresas pueden solicitar más capacidad de cómputo, almacenamiento o red cuando aumenta la carga de trabajo y liberar recursos cuando la carga disminuye. También permiten a las empresas pagar solo por los recursos que utilizan, en lugar de comprar hardware por adelantado.
Con los sistemas en la nube, los equipos de TI pueden implementar procesos de escalabilidad horizontal dinámica. Los grupos de autoescalado, grupos lógicos de instancias de servidor idénticas, supervisan las métricas de la carga de trabajo para detectar fluctuaciones. Cuando una carga cruza los umbrales establecidos, las herramientas de automatización activan más instancias del servicio. Cuando la carga disminuye, cierra automáticamente las instancias adicionales para ahorrar dinero.
Las arquitecturas de microservicios son sistemas distribuidos a nivel de aplicación que utilizan múltiples componentes independientes que se ejecutan en diferentes máquinas para crear aplicaciones de software.
A diferencia de las aplicaciones monolíticas, ningún microservicio en una arquitectura de microservicios contiene toda la aplicación. En cambio, cada microservicio es su propio servicio pequeño (con su propio código y generalmente su propio almacén de datos) que es responsable de una capacidad específica y se ejecuta independientemente de otros contenedores.
Debido a que son independientes, los microservicios se pueden desarrollar, desplegar y escalar por sí solos, pero las ventajas del sistema provienen de la colaboración entre los microservicios.
Cuando los usuarios envían una solicitud, el cliente crea un mensaje y lo envía a un dispositivo perimetral (un balanceador de carga o una pasarela de API, por ejemplo). El dispositivo perimetral envía la solicitud al microservicio adecuado. El microservicio destinatario lee el mensaje, ejecuta su propia lógica empresarial y luego envía una respuesta al dispositivo perimetral, que transmite la respuesta al usuario.
Los sistemas distribuidos son omnipresentes en el mundo real. Muchas de las herramientas y servicios que las personas utilizan para el entretenimiento, los negocios y la gestión financiera se basan en sistemas distribuidos.
Una red celular está compuesta por muchas estaciones base (torres celulares o antenas pequeñas) distribuidas en regiones, todas conectadas a redes centrales de proveedores e Internet. A medida que los usuarios se mueven con sus teléfonos móviles, la señal del teléfono se mueve de torre en torre sin que el usuario se dé cuenta.
Una CDN es una red distribuida geográficamente de servidores proxy y centros de datos que almacenan en caché contenido (imágenes, videos, páginas) más cerca de los usuarios. El contenido se replica en muchos nodos. Cuando el usuario visita un sitio web, su solicitud se redirige a un servidor perimetral cercano (en lugar de llegar hasta el servidor de origen) para su procesamiento. Esta configuración ayuda a la red a entregar el contenido solicitado más rápido.
Las grandes plataformas de transmisión dependen en gran medida de los sistemas distribuidos. Utilizan servidores agrupados en múltiples centros de datos para almacenar contenido de video. También utilizan CDN para fragmentar, replicar y almacenar en caché el contenido para que los flujos de contenido puedan dar servicio, bajo demanda, a millones de usuarios en todo el mundo.
Una red blockchain (como una criptomoneda) es una red distribuida peer-to-peer donde muchos nodos mantienen copias de un libro mayor y acuerdan nuevas transacciones a través de un algoritmo de consenso. Cada nodo almacena la cadena completa (o parcial), valida nuevos bloques y los comparte con otros nodos, por lo que los datos y el cálculo están realmente distribuidos.
Aproveche el poder de la IA y la automatización para resolver problemas de manera proactiva en toda la pila de aplicaciones.
Maximice su resiliencia operativa y asegure el estado de las aplicaciones nativas de la nube con observabilidad impulsada por IA.
Aumente la automatización y las operaciones de TI con IA generativa, alineando todos los aspectos de su infraestructura de TI con las prioridades empresariales.