Menu Docs
Página inicial do Docs
/
Manual 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 write concern descreve o nível de confirmação solicitado ao MongoDB para operações de escrita em mongod autônomo , conjuntos de réplicas ou clusters fragmentados. Em clusters fragmentados, as instâncias mongos passarão a preocupação de gravação para os shards.

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 preocupação de gravação "majority" para uma transação de vários documentos e a transação não for replicada 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á finalmente consistente. Uma transação é sempre aplicada ou revertida em todos os membros do conjunto de réplicas.

Os conjuntos de réplicas e cluster fragmentado oferecem suporte à definição de uma preocupação de gravação padrão. Operações que não especificam uma preocupação de gravação explícita herdam as configurações padrão de preocupação de gravação global. Consulte setDefaultRWConcern para mais informações.

Para saber mais sobre como configurar a preocupação de gravação 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 nós votantes portadores de dados (ou seja, primário e secundário com members[n].votes maior que 0). { w: "majority" } é a preocupação de gravação padrão para a maioria das implantações do MongoDB. Consulte Preocupação de gravação padrão implícita.

Por exemplo, considere um conjunto de réplicas com 3 membros de votação, Primário-Secundário-Secundário (P-S-S). Para esse conjunto de réplicas, a maioria calculada é dois, e a preocupação de gravação deve se propagar para o primário e um secundário para reconhecer a preocupação de gravação para o cliente.

Membros ocultos, atrasados e prioridade 0 com members[n].votes maior que 0 podem reconhecer "majority" operações de gravação.

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

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

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

Consulte Comportamento de confirmação para saber quando as instâncias mongod confirmam 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 preocupação de gravação { w: 1 }, o diretório de reversão poderá excluir gravações enviadas após uma falha de oplog se o primário reiniciar 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 autônoma ou primário 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.

Membros ocultos, atrasados e prioridade 0 podem confirmar operações de gravação w: <number>.

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

Consulte Comportamento de confirmação para saber quando as instâncias mongod confirmam 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 confirmação para saber quando as instâncias mongod confirmam 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 de mongod, conforme especificado no w: <value>, foram gravadas no diário em disco. j: true não garante por si só que a gravação não será revertida devido ao conjunto de réplicas definido como failover primário.

Com j: true, o MongoDB retorna somente após o número solicitado de membros, incluindo o principal, ter escrito no diário. Anteriormente a preocupação de gravação j: true em um conjunto de réplicas exige apenas que o primary escreva no diário, independentemente da preocupação de gravação w: <value> .

Observação

  • Especificar uma write concern que inclua j: true em uma instância mongod que esteja sendo executada sem registro em diário produz um erro.

  • Se o registro no diário estiver ativado, w: "majority" pode implicar em j: true. A configuração do conjunto de réplicas do writeConcernMajorityJournalDefault determina o comportamento. Consulte Comportamento de confirmação para obter detalhes.

  • Uma write concern que inclui ou implica em j: true causa uma sincronização imediata do diário. Consulte Processo de diário.

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 preocupação de gravação padrão implícita é w: majority. No entanto, considerações especiais são feitas para implantações 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" }.

  • Para um cluster fragmentado, a referência de escrita padrão é sempre recuperada do servidor de configuração. Como o servidor de configuração deve ter zero árbitro, a referência de escrita padrão implícita para um cluster fragmentado é sempre "majority". Mesmo que um fragmento esteja em uma topologia Primário-Secundário-Árbitro, ele ainda terá uma referência de escrita padrão de "majority". A partir do MongoDB 5.1, essa configuração não é permitida se a referência de escrita em todo o cluster não estiver definida.

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:

Non-Arbiters
Á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
On-disk journal
inMemory
w: "majority"
Diário no disco se estiver executando com registro no diário
On-disk journal
inMemory

Observação

Com writeConcernMajorityJournalDefault definido como false, o MongoDB não espera que w: "majority" as gravações sejam gravadas no diário em disco antes de confirmar as gravações. Dessa forma, as operações de gravação "majority" poderiam 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 com dados do conjunto de réplicas pode contribuir para a confirmação de gravação de operações de gravação de "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.

Normalmente, se j: false estiver definido, não é necessário gravar a operação no diário em disco. No entanto, se writeConcernMajorityJournalDefault: true estiver definido, é necessário escrever a operação no diário , mesmo que j: false esteja definido.

Se j: false e writeConcernMajorityJournalDefault: true estiverem definidos, as operações de gravação serão gravadas no diário de forma assíncrona.

  • As gravações que têm w: majority conjunto não são reconhecidas como concluídas até que o diário seja liberado para o disco.

  • w: majority as gravações aguardam a conclusão do snapshot de leitura "majority" , independentemente da configuração j . Isso ocorre porque, se writeConcernMajorityJournalDefault: true estiver definido, o snapshot de leitura majoritário será baseado na maioria das gravações registradas no diário.

  • Depois que a operação de gravação retornar com uma confirmação w: majority para o aplicação cliente , o aplicação poderá ler o resultado da gravação se a preocupação de leitura majority estiver definida.

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 gravação 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

Membros ocultos, atrasados e prioridade 0 podem confirmar operações de gravação w: <number>.

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 a preocupação de gravação "majority".

Para obter detalhes, consulte Consistência causal.

  • Com writeConcernMajorityJournalDefault definido como false, o MongoDB não espera que w: "majority" as gravações sejam gravadas no diário em disco antes de confirmar as gravações. Dessa forma, as operações de gravação "majority" poderiam 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.

  • Membros ocultos, atrasados e prioridade 0 com members[n].votes maior que 0 podem reconhecer "majority" operações de gravação.

    • 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, o qual contém o cálculo da maioria.

A maioria para preocupação de gravação "majority" é calculada como o 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 é igual ao número de todos os membros votantes portadores de dados (como na implantação de 3membros Primário-Secundário-Árbitro), a preocupação de gravação "majority" pode expirar ou nunca ser reconhecida se um membro votante portador de dados estiver 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.

    The calculated majority is 2, the minimum of 2 and 3. The write must propagate to the primary and one of the secondaries to acknowledge the write concern "majority" to the client.
  • 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.

    The calculated majority is 2, the minimum of 2 and 2. Since the write can only be applied to data-bearing members, the write must propagate to the primary and the secondary to acknowledge the write concern "majority" to the client.

    Dica

    Evite usar uma preocupação de gravação "majority" com um (P-S-A) ou outras topologias que exijam que todos os nós votantes portadores de dados estejam disponíveis para reconhecer as gravações. Os clientes que desejam as garantias de durabilidade de usar uma preocupação de gravação "majority" devem, em vez disso, implantar uma topologia que não exija que todos os nós votantes portadores de dados estejam disponíveis (por exemplo. P-S-S).

O MongoDB rastreia a preocupação de gravação provenance, que indica a origem de uma preocupação de gravação específica. Você pode ver provenance nas métricas getLastError, nos objetos de erro de preocupação de gravação e nos 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 gravação foi especificada no aplicativo.
customDefault
A preocupação de gravação originou-se de um valor padrão personalizado definido. Consulte setDefaultRWConcern.
getLastErrorDefaults
A preocupação de gravação 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.

Voltar

"snapshot"