AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 4513
Accepted
Lazer
Lazer
Asked: 2011-08-10 12:24:31 +0800 CST2011-08-10 12:24:31 +0800 CST 2011-08-10 12:24:31 +0800 CST

Qual é o raciocínio por trás do teorema CAP?

  • 772

http://en.wikipedia.org/wiki/CAP_theorem

http://www.cs.berkeley.edu/~brewer/cs262b-2004/PODC-keynote.pdf

Eu acho que não é muito simples porque apenas dois dos

  1. Consistência
  2. Disponibilidade
  3. Tolerância de partição

pode conter para qualquer sistema de banco de dados distribuído. Esta conjectura foi provada, mas existe uma maneira mais fácil de ver por que provavelmente isso pode acontecer?

Não estou procurando uma prova, apenas uma boa maneira de entender por que esse teorema pode fazer sentido. Qual é o raciocínio?

database-design distributed-databases
  • 1 1 respostas
  • 1470 Views

1 respostas

  • Voted
  1. Best Answer
    Richard
    2011-08-11T05:35:22+08:002011-08-11T05:35:22+08:00

    OK, vamos imaginar que você tenha um banco de dados distribuído. Digamos que você tenha um nó no Oregon e outro na Califórnia. A teoria CAP diz que você terá problemas ao configurar esse tipo de banco de dados.

    Por exemplo, se você consultar dados de um banco de dados, eles precisam ser iguais aos dados do outro banco de dados. Isso garante que qualquer valor que você tenha em um banco de dados esteja garantido no outro ( consistência da teoria CAP). Isso permite atualizar os dados em um banco de dados e consultá-los em outro, obtendo os mesmos resultados.

    Um computador atualizando dados em Oregon, transfere os dados para a Califórnia

    Quando atualizamos os dados no nó Oregon, os dados são enviados para o nó Califórnia para que os bancos de dados fiquem consistentes. Para realmente manter a consistência, temos que garantir que ambos os bancos de dados obtenham a atualização antes que qualquer um deles possa realmente salvar os dados (confirmação de duas fases usando transações distribuídas). Em outras palavras, se o banco de dados da Califórnia não puder salvar os dados por algum motivo (por exemplo, falha no disco rígido), o banco de dados do Oregon não salvará os dados e falhará na transação.

    O problema com transações distribuídas como a acima surge quando queremos ter alta disponibilidade. No cenário acima, o processo de tentar sincronizar os dois bancos de dados é um processo muito, muito lento. (Imagine, temos que enviar os dados do Oregon para a Califórnia, garantir que eles cheguem lá, garantir que os dois bancos de dados tenham bloqueios nos dados etc.) Isso causa grandes problemas quando queremos um sistema rápido e responsivo mesmo durante momentos de grande demanda. (Esta é a Disponibilidade do teorema CAP.)

    Normalmente, o que fazemos para garantir alta disponibilidade é usar replicação em vez de transações distribuídas. Então, em vez de garantir que a Califórnia pode aceitar os dados, nós apenas vamos em frente e os armazenamos no nó do Oregon e então enviamos os dados para a Califórnia quando chegarmos lá. Isso garante que sempre podemos armazenar os dados, independentemente de a Califórnia estar pronta para armazenar os dados ou não.

    O nó Oregon atualiza os dados enquanto a Califórnia lê os dados.  Mais tarde, os dados são movidos para a Califórnia

    Isso melhora a Disponibilidade, mas ao custo da Consistência. Veja, se alguém atualiza os dados em Oregon e então alguém (ao mesmo tempo) lê os dados na Califórnia, eles não estão obtendo os novos dados - os bancos de dados não são mais consistentes. Na verdade, eles não serão consistentes até que o Oregon envie os dados para a Califórnia!

    Portanto, essa é a compensação entre Disponibilidade e Consistência.

    A tolerância à partição é o terceiro aspecto da teoria CAP. O particionamento é, neste contexto, a ideia de que um banco de dados (ou outro sistema distribuído) pode ser dividido em seções separadas e ainda funcionar corretamente.

    A questão é: o que acontece quando os dois bancos de dados estão funcionando corretamente, mas o link do Oregon para a Califórnia foi interrompido?

    Oregon está sendo atualizado enquanto o nó da Califórnia está sendo lido.  A rede entre os nós é cortada.

    Se atualizarmos o banco de dados no Oregon, precisamos levar os dados para a Califórnia de uma forma ou de outra (transação distribuída ou replicação). No entanto, se o link entre os dois for interrompido, o sistema tornou-se particionado e os bancos de dados não estão mais vinculados.

    Quando isso acontece, suas escolhas são parar de permitir atualizações (para manter a Consistência) ao custo da Disponibilidade ou permitir as atualizações (para manter a Disponibilidade) ao custo da consistência.

    Como você pode ver, a tolerância à partição cria compensações diretas entre consistência e disponibilidade.


    Obviamente, há mais do que isso, mas esses são alguns exemplos de como esses três principais aspectos dos sistemas distribuídos funcionam uns contra os outros. A explicação de Julian Browne sobre a teoria CAP é um excelente lugar para aprender mais.

    • 28

relate perguntas

  • Os índices filtrados podem ajudar a melhorar as consultas baseadas em uma hora inserida ou isso deve ser evitado?

  • Qual é a diferença entre os tipos de dados MySQL VARCHAR e TEXT?

  • É melhor armazenar os valores calculados ou recalculá-los a pedido? [duplicado]

  • Armazenar vs calcular valores agregados

  • Quais são algumas maneiras de implementar um relacionamento muitos-para-muitos em um data warehouse?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve