O teorema CAP diz que um sistema distribuído pode fornecer apenas duas de três características desejadas: consistência, disponibilidade e tolerância a partições (o 'C', 'A' e 'P' no CAP).
Já viu um anúncio de um paisagista, pintor de casas ou outro profissional que começa com o título, "Bom, rápido e barato: escolha dois"? O teorema CAP aplica uma lógica semelhante aos sistemas distribuídos.
Um sistema distribuído é uma rede que armazena dados em mais de um nó (físico ou máquinas virtuais) ao mesmo tempo. Como todas as aplicações em nuvem são sistemas distribuídos, é essencial entender o teorema CAP ao projetar uma aplicação em nuvem, para que você possa escolher um sistema de gerenciamento de dados que ofereça as características mais importantes para a sua aplicação.
O teorema CAP também é chamado de Teorema de Brewer, porque foi primeiramente avançado pelo Professor Eric A. Brewer durante uma palestra que ele deu sobre computação distribuída em 2000. Dois anos depois, os professores de MIT Seth Gilbert e Nancy Lynch publicaram uma prova de "Conjectura Brewer".
Vamos dar uma olhada detalhada nas três características do sistema distribuído às quais o teorema CAP se refere.
Consistência
Consistência significa que todos os clientes veem os mesmos dados ao mesmo tempo, independentemente do nó ao qual se conectam. Para que isso aconteça, sempre que os dados forem gravados em um nó, eles deverão ser imediatamente encaminhados ou replicados para todos os outros nós no sistema antes que a gravação seja considerada "sucesso".
Disponibilidade
Disponibilidade significa que qualquer cliente que faça uma solicitação de dados recebe uma resposta, mesmo que um ou mais nós estejam inativos. Outra forma de afirmar isso: todos os nós em funcionamento no sistema distribuído retornam uma resposta válida para qualquer solicitação, sem exceção.
Tolerância à partição
Uma partição é uma quebra de comunicação dentro de um sistema distribuído — uma conexão perdida ou temporariamente atrasada entre dois nós. Tolerância de partição significa que o cluster deve continuar funcionando apesar de qualquer número de quebras de comunicação entre nós no sistema.
Bancos de dados NoSQL são ideais para aplicações em redes distribuídas. Diferente de seus equivalentes SQL (relacionais) escaláveis verticalmente, os bancos de dados NoSQL são escaláveis horizontalmente e distribuídos por design. Eles podem escalar rapidamente em uma rede crescente composta por vários nós interconectados (veja "SQL vs. bancos de dados NoSQL: qual a diferença?" para mais informações).
Atualmente, os bancos de dados NoSQL são classificados com base nas duas características CAP compatíveis:
Mencionamos o tipo de banco de dados CA por último por um motivo: em um sistema distribuído, partições não podem ser evitadas. Assim, embora possamos discutir teoricamente um banco de dados CA distribuído, para todos os propósitos práticos, ele não pode existir. Isso não significa que você não possa ter um banco de dados CA para sua aplicação distribuída, se for necessário. Muitos bancos de dados relacionais, como o PostgreSQL, oferecem consistência e disponibilidade e podem ser implementados em vários nós usando replicação.
O MongoDB é um sistema de gerenciamento de banco de dados NoSQL popular que armazena dados como documentos BSON (JSON binário). É frequentemente utilizado para big data e aplicações em tempo real que rodam em diferentes locais. Em relação ao teorema CAP, o MongoDB é um armazenamento de dados CP. Ele resolve partições de rede mantendo a consistência, enquanto compromete a disponibilidade.
O MongoDB é um sistema single-master, ou seja, cada conjunto de réplicas pode ter apenas um nó primário que recebe todas as operações de gravação. Todos os outros nós no mesmo conjunto de réplicas são nós secundários que replicam o log de operações do nó primário e o aplicam ao seu próprio conjunto de dados. Por padrão, os clientes também leem do nó primário, mas podem especificar uma preferência de leitura que permite ler dos nós secundários.
Quando o nó primário ficar indisponível, o nó secundário com o registo de operação mais recente será eleito como o novo nó primário. Quando todos os outros nós secundários alcançam o novo mestre, o cluster fica disponível novamente. Como os clientes não podem fazer solicitações de gravação durante esse intervalo, os dados permanecem consistentes em toda a rede.
O Apache Cassandra é um banco de dados NoSQL de código aberto mantido pela Apache Software Foundation. É um banco de dados de colunas amplas que permite armazenar dados em uma rede distribuída. No entanto, ao contrário do MongoDB, Cassandra tem uma arquitetura sem mestre e, como resultado, tem vários pontos de falha, em vez de um único.
Em relação ao teorema CAP, o Cassandra é um banco de dados AP — ele oferece disponibilidade e tolerância à partição, mas não consegue fornecer consistência o tempo todo. Como o Cassandra não tem um nó mestre, todos os nós devem estar disponíveis continuamente. No entanto, o Cassandra fornece consistência eventual, permitindo que os clientes gravem em qualquer nó a qualquer momento e reconciliem as inconsistências o mais rápido possível.
Como os dados só se tornam inconsistentes no caso de uma partição de rede e as inconsistências são resolvidas rapidamente, o Cassandra oferece a funcionalidade de "reparo" para ajudar os nós a se aproximarem de seus pares. No entanto, a disponibilidade constante resulta em um sistema de alto desempenho que pode valer o trade-off em muitos casos.
Microsserviços são componentes de aplicação fracamente acoplados e implementáveis de forma independente, que incorporam seu próprio stack (incluindo seu próprio banco de dados e modelo de banco de dados) e se comunicam entre si por meio de uma rede. Como os microsserviços podem ser executados tanto em servidores de nuvem quanto em data centers locais, eles se tornaram altamente populares para aplicações híbridas e de multinuvem.
Entender o teorema CAP pode ajudar você a escolher o melhor banco de dados ao projetar uma aplicação baseada em microsserviços que opera em várias localizações. Por exemplo, se a capacidade de iterar rapidamente o modelo de dados e escalar horizontalmente é essencial para sua aplicação, mas você pode tolerar consistência eventual (em oposição à consistência estrita), um banco de dados AP como Cassandra ou Apache CouchDB pode atender às suas necessidades e simplificar sua implementação. Por outro lado, se sua aplicação depende fortemente da consistência dos dados, como em uma aplicação de eCommerce ou um serviço de pagamento, você pode optar por um banco de dados relacional como PostgreSQL.
Descubra a variedade de bancos de dados em nuvem oferecidos pela IBM para oferecer suporte a diversos casos de uso: desde cargas de trabalho críticas para dispositivos móveis e apps da web até análise de dados.
IBM Cloudant é um banco de dados em nuvem distribuído e escalável baseado no Apache CouchDB e usado para aplicativos web, móveis, IoT e sem servidor.
Obtenha esse banco de dados NoSQL escalável, altamente disponível e nativo na nuvem, criado no Apache Cassandra da IBM, sua única fonte de compra, implantação e suporte.
O MongoDB é um sistema de gerenciamento de banco de dados não relacional de código aberto que usa documentos flexíveis em vez de tabelas e linhas para processar e armazenar várias formas de dados.
Em uma arquitetura de microsserviços, cada aplicativo é composto por muitos serviços menores, vagamente acoplados e implantáveis de forma independente.
Apache CouchDB é um banco de dados de documentos NoSQL de código aberto que armazena dados em formatos baseados em JSONs.