Fundamentos de Sistemas Distribuídos
Entenda os conceitos centrais de sistemas distribuídos, como coordenação, consistência, tolerância a falhas e trade-offs.
Por que os sistemas se tornam distribuídos
Um único servidor funciona em pequena escala, mas sistemas reais o ultrapassam devido às demandas de tráfego, حجم de dados e confiabilidade.
- Uma máquina tem limites rígidos de CPU, memória, armazenamento e throughput de rede.
- O crescimento de dados e tráfego cria gargalos de desempenho que o escalonamento vertical não consegue sustentar.
- Configurações com um único servidor introduzem um único ponto de falha, tornando a alta disponibilidade impossível.
Detalhes
A maioria dos sistemas começa com um único servidor porque é simples de construir e gerenciar. Em baixa escala, uma máquina pode lidar com requisições, executar lógica e armazenar dados sem muita complexidade.
À medida que o uso cresce, esse modelo deixa de funcionar. O aumento do tráfego leva a maior latência e esgotamento de recursos, enquanto conjuntos de dados maiores tornam as consultas mais lentas e sobrecarregam os sistemas de armazenamento.
A confiabilidade também se torna um problema importante. Se esse único servidor falhar, todo o sistema fica fora do ar. Isso é inaceitável para sistemas que exigem disponibilidade contínua.
Para superar esses limites, os sistemas distribuem o trabalho entre várias máquinas. Em vez de depender de um único servidor, as cargas de trabalho são compartilhadas, permitindo escalabilidade e tolerância a falhas — mas introduzindo novos desafios de coordenação e consistência.
O Que É um Sistema Distribuído
Um sistema distribuído é um conjunto de várias máquinas independentes que se coordenam por meio de uma rede para se comportar como um único sistema.
- Cada máquina (nó) opera de forma independente, com sua própria memória e recursos.
- Os nós se comunicam por chamadas de rede em vez de memória compartilhada.
- O sistema é projetado para parecer um único serviço unificado para os usuários.
Detalhes
Em um sistema distribuído, vários servidores trabalham juntos para processar solicitações, armazenar dados e executar lógica. Cada servidor é uma máquina separada, muitas vezes executando em locais diferentes, mas, coletivamente, eles formam um único sistema do ponto de vista do usuário.
Ao contrário de um sistema de máquina única, esses nós não compartilham memória. Em vez disso, eles se comunicam enviando mensagens por uma rede, o que introduz latência e a possibilidade de falhas.
Por causa disso, a coordenação se torna essencial. Os nós precisam concordar sobre o estado compartilhado, como valores de dados ou decisões do sistema, mesmo estando fisicamente separados.
O principal desafio é fazer com que esse grupo de máquinas independentes se comporte de forma consistente e confiável como um único sistema, apesar de atrasos, falhas e visibilidade parcial pela rede.
Replicação
A replicação duplica dados em várias máquinas para melhorar a disponibilidade, a tolerância a falhas e o desempenho de leitura.
- Os dados são copiados de um nó primário para um ou mais nós réplica.
- Se um nó falhar, outras réplicas podem continuar atendendo às solicitações.
- As solicitações de leitura podem ser distribuídas entre as réplicas para reduzir a carga.
Detalhes
A replicação é uma técnica central em sistemas distribuídos, na qual os mesmos dados são armazenados em várias máquinas. Normalmente, um nó atua como primário, processando gravações, enquanto outros nós atuam como réplicas que recebem cópias dos dados.
Essa configuração melhora a confiabilidade. Se o primário ou qualquer réplica falhar, o sistema pode continuar operando usando os nós restantes, reduzindo o tempo de inatividade.
A replicação também melhora o desempenho, especialmente em sistemas com muitas leituras. Em vez de enviar todas as solicitações de leitura para uma única máquina, as solicitações podem ser distribuídas entre várias réplicas.
No entanto, a replicação introduz complexidade. As atualizações precisam ser propagadas entre os nós, e atrasos na sincronização podem levar a inconsistências temporárias entre as réplicas.
Tolerância a Partições
Tolerância a partições significa que um sistema continua operando mesmo quando partes da rede não conseguem se comunicar.
- Falhas de rede podem dividir sistemas em grupos isolados de nós.
- Os nós podem continuar executando, mas não conseguem se comunicar entre si.
- Os sistemas devem lidar com essas falhas sem desligar completamente.
Detalhes
Em sistemas distribuídos, as máquinas se comunicam por redes, e as redes são inerentemente não confiáveis. As conexões podem cair, as mensagens podem atrasar e segmentos inteiros do sistema podem ficar inacessíveis.
Uma partição de rede ocorre quando os nós são divididos em grupos que não conseguem se comunicar entre si. Por exemplo, o Servidor A pode não conseguir alcançar o Servidor B devido a uma falha de rede, mesmo que ambos ainda estejam em execução.
Isso cria um desafio fundamental: cada lado da partição pode continuar processando solicitações de forma independente, o que pode levar a estados conflitantes.
Tolerância a partições significa que o sistema foi projetado para continuar operando apesar dessas falhas, aceitando que a coordenação entre nós pode ser temporariamente impossível.
Consistência em Sistemas Distribuídos
Consistência define se todos os nós em um sistema distribuído veem os mesmos dados ao mesmo tempo.
- Consistência forte garante que toda leitura retorne a escrita mais recente em todos os nós.
- Consistência eventual permite diferenças temporárias, mas garante convergência ao longo do tempo.
- Maior consistência muitas vezes vem ao custo de disponibilidade ou desempenho.
Detalhes
Em sistemas distribuídos, os dados geralmente são replicados em várias máquinas, o que introduz o problema de manter esses dados sincronizados. Consistência define o quão alinhadas essas réplicas estão em um determinado momento.
Com consistência forte, assim que uma escrita ocorre, todas as leituras futuras — não importa em qual nó elas aconteçam — retornam imediatamente o valor atualizado. Isso exige coordenação rígida entre os nós.
Com consistência eventual, as atualizações se propagam ao longo do tempo. Após uma escrita, alguns nós podem retornar temporariamente dados desatualizados, mas todos os nós eventualmente convergem para o mesmo estado.
O trade-off é inevitável. Sistemas que impõem consistência estrita geralmente sacrificam desempenho ou disponibilidade, especialmente sob atrasos de rede ou falhas.
Teorema CAP
O teorema CAP afirma que um sistema distribuído só pode garantir duas de três propriedades: consistência, disponibilidade e tolerância a partições.
- Consistência significa que todos os nós retornam os mesmos dados, atualizados.
- Disponibilidade significa que toda requisição recebe uma resposta, mesmo durante falhas.
- Tolerância a partições significa que o sistema continua operando apesar de divisões na rede.
Detalhes
O teorema CAP descreve uma restrição difícil em sistemas distribuídos: quando ocorre uma partição de rede, você não pode manter ao mesmo tempo consistência perfeita e disponibilidade total.
Consistência exige coordenação entre os nós. Para que toda leitura retorne a última gravação, os nós precisam concordar com o estado atual, o que pode exigir esperar pela comunicação pela rede.
Disponibilidade, por outro lado, prioriza a responsividade. O sistema continua atendendo requisições mesmo se alguns nós estiverem inacessíveis, o que pode resultar no retorno de dados desatualizados ou inconsistentes.
A tolerância a partições é inevitável porque falhas de rede vão acontecer em qualquer sistema real. Isso força os sistemas a fazer uma escolha: durante uma partição, eles devem atrasar as respostas para preservar a consistência ou responder imediatamente e aceitar inconsistência temporária.
Coordenação Distribuída
A coordenação distribuída garante que vários nós concordem sobre decisões compartilhadas e o estado do sistema.
- Os nós devem se coordenar para evitar conflitos e comportamento inconsistente do sistema.
- Padrões comuns incluem eleição de líder, locks distribuídos e consenso.
- Sistemas especializados como ZooKeeper, etcd e Consul lidam com a coordenação de forma confiável.
Detalhes
Em sistemas distribuídos, vários nós operam de forma independente, mas muitas operações exigem que eles atuem de maneira coordenada. Sem coordenação, os nós poderiam tomar decisões conflitantes, levando a dados inconsistentes ou falhas no sistema.
A eleição de líder é um padrão comum em que um nó é escolhido para tomar decisões ou lidar com tarefas críticas. Isso evita que vários nós executem a mesma ação ao mesmo tempo.
Locks distribuídos garantem que apenas um nó possa acessar ou modificar um recurso compartilhado por vez, de forma semelhante aos locks em concorrência de uma única máquina, mas implementados em uma rede.
Algoritmos de consenso vão além, permitindo que os nós concordem sobre um valor ou decisão, mesmo na presença de falhas. Ferramentas como ZooKeeper, etcd e Consul fornecem esses mecanismos de coordenação para que os engenheiros não precisem implementá-los do zero.
Desafios de Sistemas Distribuídos
Sistemas distribuídos introduzem modos de falha e complexidade que não existem em sistemas de máquina única.
- Falhas de rede e latência tornam a comunicação pouco confiável e imprevisível.
- Dados replicados podem ficar temporariamente inconsistentes entre nós.
- Coordenar várias máquinas introduz uma complexidade de design significativa.
Detalhes
Depois que um sistema se torna distribuído, ele precisa operar sobre uma rede, e redes são inerentemente pouco confiáveis. As mensagens podem ser atrasadas, descartadas ou chegar fora de ordem, tornando operações simples muito mais difíceis de raciocinar.
A consistência dos dados também se torna um desafio. Com replicação, diferentes nós podem manter versões diferentes dos mesmos dados em qualquer momento, especialmente sob alta carga ou atrasos de rede.
A coordenação entre nós adiciona outra camada de dificuldade. Garantir que várias máquinas concordem sobre o estado compartilhado ou executem tarefas na ordem correta exige protocolos complexos e um design cuidadoso.
Esses desafios não são casos extremos — eles são fundamentais. Projetar sistemas que permaneçam corretos e confiáveis apesar desses problemas é o problema central que a engenharia de sistemas distribuídos busca resolver.
Seção de Perguntas
1 / 5
Esta lição faz parte do conteúdo premium
Faça upgrade para o plano premium para remover o desfoque e liberar a leitura completa.