Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual do MongoDB

Escreva preocupação

Nesta página

  • Especificação de write concern
  • Write concern padrão implícito
  • Comportamento de confirmação
  • Informações adicionais

A preocupação de gravação descreve o nível de confirmação solicitado do MongoDB para operações de gravação em um mongod autônoma, conjunto de réplicas ou cluster fragmentado. Em clusters fragmentados, as instâncias mongos passarão a preocupação de gravação para os fragmentos.

Observação

Para transações com vários documentos, você define a write concern no nível da transação, não no nível da operação individual. Não defina explicitamente a write concern para operações individuais de escrita em uma transação.

Se você especificar uma write concern "majority" para uma transação multidocumento e a transação não conseguir replicar para a maioria calculada dos membros do conjunto de réplicas , a transação poderá não reverter imediatamente os membros do conjunto de réplicas. O conjunto de réplicas será eventualmente consistente. Uma transação é sempre aplicada ou revertida em todos os membros do conjunto de réplicas.

Conjuntos de réplicas e clusters fragmentados suportam a definição de uma referência de escrita padrão global. As operações que não especificam uma referência de escrita explícita herdam as configurações globais padrão de referência de escrita. Consulte setDefaultRWConcern para obter mais informações.

Para saber mais sobre como configurar a write concern para implantações hospedadas no MongoDB Atlas, consulte Construir um Aplicativo Resiliente com MongoDB Atlas

A write concern pode incluir os seguintes campos:

{ w: <value>, j: <boolean>, wtimeout: <number> }
  • a opção W para solicitar o reconhecimento de que a operação de gravação propagou para um número especificado de instâncias do mongod ou para instâncias do mongod com tags especificadas.

  • a opção j para solicitar a confirmação de que a operação de gravação foi gravada no diário em disco, e

  • A opção wtimeout para especificar um limite de tempo para impedir que as operações de gravação sejam bloqueadas indefinidamente.

A opção w solicita o reconhecimento de que a operação de gravação se propagou para um número específico de instâncias mongod ou para instâncias mongod com tags especificadas. Se a write concern estiver faltando no w campo , o MongoDB define a w opção para a write concern padrão.

Observação

Se você usar setDefaultRWConcern para definir a write concern padrão, deverá especificar um valor de campo w.

Utilizando a opção w, as seguintes write concerns do w: <value> estão disponíveis:

Valor
Descrição
"majority"

Solicita o reconhecimento de que as operações de gravação foram comprometidas de forma duradoura com a maioria calculada dos membros votantes portadores de dados (ou seja, primário e secundário com members[n].votes maior que 0). { w: "majority" } é a write concern padrão para a maioria dos sistemas do MongoDB. Consulte Preocupação de gravação padrão implícita.

Por exemplo, considere um conjunto de réplicas com 3 membros votantes, Primary-Secondary-Secondary (PSS). Para esse conjunto de réplicas, a maioria calculada é dois, e a write concern deve se propagar para o primário e um secundário para reconhecer a write concern para o cliente.

Observação

Membrosocultos, atrasados e priority 0 com members[n].votes maior que 0 confirmam operações de escrita "majority" .

Os secundários atrasados podem retornar a confirmação de gravação não antes do secondaryDelaySecsconfigurado.

Depois que a operação de escrita retornar com uma confirmação w: "majority" para o cliente, o cliente pode ler o resultado dessa escrita com um readConcern "majority" .

Se você especificar uma write concern "majority" para uma transação multidocumento e a transação não conseguir replicar para a maioria calculada dos membros do conjunto de réplicas , a transação poderá não reverter imediatamente os membros do conjunto de réplicas. O conjunto de réplicas será eventualmente consistente. Uma transação é sempre aplicada ou revertida em todos os membros do conjunto de réplicas.

Consulte Comportamento de reconhecimento para saber quando as instâncias mongod reconhecem a gravação.

<number>

Solicita confirmação de que a operação de gravação se propagou para o número especificado de instâncias mongod. Por exemplo:

w: 1

As solicitações confirmam que a operação de gravação propagou para o mongod independente ou a primária em um conjunto de réplicas. Os dados poderão ser revertidos se o primário diminuir antes das operações de gravação terem sido replicadas para qualquer um dos secundários.

Aviso

Se as operações de gravação usarem a write concern { w: 1 } , o diretório de rollback poderá excluir as gravações enviadas após um vazio de oplog se o primário for reiniciado antes que a operação de gravação seja concluída.

w: 0

Não solicita confirmação da operação de escrita. No entanto, o w: 0 pode retornar informações sobre exceções de soquete e erros de rede para o aplicativo. Os dados podem ser revertidos se as primárias antes das operações de gravação tiverem sido replicadas para qualquer um dos secundários.

Se você especificar w: 0 , mas incluir j: true, j: true prevalecerá para solicitar a confirmação de mongod standalone ou primary de um conjunto de réplicas.

w maior que 1 requer confirmação do primary e quantos secundários portadores de dados forem necessários para cumprir a write concern especificada. Os secundários não precisam ser membros votantes para atingir o limite de write concern.

Por exemplo, considere um conjunto de réplicas de 3 membros com um primário e 2 secundários. Especificar w: 2 exigiria confirmação do primário e de um dos secundários. Especificar w: 3 exigiria confirmação do primário e de ambos os secundários.

Observação

Membrosocultos, atrasados e priority 0 podem reconhecer w: <number> operações de escrita.

Os secundários atrasados podem retornar a confirmação de gravação não antes do secondaryDelaySecsconfigurado.

Consulte Comportamento de reconhecimento para saber quando as instâncias mongod reconhecem a gravação.

<custom write concern name>

Solicita confirmação de que as operações de escrita foram propagadas para tagged membros que satisfazem a write concern personalizada definida em settings.getLastErrorModes. Por exemplo, consulte Write concerns personalizadas em vários data centers.

Os dados podem ser revertidos se um write concern customizado exigir apenas o reconhecimento da primária e a primária é reduzida antes que as operações de gravação sejam replicadas para qualquer uma das secundárias.

Consulte Comportamento de reconhecimento para saber quando as instâncias mongod reconhecem a gravação.

Dica

Veja também:

A opção j solicita o reconhecimento do MongoDB de que a operação de gravação foi escrita no jornal em disco.

j

Se j: true, solicita confirmação de que as instâncias mongod , conforme especificado no w: <value>, foram gravadas no diário em disco. j: true não garante por si só que a escrita não será revertida devido ao conjunto de réplicas definida como failover primário.

Alterado na versão 3.2: com o j: true, o MongoDB retorna somente após o número solicitado de membros, incluindo o principal, ter escrito no diário. j: true Anteriormente, a write concern em um conjunto de réplicas exigia apenas que a primária escrevesse no diário, independentemente da write concern do valor w: <value>

Observação

Esta opção especifica um limite de tempo, em milésimos de segundo, para a write concern. wtimeout só é aplicável para valores w superiores a 1.

wtimeout faz com que as operações de escrita retornem com um erro após o limite especificado, mesmo que a write concern necessária seja bem-sucedida. Quando essas operações de escrita retornam, o MongoDB não desfaz as modificações de dados bem-sucedidas realizadas antes que a write concern exceda o limite de tempo de wtimeout.

Se você não especificar a opção wtimeout e o nível da write concern for inatingível, a operação de escrita será bloqueada indefinidamente. Especificar um valor wtimeout de 0 é equivalente a uma write concern sem a opção wtimeout.

A partir do MongoDB 5.0, a write concern padrão implícita é w: majority. No entanto, considerações especiais são feitas para sistemas contendo árbitros:

  • A maioria dos votos de um conjunto de réplicas é de 1 mais metade do número de membros votantes, arredondado para baixo. Se o número de membros votantes portadores de dados não for maior que a maioria votante, o write concern padrão é { w: 1 }.

  • Em todos os outros cenários, a preocupação de gravação padrão é { w: "majority" }.

Especificamente, MongoDB usa a seguinte fórmula para determinar a preocupação de escrita padrão:

if [ (#arbiters > 0) AND (#non-arbiters <= majority(#voting-nodes)) ]
defaultWriteConcern = { w: 1 }
else
defaultWriteConcern = { w: "majority" }

Por exemplo, considere as seguintes implantações e suas respectivas preocupações de escrita padrão:

Não Árbitros
Árbitros
Nós de votação
Maioria dos nós de votação
Write concern padrão implícito
2
1
3
2
{ w: 1 }
4
1
5
3
{ w: "majority" }
  • No primeiro exemplo:

    • Existem 2 não-arbitores e 1 árbitro para um total de 3 nós de votação.

    • A maioria dos nós de votação (1 mais metade de 3, arredondado para baixo) é 2.

    • O número de não-arbitros (2) é igual à maioria dos nós de votação (2), resultando em uma preocupação implícita de escrita de { w: 1 }.

  • No segundo exemplo:

    • Existem 4 não-árbitros e 1 árbitro para um total de 5 nós votantes.

    • A maioria dos nós de votação (1 mais metade de 5, arredondado para baixo) é 3.

    • O número de não-arbitros (4) é maior que a maioria dos nós de votação (3), resultando em uma preocupação implícita de escrita de { w: "majority" }.

A opção w e a opção j determinam quando as instâncias do mongod reconhecem operações de gravação.

Um mongod standalone reconhece uma operação de gravação após aplicar a gravação na memória ou depois de gravar no diário em disco. A tabela a seguir lista o comportamento de confirmação para um dispositivo standalone e as write concerns relevantes:

j não é especificado
j:true
j:false
w: 1
inMemory
Diário em disco
inMemory
w: "majority"
Diário no disco se estiver executando com registro no diário
Diário em disco
inMemory

Observação

Com writeConcernMajorityJournalDefault definido como false, o MongoDB não espera que as escritas w: "majority" sejam escritas no diário no disco antes de reconhecer as escritas. Dessa forma, as operações de escrita "majority" podem ser revertidas no caso de uma perda transitória (por exemplo, falha e reinicialização) da maioria dos nós em determinado conjunto de réplicas.

O valor especificado para w set o número de membros do conjunto de réplicas que devem confirmar a gravação antes de retornar o sucesso. Para cada membro elegível do conjunto de réplicas, a opção j determina se o membro reconhece as gravações depois de aplicar a operação de gravação na memória ou depois de gravar no diário no disco.

w: "majority"

Qualquer membro votante portador de dados do conjunto de réplicas pode contribuir para o reconhecimento por escrito das operações de write "majority" .

A tabela a seguir lista quando o membro pode reconhecer a gravação com base no valor j:

j não é especificado

A confirmação depende do valor de writeConcernMajorityJournalDefault:

  • Se true, a confirmação requer uma operação de escrita no diário no disco (j: true).

    writeConcernMajorityJournalDefault o padrão é true

  • Se false, a confirmação requer operação de escrita na memória (j: false).

j: true
O reconhecimento exige a operação de gravação no diário em disco.
j: false
A confirmação requer operação de escrita na memória.

Observação

Para obter detalhes sobre o comportamento, consulte w: "majority" Comportamento.

w: <number>

Qualquer membro de suporte de dados do conjunto de réplicas pode contribuir para o reconhecimento de escrita de w: <number> operações de gravação.

A tabela a seguir lista quando o membro pode reconhecer a gravação com base no valor j:

j não é especificado
A confirmação requer operação de escrita na memória (j: false).
j: true
O reconhecimento exige a operação de gravação no diário em disco.
j: false
A confirmação requer operação de escrita na memória.

Observação

Membrosocultos, atrasados e priority 0 podem reconhecer w: <number> operações de escrita.

Os secundários atrasados podem retornar a confirmação de gravação não antes do secondaryDelaySecsconfigurado.

Com sessões de cliente causalmente consistentes, as sessões de cliente só garantem consistência causal se:

  • as operações de leitura associadas usam "majority" read concern e

  • as operações de gravação associadas usam "majority" write concern.

Para obter detalhes, consulte Consistência causal.

  • Com writeConcernMajorityJournalDefault definido como false, o MongoDB não espera que as escritas w: "majority" sejam escritas no diário no disco antes de reconhecer as escritas. Dessa forma, as operações de escrita "majority" podem ser revertidas no caso de uma perda transitória (por exemplo, falha e reinicialização) da maioria dos nós em determinado conjunto de réplicas.

  • Membrosocultos, atrasados e priority 0 com members[n].votes maior que 0 confirmam operações de escrita "majority" .

    • Os secundários atrasados podem retornar a confirmação de gravação não antes do secondaryDelaySecsconfigurado.

  • Iniciando no MongoDB 5.0, os membros do conjunto de réplicas no estado STARTUP2 não participam em majorias de escrita.

O banco de dados local não oferece suporte a questões de gravação. O MongoDB ignora silenciosamente qualquer write concern configurada para uma operação em uma coleção no banco de dados local.

Dica

O rs.status() retorna o campo writeMajorityCount que contém o número da maioria calculado.

A maioria das write concerns "majority" é calculada como menor dos seguintes valores:

  • a maioria dos todos os membros votantes (incluindo árbitros) vs.

  • o número de todos os membros votantes portadores de dados.

Aviso

Nos casos em que o número da maioria calculada for igual ao número de todos os membros votantes portadores de dados (como em uma implantação de 3membros Primário-Secundário-Árbitro), write concern "majority" pode ter um tempo limite ou nunca ser reconhecida se um membro votante portador de dados está inativo ou inacessível. Se possível, use um membro votante portador de dados, em vez de um árbitro.

Por exemplo, considere:

  • Uma réplica com 3 membros votantes, Primary-Secundário-Secundário (P-S-S):

    • A maioria de todos os membros votantes é 2.

    • O número de todos os membros da votação com recurso de dados é 3.

    A maioria calculada é 2, o mínimo de 2 e 3. A write deve se propagar para o primário e um dos secundários para reconhecer a write concern "majority" para o cliente.
  • Uma réplica com 3 membros votantes, Primário-Secundário-Árbitro (P-S-A)

    • A maioria de todos os membros votantes é 2.

    • O número de todos os membros da votação com recurso de dados é 2.

    A maioria calculada é 2, o mínimo de 2 e 2. Como a gravação só pode ser aplicada a membros portadores de dados, a gravação deve se propagar para o primário e o secundário para reconhecer a write concern "majority" para o cliente.

    Dica

    Evite usar uma write concern "majority" com um (PSA) ou outras topologias que exijam que todos os membros votantes portadores de dados estejam disponíveis para confirmar as escritas. Os clientes que desejam as garantias de durabilidade de usar uma write concern "majority" devem, em vez disso, implantar uma topologia que não exija que todos os membros votantes portadores de dados estejam disponíveis (por exemplo, PSS).

Aviso

Evite implementar mais de um arbiter em um conjunto de réplicas. Consulte Preocupações com vários arbiters.

Para adicionar um árbitro a um conjunto de réplicas existente:

  • Normalmente, se houver dois ou menos membros portadores de dados no conjunto de réplicas, talvez seja necessário definir primeiro a preocupação de gravação em todo o cluster para o conjunto de réplicas.

  • Consulte preocupação de gravação em todo o cluster para obter mais informações sobre por que você pode precisar definir a preocupação de gravação em todo o cluster.

Você não precisa alterar a questão de escrita em todo o cluster antes de começar um novo conjunto de réplicas com um arbiter.

O MongoDB rastreia referência de escrita provenance, o que indica a origem de uma referência de escrita específica. Você pode ver provenance mostrado nas métricas getLastError , objeto de erro de referência de escrita e logs do MongoDB.

A tabela a seguir mostra os possíveis valores de write concern provenance e seu significado:

Proveniência
Descrição
clientSupplied
A preocupação de escrita foi especificada no aplicativo.
customDefault
A write concern originou-se de um valor padrão personalizado definido. Consulte setDefaultRWConcern.
getLastErrorDefaults
A write concern originada do campo settings.getLastErrorDefaults do conjunto de réplicas.
implicitDefault
A preocupação de gravação originou-se do servidor na ausência de todas as outras especificações de preocupação de gravação.

Há diferenças importantes entre quóruns para a confirmação e write concerns:

  • Construções de índice usam quorum para o commit.

  • As operações de escritura usam write concerns.

Cada nó portador de dados em um cluster é um membro votante.

O quorum para o commit especifica quantos membros votantes com dados, ou quais membros votantes, incluindo o primário, devem estar preparados para confirmar uma construção de índice simultânea. antes que o primário execute o commit.

A preocupação de gravação é o nível de reconhecimento de que a gravação se propagou para o número especificado de instâncias.

O quorum de confirmação especifica quantos nós devem estar prontos para concluir a criação do índice antes que o primário faça a confirmação da criação do índice. Por outro lado, quando o primário tiver confirmado a criação do índice, a preocupação de gravação especifica quantos nós devem finalizar a criação do índice antes que o comando retorne.

← Preocupação de leitura "snapshot"