fsync
Definição
fsync
Libera todas as gravações pendentes da camada de armazenamento para o disco. Quando o campo
lock
é definido comotrue
, ele define um bloqueio no servidor ou cluster para impedir gravações adicionais até que o bloqueio seja liberado.A partir de MongoDB 7.1 (também disponível a partir de 7.0.2, 6.0.11 e 5.0.22) os comandos
fsync
efsyncUnlock
podem ser executados emmongos
para bloqueio e desbloquear um cluster fragmentado.À medida que os aplicativos gravam dados, o MongoDB registra os dados na camada de armazenamento e, em seguida, grava os dados no disco.
Execute
fsync
quando desejar liberar gravações no disco.Para fornecer dados duráveis, o WiredTiger usa checkpoints. Para obter mais detalhes, consulte Registro no diário e mecanismo de armazenamento WiredTiger.
Importante
Os servidores mantêm uma contagem de bloqueio do fsync . O comando
fsync
com o campolock
definido comotrue
aumenta a contagem de bloqueio , enquanto o comandofsyncUnlock
a diminui. Para habilitar gravações em um servidor ou cluster bloqueado, chame o comandofsyncUnlock
até que a contagem de bloqueio chegue a zero.Use este comando para bloquear gravações quando desejar executar operações de backup.
Dica
Em
mongosh
, esse comando também pode ser executado por meio do método auxiliardb.fsyncLock()
.Os métodos auxiliares são práticos para os usuários
mongosh
, mas podem não retornar o mesmo nível de informações que os comandos do banco de dados. Nos casos em que a praticidade não for necessária ou os campos de retorno adicionais forem necessários, use o comando de banco de dados.
Compatibilidade
Esse comando está disponível em implantações hospedadas nos seguintes ambientes:
MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB
MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB
Sintaxe
O comando tem a seguinte sintaxe:
db.adminCommand( { fsync: 1, lock: <Boolean>, fsyncLockAcquisitionTimeout: <integer>, comment: <any> } )
Campos de comando
O comando tem os seguintes campos:
Campo | Tipo | Descrição |
---|---|---|
fsync | inteiro | Insira "1" para aplicar fsync . |
fsyncLockAcquisitionTimeoutMillis | inteiro | Opcional. Especifica a quantidade de tempo em milissegundos para aguardar a aquisição de bloqueios. Se a operação de aquisição de bloqueio expirar, o comando retornará uma resposta com falha. Padrão: Novidade na versão 7.1. |
lock | booleano | Opcional. Bloqueia o servidor ou cluster e bloqueia todas as operações de gravação. Cada operação fsync com lock possui um bloqueio. |
comment | any | Opcional. Um comentário fornecido pelo usuário para anexar a este comando. Depois de definido, esse comentário aparece junto com os registros desse comando nos seguintes locais:
Um comentário pode ser qualquer tipo BSON válido (string, inteiro, objeto, array etc). |
Considerações
O comando fsync
com a opção lock
garante que os arquivos de dados sejam copiados com segurança usando utilitários de backup de baixo nível, como cp
, scp
ou tar
. Um mongod
iniciado usando os arquivos copiados contém dados escritos pelo usuário que são indistinguíveis dos dados escritos pelo usuário no mongod
bloqueado.
Os arquivos de dados de um mongod
bloqueado podem mudar devido a operações como sincronizações do registro no diário ou snapshots do WiredTiger. Embora isso não tenha efeito nos dados lógicos (por exemplo dados acessados pelos clientes), alguns utilidades de backup podem detectar essas alterações e emitir avisos ou não funcionar com os erros. Para obter mais informações sobre MongoDB- utilidades e procedimentos de backup recomendados, consulte Métodos de backup para um sistema autogerenciado.
Impacto em sistemas maiores
Novidade na versão 7.1.
Quando o comando fsync
é executado em mongos
, ele executa a operação fsync em todo o cluster. Definindo o campo lock
para true
, ele define um bloqueio no cluster, evitando gravações adicionais.
Para fazer um backup autogerenciado utilizável, antes de bloquear um cluster fragmentado:
Certifique-se de que nenhuma operação de migração de shards, refragmentação ou DDL esteja ativa.
Pare o balanceador para evitar o início de migrações de blocos adicionais.
Alternativas com registro no diário
Se o mongod
tiver o registro no diário habilitado, use um sistema de arquivos ou uma ferramenta de snapshot em nível de volume/bloco para criar um backup do conjunto de dados e do diário juntos como uma única unidade.
Contagem de bloqueios
O comando fsync
retorna um documento inclui um campo lockCount
. Ao executar no mongod
, a contagem indica o número de bloqueios do fsync configurados no servidor.
Ao executar em um cluster fragmentado, o mongos
envia a operação fsync para cada shard e retorna os resultados, que inclui o lockCount
para cada um.
Observação
Se o campo lockCount
for maior que zero, todas as gravações serão bloqueadas no servidor e no cluster. Para reduzir a contagem de bloqueio, use o comando fsyncUnlock
.
O Fsync bloqueia após falhas
Os bloqueios do Fsync são executados na primária em um conjunto de réplicas ou cluster fragmentado.
Se o primário ficar inativo ou ficar inacessível devido a problemas de rede, o cluster elege um novo primário dentre os secundários disponíveis. Se um primário com um bloqueio fsync ficar inativo, o novo primário não reterá o bloqueio fsync e poderá lidar com operações de gravação. Quando as eleições ocorrem durante as operações de backup, o backup resultante pode ser inconsistente ou inutilizável.
Para se recuperar da queda primária:
Execute o comando
fsyncUnlock
até que a contagem de bloqueio atinja zero para liberar o bloqueio em todos os nós.Execute o comando
fsync
para restabelecer o bloqueio do fsync no cluster.Reinicie o backup.
Além disso, os bloqueios fsync são persistentes. Quando o primário antigo ficar online novamente, você precisará usar o comando fsyncUnlock
para liberar o bloqueio no nó.
Exemplos
Bloqueio Fsync
Observação
O comando fsync
com a opção lock
garante que os arquivos de dados sejam copiados com segurança usando utilitários de backup de baixo nível, como cp
, scp
ou tar
. Um mongod
iniciado usando os arquivos copiados contém dados escritos pelo usuário que são indistinguíveis dos dados escritos pelo usuário no mongod
bloqueado.
Os arquivos de dados de um mongod
bloqueado podem mudar devido a operações como sincronizações do registro no diário ou snapshots do WiredTiger. Embora isso não tenha efeito nos dados lógicos (por exemplo dados acessados pelos clientes), alguns utilidades de backup podem detectar essas alterações e emitir avisos ou não funcionar com os erros. Para obter mais informações sobre MongoDB- utilidades e procedimentos de backup recomendados, consulte Métodos de backup para um sistema autogerenciado.
O comando fsync
pode bloquear uma instância individual mongod
ou um cluster fragmentado por meio de mongos
. Ao executar com o campo lock
configurado para true
, a operação fsync move todos os dados para a camada de armazenamento e bloqueia todas as operações de gravação adicionais até que você desbloqueie a instância ou cluster.
Para bloquear o banco de dados, utilize o comando fsync
para definir o campo lock
como true
:
db.adminCommand( { fsync: 1, lock: true } )
A operação retorna um documento que inclui o status da operação e o lockCount
:
{ "info" : "now locked against writes, use db.fsyncUnlock() to unlock", "lockCount" : NumberLong(1), "seeAlso" : "http://dochub.mongodb.org/core/fsynccommand", "ok" : 1 }
Quando bloqueado, as operações de gravação são bloqueadas. Conexões separadas podem continuar as operações de leitura até a primeira tentativa de uma operação de gravação e, em seguida, também aguardar até que o servidor ou cluster seja desbloqueado.
Importante
A operação de bloqueio do fsync mantém uma contagem de bloqueio.
Para desbloquear um servidor ou cluster para gravações, a contagem de bloqueio deve ser zero. Ou seja, para o número determinado de vezes que você executa um bloqueio fsync, você deve emitir um número correspondente de operações de desbloqueio para desbloquear o servidor ou cluster para gravações.
Desbloqueio do Fsync
Para desbloquear um servidor de cluster, utilize o comando fsyncUnlock
:
db.adminCommand( { fsyncUnlock: 1 } )
Repita este comando quantas vezes for necessário para reduzir a contagem de bloqueio para zero. Quando a contagem de bloqueios chegar a zero, o servidor ou cluster poderá retomar as gravações.
Verifique o status do bloqueio
Para verificar o estado do bloqueio de sincronização, use db.currentOp()
. Use a seguinte função JavaScript na shell para testar se o servidor ou cluster está atualmente bloqueado:
serverIsLocked = function () { var co = db.currentOp(); if (co && co.fsyncLock) { return true; } return false; }
Após carregar esta função em sua sessão do mongosh
, chame-a com a seguinte sintaxe:
serverIsLocked()
Esta função retornará true
se o servidor ou cluster estiver atualmente bloqueado e false
se o servidor ou cluster não estiver bloqueado.