Fundamentos de Sistemas Distribuidos
Comprende conceptos fundamentales de sistemas distribuidos como coordinación, consistencia, tolerancia a fallos y compensaciones.
Por qué los sistemas se vuelven distribuidos
Un solo servidor funciona a pequeña escala, pero los sistemas reales lo superan debido al tráfico, el tamaño de los datos y las exigencias de confiabilidad.
- Una sola máquina tiene límites estrictos en CPU, memoria, almacenamiento y rendimiento de red.
- El crecimiento de los datos y del tráfico crea cuellos de botella de rendimiento que el escalado vertical no puede sostener.
- Las configuraciones de un solo servidor introducen un único punto de fallo, lo que hace imposible la alta disponibilidad.
Detalles
La mayoría de los sistemas comienzan con un solo servidor porque es simple de construir y administrar. A baja escala, una máquina puede manejar solicitudes, ejecutar lógica y almacenar datos sin mucha complejidad.
A medida que aumenta el uso, este modelo se descompone. El incremento del tráfico provoca mayor latencia y agotamiento de recursos, mientras que los conjuntos de datos más grandes ralentizan las consultas y sobrecargan los sistemas de almacenamiento.
La confiabilidad también se convierte en un problema importante. Si ese único servidor falla, todo el sistema queda fuera de línea. Esto es inaceptable para sistemas que requieren disponibilidad continua.
Para superar estos límites, los sistemas distribuyen el trabajo entre varias máquinas. En lugar de depender de un solo servidor, las cargas de trabajo se comparten, lo que permite escalabilidad y tolerancia a fallos, pero introduce nuevos desafíos de coordinación y consistencia.
Qué es un sistema distribuido
Un sistema distribuido es un conjunto de máquinas independientes que se coordinan a través de una red para comportarse como un solo sistema.
- Cada máquina (nodo) funciona de forma independiente con su propia memoria y recursos.
- Los nodos se comunican mediante llamadas de red en lugar de memoria compartida.
- El sistema está diseñado para parecer un único servicio unificado para los usuarios.
Detalles
En un sistema distribuido, varios servidores trabajan juntos para manejar solicitudes, almacenar datos y ejecutar lógica. Cada servidor es una máquina separada, a menudo ejecutándose en diferentes ubicaciones, pero en conjunto forman un solo sistema desde la perspectiva del usuario.
A diferencia de un sistema de una sola máquina, estos nodos no comparten memoria. En su lugar, se comunican enviando mensajes a través de una red, lo que introduce latencia y la posibilidad de fallos.
Por eso, la coordinación se vuelve esencial. Los nodos deben ponerse de acuerdo sobre el estado compartido, como los valores de los datos o las decisiones del sistema, aunque estén físicamente separados.
El desafío principal es hacer que este grupo de máquinas independientes se comporte de manera consistente y confiable como un solo sistema, a pesar de los retrasos, los fallos y la visibilidad parcial a través de la red.
Replicación
La replicación duplica datos en varias máquinas para mejorar la disponibilidad, la tolerancia a fallos y el rendimiento de lectura.
- Los datos se copian desde un nodo primario a uno o más nodos réplica.
- Si un nodo falla, otras réplicas pueden seguir atendiendo solicitudes.
- Las solicitudes de lectura se pueden distribuir entre las réplicas para reducir la carga.
Detalles
La replicación es una técnica fundamental en sistemas distribuidos en la que los mismos datos se almacenan en varias máquinas. Normalmente, un nodo actúa como primario y se encarga de las escrituras, mientras que otros nodos actúan como réplicas que reciben copias de los datos.
Esta configuración mejora la confiabilidad. Si el primario o cualquier réplica falla, el sistema puede seguir funcionando con los nodos restantes, reduciendo el tiempo de inactividad.
La replicación también mejora el rendimiento, especialmente en sistemas con muchas lecturas. En lugar de enviar todas las solicitudes de lectura a una sola máquina, las solicitudes se pueden distribuir entre varias réplicas.
Sin embargo, la replicación introduce complejidad. Las actualizaciones deben propagarse entre los nodos, y los retrasos en la sincronización pueden provocar inconsistencias temporales entre las réplicas.
Tolerancia a particiones
La tolerancia a particiones significa que un sistema sigue funcionando incluso cuando partes de la red no pueden comunicarse.
- Las fallas de red pueden dividir los sistemas en grupos aislados de nodos.
- Los nodos pueden seguir ejecutándose, pero no pueden comunicarse entre sí.
- Los sistemas deben manejar estas fallas sin apagarse por completo.
Detalles
En los sistemas distribuidos, las máquinas se comunican a través de redes, y las redes son inherentemente poco confiables. Las conexiones pueden caerse, los mensajes pueden retrasarse y segmentos completos del sistema pueden quedar inaccesibles.
Una partición de red ocurre cuando los nodos se dividen en grupos que no pueden comunicarse entre sí. Por ejemplo, el Servidor A puede no poder الوصول al Servidor B debido a una falla de red, aunque ambos sigan en ejecución.
Esto crea un desafío fundamental: cada lado de la partición puede seguir procesando solicitudes de forma independiente, lo que potencialmente lleva a estados conflictivos.
La tolerancia a particiones significa que el sistema está diseñado para seguir funcionando a pesar de estas fallas, aceptando que la coordinación entre nodos puede ser temporalmente imposible.
Consistencia en sistemas distribuidos
La consistencia define si todos los nodos en un sistema distribuido ven los mismos datos al mismo tiempo.
- La consistencia fuerte garantiza que cada lectura devuelva la última escritura en todos los nodos.
- La consistencia eventual permite diferencias temporales, pero garantiza la convergencia con el tiempo.
- Una mayor consistencia a menudo tiene el costo de la disponibilidad o el rendimiento.
Detalles
En los sistemas distribuidos, los datos a menudo se replican en varias máquinas, lo que introduce el problema de mantener esos datos sincronizados. La consistencia define qué tan alineadas están esas réplicas en un momento dado.
Con consistencia fuerte, una vez que ocurre una escritura, todas las lecturas futuras—sin importar a qué nodo lleguen—devuelven inmediatamente el valor actualizado. Esto requiere una coordinación estrecha entre los nodos.
Con consistencia eventual, las actualizaciones se propagan con el tiempo. Después de una escritura, algunos nodos pueden devolver temporalmente datos obsoletos, pero todos los nodos eventualmente convergerán al mismo estado.
La compensación es inevitable. Los sistemas que aplican una consistencia estricta a menudo sacrifican rendimiento o disponibilidad, especialmente bajo retrasos de red o fallos.
Teorema CAP
El teorema CAP establece que un sistema distribuido solo puede garantizar dos de tres propiedades: consistencia, disponibilidad y tolerancia a particiones.
- La consistencia significa que todos los nodos devuelven los mismos datos actualizados.
- La disponibilidad significa que cada solicitud recibe una respuesta, incluso durante fallos.
- La tolerancia a particiones significa que el sistema sigue funcionando a pesar de divisiones en la red.
Detalles
El teorema CAP describe una restricción difícil en los sistemas distribuidos: cuando ocurre una partición de red, no puedes mantener al mismo tiempo una consistencia perfecta y una disponibilidad total.
La consistencia requiere coordinación entre nodos. Para que cada lectura devuelva la última escritura, los nodos deben ponerse de acuerdo sobre el estado actual, lo que puede requerir esperar la comunicación a través de la red.
La disponibilidad, por otro lado, prioriza la capacidad de respuesta. El sistema sigue atendiendo solicitudes incluso si algunos nodos no están accesibles, lo que puede provocar que se devuelvan datos obsoletos o inconsistentes.
La tolerancia a particiones es inevitable porque los fallos de red ocurrirán en cualquier sistema real. Esto obliga a los sistemas a hacer una compensación: durante una partición, deben retrasar las respuestas para preservar la consistencia o responder de inmediato y aceptar una inconsistencia temporal.
Coordinación distribuida
La coordinación distribuida garantiza que varios nodos se pongan de acuerdo sobre decisiones compartidas y el estado del sistema.
- Los nodos deben coordinarse para evitar conflictos y un comportamiento inconsistente del sistema.
- Los patrones comunes incluyen la elección de líder, los bloqueos distribuidos y el consenso.
- Sistemas especializados como ZooKeeper, etcd y Consul manejan la coordinación de forma confiable.
Detalles
En los sistemas distribuidos, varios nodos operan de forma independiente, pero muchas operaciones requieren que actúen de manera coordinada. Sin coordinación, los nodos podrían tomar decisiones conflictivas, lo que llevaría a datos inconsistentes o fallos del sistema.
La elección de líder es un patrón común en el que se selecciona un nodo para tomar decisiones o encargarse de tareas críticas. Esto evita que varios nodos realicen la misma acción al mismo tiempo.
Los bloqueos distribuidos garantizan que solo un nodo pueda acceder o modificar un recurso compartido a la vez, de forma similar a los bloqueos en la concurrencia de una sola máquina, pero implementados a través de una red.
Los algoritmos de consenso van más allá al permitir que los nodos se pongan de acuerdo sobre un valor o una decisión, incluso en presencia de fallos. Herramientas como ZooKeeper, etcd y Consul proporcionan estos mecanismos de coordinación, de modo que los ingenieros no tengan que implementarlos desde cero.
Desafíos de los sistemas distribuidos
Los sistemas distribuidos introducen modos de fallo y complejidad que no existen en los sistemas de una sola máquina.
- Los fallos de red y la latencia hacen que la comunicación sea poco fiable e impredecible.
- Los datos replicados pueden volverse temporalmente inconsistentes entre nodos.
- Coordinar varias máquinas introduce una complejidad de diseño significativa.
Detalles
Una vez que un sistema está distribuido, debe operar sobre una red, y las redes son inherentemente poco fiables. Los mensajes pueden retrasarse, perderse o llegar fuera de orden, lo que hace que las operaciones simples sean mucho más difíciles de razonar.
La consistencia de los datos también se convierte en un desafío. Con la replicación, distintos nodos pueden tener diferentes versiones de los mismos datos en un momento dado, especialmente bajo mucha carga o con retrasos de red.
La coordinación entre nodos añade otra capa de dificultad. Garantizar que varias máquinas estén de acuerdo sobre el estado compartido o ejecuten tareas en el orden correcto requiere protocolos complejos y un diseño cuidadoso.
Estos desafíos no son casos extremos: son fundamentales. Diseñar sistemas que sigan siendo correctos y fiables a pesar de estos problemas es el problema central que la ingeniería de sistemas distribuidos busca resolver.
Sección de preguntas
1 / 5
Esta lección forma parte del contenido premium
Pásate al plan premium para eliminar el desenfoque y desbloquear la lectura completa.