Consistência causal e write and read concerns
Comas sessões de cliente causalmente consistentes do MongoDB, diferentes combinações de preocupações de leitura e gravação fornecem diferentes garantias de consistência causal.
A tabela a seguir indica as garantias específicas fornecidas por diferentes combinações:
Preocupação de leitura | Escreva preocupação | Ler as próprias gravações | Leituras monotônicas | Escritas monotônicas | Escritas que seguem as leituras |
---|---|---|---|---|---|
✅ | ✅ | ✅ | ✅ | ||
✅ | ✅ | ||||
✅ |
Se você quiser consistência causal com durabilidade de dados, então, como visto na tabela, somente as operações de leitura com read concern "majority"
e as operações de escrita com write concern "majority"
podem garantir as quatro garantias de consistência causal. Ou seja, sessões de clientes com consistência causal só podem garantir a consistência causal para:
Operações de leitura com read concern
"majority"
; Em outras palavras, as operações de leitura que retornam dados que foram reconhecidos pela maioria dos membros do conjunto de réplicas e são duráveis.Operações de gravação com preocupação de gravação
"majority"
; em outras palavras, as operações de gravação que solicitam o reconhecimento de que a operação foi aplicada à maioria dos membros com direito a voto do conjunto de réplicas.
Se você quiser consistência causal sem durabilidade de dados (o que significa que as gravações podem ser revertidas), as operações de gravação com preocupação de gravação { w: 1 }
também poderão fornecer consistência causal.
Observação
As outras combinações de read e write concerns também podem satisfazer as quatro garantias de consistência causal em algumas situações, mas não necessariamente em todas as situações.
A preocupação de leitura "majority"
e a preocupação de gravação "majority"
asseguram que as quatro garantias de consistência causal sejam mantidas mesmo em circunstâncias (como em uma partição de rede) em que dois membros em um conjunto de réplicas acreditam transitoriamente que são os principais. E embora ambos os primários possam concluir gravações com { w: 1 }
preocupação de gravação, apenas um primário será capaz de concluir gravações com "majority"
preocupação de gravação.
Por exemplo, considere uma situação em que uma partição de rede divide um conjunto de réplica de cinco membros:
Exemplo
Com a partição acima
As escritas com write concern
"majority"
podem ser concluídas emP
new, mas não podem ser concluídas emP
old.As gravações com preocupação de gravação
{ w: 1 }
podem ser concluídas emP
antigo ouP
novo. No entanto, as gravações emP
antigas (bem como as gravações replicadas paraS
1) são revertidas quando esses membros recuperam a comunicação com o restante do conjunto de réplicas.Depois de uma gravação bem-sucedida com
"majority"
preocupação de gravação emP
novas e causalmente consistentes com"majority"
preocupação de gravação pode observar a escrita emP
novo,S
2 eS
3. As leituras também podem observar a gravação emP
antigo eS
1, uma vez que podem se comunicar com o resto do conjunto de réplicas e sincronizar com os outros membros do conjunto de réplicas. Quaisquer gravações feitas emP
antigo e/ou replicadas emS
1 durante a partição serão revertidas.
Scenarios
Para ilustrar os requisitos de read e write concern, nos exemplos a seguir, um cliente realiza uma sequência de operações com diferentes combinações de read e write concerns no conjunto de réplicas:
Preocupação de leitura
"majority"
e preocupação de gravação"majority"
Preocupação de leitura
"majority"
e preocupação de gravação{w: 1}
Preocupação de leitura
"local"
e preocupação de gravação"majority"
Preocupação de leitura
"local"
e preocupação de gravação{w: 1}
Read "majority"
concern e write concern "majority"
O uso de "majority"
de preocupação de leitura e "majority"
de preocupação de escrita em uma sessão causalmente consistente fornece as seguintes garantias de consistência causal:
✅ Ler as próprias escritas ✅ Leituras monotônicas ✅ Escritas monotônicas ✅ As escritas seguem as leituras
Observação
Cenário 1 (Leia Preocupação "maioria" e Preocupação de Gravação "maioria")
Durante o período transitório com dois primaries, como somente P
new pode realizar escritas com write concern { w: "majority" }
, uma sessão de cliente pode emitir a seguinte sequência de operações com sucesso:
Sequência | Exemplo |
---|---|
1. Write 1 with write concern "majority" to P new2. Read 1 with read concern "majority" to S 23. Write 2 with write concern "majority" to P new4. Read 2 with read concern "majority" to S 3 | For item A , update qty to 50 .Read item A .For items with qty less than or equal to 50 ,update restock to true .Read item A . |
✅ Ler as próprias gravações | Read 1 reads data from S 2 that reflects a state after Write 1.Read 2 reads data from S 3 that
reflects a state after Write 1 followed by Write
2. |
✅ Leituras monotônicas | A leitura 2 lê dados de S 3 que refletem um estado após a leitura 1. |
✅ Escritas monotônicas | A escrita 2 atualiza dados em P novos que reflitam um estado após a gravação 1. |
✅ Escritas que seguem as leituras | A gravação 2 atualiza os dados no P novo que reflete um estado dos dados após a leitura 1 (o que significa que um estado anterior reflete a leitura dos dados pela gravação 1). |
Observação
Cenário 2 (Preocupação de leitura "maioria" e Preocupação de gravação "maioria")
Considere uma sequência alternativa em que a leitura 1 com a preocupação de leitura "majority"
é direcionado para S
1:
Sequência | Exemplo |
---|---|
1. Write 1 with write concern "majority" to P new2. Read 1 with read concern "majority" to S 13. Write 2 with write concern "majority" to P new4. Read 2 with with read concern "majority" to S 3 | For item A , update qty to 50 .Read item A .For items with qty less than or equal to 50 ,update restock to true .Read item A . |
Nessa sequência, a leitura 1 não pode retornar até que o ponto de confirmação da maioria tenha avançado sobre P
antigo. Isso não pode ocorrer até que P
o antigo e S
1 possam se comunicar com o restante do conjunto de réplicas; nesse momento, P
antigo deixou o cargo (se ainda não houver) e os dois membros sincronizam (incluindo Gravação 1) dos outros membros do conjunto de réplicas.
✅ Ler as próprias gravações | Read 1 reflects a state of data after Write
1, albeit after the network partition has healed
and the member has sync'ed from the other members of the
replica set. Read 2 reads data from S 3 that
reflects a state after Write 1 followed by Write
2. |
✅ Leituras monotônicas | A leitura 2 lê dados da S 3 que refletem um estado após a leitura 1 (o que significa que um estado anterior é refletido nos dados lidos pela leitura 1). |
✅ Escritas monotônicas | A escrita 2 atualiza dados em P novos que reflitam um estado após a gravação 1. |
✅ Escritas que seguem as leituras | A gravação 2 atualiza os dados no P novo que reflete um estado dos dados após a leitura 1 (o que significa que um estado anterior reflete a leitura dos dados pela gravação 1). |
Read "majority"
concern e write concern {w: 1}
O uso da read concern "majority"
e da write concern { w: 1 }
em uma sessão com consistência causal fornece as seguintes garantias de consistência causal se você quiser consistência causal com durabilidade de dados:
✅ Ler as próprias escritas ✅ Leituras monotônicas ✅ Escritas monotônicas ✅ As escritas seguem as leituras
Se você quiser consistência causal sem durabilidade de dados:
✅ Ler as próprias escritas ✅ Leituras monotônicas ✅ Escritas monotônicas ✅ As escritas seguem as leituras
Observação
Cenário 3 (Preocupação de leitura "maioria" e Preocupação de gravação {w: 1})
Durante o período transitório com dois primários, como P
antigo e P
novo podem realizar gravações com relação à gravação { w: 1 }
, uma sessão de cliente pode emitir a seguinte sequência de operações com sucesso, mas não ser causalmente consistente se você quiser consistência causal com durabilidade de dados:
Sequência | Exemplo |
---|---|
1. Write 1 with write concern { w: 1 } to P old2. Read 1 with read concern "majority" to S 23. Write 2 with write concern { w: 1 } to P new4. Read 2 with with read concern "majority" to S 3 | For item A , update qty to 50 .Read item A .For items with qty less than or equal to 50 ,update restock to true .Read item A . |
Nesta sequência,
A leitura 1 não pode retornar até que o ponto de confirmação da maioria tenha avançado em
P
novo após a hora da gravação 1.A leitura 2 não pode retornar até que o ponto de confirmação da maioria tenha avançado em
P
novo após a hora da gravação 2.A gravação 1 será revertida quando a partição da rede for curada.
➤ Se você quiser consistência causal com durabilidade de dados
❌ Leia suas próprias escritas | A leitura 1 lê dados de S 2 que não refletem um estado após a gravação 1. |
✅ Leituras monotônicas | A leitura 2 lê dados da S 3 que refletem um estado após a leitura 1 (o que significa que um estado anterior é refletido nos dados lidos pela leitura 1). |
❌ Escritas monotônicas | A gravação 2 atualiza os dados em P novo que não reflete um estado após a gravação 1. |
✅ Escritas que seguem as leituras | A gravação 2 atualiza os dados em P novo que reflete um estado após a leitura 1 (o que significa que um estado anterior reflete os dados lidos pela leitura 1). |
➤ Se você quiser consistência causal sem durabilidade de dados
✅ Ler as próprias gravações | A leitura 1 lê dados de S 2 que refletem 1 1um estado equivalente à gravação seguido de reversão da gravação . |
✅ Leituras monotônicas | A leitura 2 lê dados da S 3 que refletem um estado após a leitura 1 (o que significa que um estado anterior é refletido nos dados lidos pela leitura 1). |
✅ Escritas monotônicas | Gravar 2 atualiza dados em P novo que é equivalente a após a Gravação 1 seguido pela reversão da Gravação 1. |
✅ Escritas que seguem as leituras | Gravar 2 atualiza dados em P novo que reflete um estado após a Leitura 1 (ou seja, cujo estado anterior reflete os dados lidos pela Leitura 1 ). |
Observação
Cenário 4 (Preocupação de leitura "maioria" e Preocupação de gravação {w: 1})
Considere uma sequência alternativa em que a leitura 1 com a preocupação de leitura "majority"
é direcionado para S
1:
Sequência | Exemplo |
---|---|
1. Write 1 with write concern { w: 1 } to P old2. Read 1 with read concern "majority" to S 13. Write 2 with write concern { w: 1 } to P new4. Read 2 with with read concern "majority" to S 3 | For item A , update qty to 50 .Read item A .For items with qty less than or equal to 50 ,update restock to true .Read item A . |
Nesta sequência:
A leitura 1 não pode retornar até que o ponto de confirmação majoritário tenha avançado em
S
1. Isso não pode ocorrer até queP
antigo eS
1 possam se comunicar com o resto do conjunto de réplicas. Nesse momento,P
antigo foi desativado (se ainda não), Gravação 1 é revertido deP
antigo eS
1 e os dois membros são sincronizados com os outros membros do conjunto de réplicas.
➤ Se você quiser consistência causal com durabilidade de dados
❌ Leia suas próprias escritas | Os dados lidos pela Leitura 1 não refletem os resultados da Gravação 1, que foi revertida. |
✅ Leituras monotônicas | A leitura 2 lê dados de S 3 que refletem um estado após a leitura 1 (ou seja, cujo estado anterior reflete os dados lidos pela leitura 1). |
❌ Escritas monotônicas | A gravação 2 atualiza os dados em P novo que não reflete um estado após a gravação 1, que tinha precedido a gravação 2, mas voltou atrás. |
✅ Escritas que seguem as leituras | Gravar 2 atualiza dados em P novo que reflete um estado após a Leitura 1 (ou seja, cujo estado anterior reflete os dados lidos pela Leitura 1 ). |
➤ Se você quiser consistência causal sem durabilidade de dados
✅ Ler as próprias gravações | A Leitura 1 retorna dados que refletem o resultado final da Gravação 1 , já que a Gravação 1 é revertida. |
✅ Leituras monotônicas | A leitura 2 lê dados de S 3 que refletem um estado posterior à leitura 1 (o que significa que um estado anterior reflete os dados lidos pela leitura 1). |
✅ Escritas monotônicas | Gravar 2 atualiza dados em P novo que é equivalente a após a Gravação 1 seguido pela reversão da Gravação 1. |
✅ Escritas que seguem as leituras | A gravação 2 atualiza os dados em P novo que reflete um estado após a leitura 1 (o que significa que um estado anterior reflete os dados lidos pela leitura 1). |
Read "local"
concern e write concern {w: 1}
O uso de "local"
de preocupação de leitura e preocupação de escrita { w: 1 }
em uma sessão causalmente consistente não pode garantir consistência causal.
✅ Ler as próprias escritas ✅ Leituras monotônicas ✅ Escritas monotônicas ✅ As escritas seguem as leituras
Essa combinação pode satisfazer as quatro garantias de consistência causal em algumas situações, mas não necessariamente em todas.
Observação
Cenário 5 (Preocupação de leitura "local" e Preocupação de Gravação {w: 1})
Durante esse período transitório, como P
old e P
new podem realizar gravações com write concern { w: 1 }
, uma sessão de cliente pode emitir a seguinte sequência de operações com sucesso, mas sem consistência causal:
Sequência | Exemplo |
---|---|
For item A , update qty to 50 .Read item A .For items with qty less than or equal to 50 ,update restock to true .Read item A . |
❌ Ler as próprias escritas | A leitura 2 lê dados de S 3 que refletem somente um estado após a gravação 2 e não a gravação 1 seguido pela gravação 2. |
❌ Leituras monotônicas | A leitura 2 lê dados de S 3 que não refletem um estado após Ler 1 (o que significa que um estado anterior não refletem os dados lidos por Ler 1). |
❌ Escritas monotônicas | A gravação 2 atualiza os dados em P novo que não reflete um estado após a gravação 1. |
❌ Escrever, seguir, ler | A gravação 2 atualiza os dados em P novo que não reflete um estado após a leitura 1 (o que significa que um estado anterior não reflete os dados lidos pela leitura 1). |
Read "local"
concern e write concern "majority"
O uso de "local"
de preocupação de leitura e "majority"
de preocupação de escrita em uma sessão causalmente consistente fornece as seguintes garantias de consistência causal:
✅ Ler as próprias escritas ✅ Leituras monotônicas ✅ Escritas monotônicas ✅ As escritas seguem as leituras
Essa combinação pode satisfazer as quatro garantias de consistência causal em algumas situações, mas não necessariamente em todas.
Observação
Cenário 6 (Preocupação de leitura "local" e Preocupação de gravação "maioria")
Durante esse período transitório, como somente P
new pode realizar escritas com write concern { w: "majority" }
, uma sessão de cliente pode emitir a seguinte sequência de operações com sucesso, mas sem consistência causal:
Sequência | Exemplo |
---|---|
1. Write 1 with write concern "majority" to P new2. Read 1 with read concern "local" to S 13. Write 2 with write concern "majority" to P new4. Read 2 with read concern "local" to S 3 | For item A , update qty to 50 .Read item A .For items with qty less than or equal to 50 ,update restock to true .Read item A . |
❌ Ler as próprias escritas. | Read 1 lê dados de S 1 que não refletem um estado após o Write 1. |
❌ Leituras monotônicas. | A leitura 2 lê dados de S 3 que não refletem um estado após Ler 1 (o que significa que um estado anterior não refletem os dados lidos por Ler 1). |
✅ Escritas monotônicas. | A escrita 2 atualiza dados em P novos que reflitam um estado após a gravação 1. |
❌ Escrever, seguir, ler. | A gravação 2 atualiza os dados em P novo que não reflete um estado após a leitura 1 (o que significa que um estado anterior não reflete os dados lidos pela leitura 1). |