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 / unix / Perguntas / 419564
Accepted
Stilez
Stilez
Asked: 2018-01-26 02:56:35 +0800 CST2018-01-26 02:56:35 +0800 CST 2018-01-26 02:56:35 +0800 CST

Desativar um pool ZFS com rapidez e segurança como um todo monolítico?

  • 772

Tanto quanto a pergunta diz.

Suponha que eu queira ter o equivalente a um "botão de emergência" com script para meu pool FreeNAS - algo que eu possa clicar para executar a partir de uma GUI ou executar no console/SSH, que fecha rapidamente tudo o que pode estar lendo ou gravando nele, desmonta o sistema de arquivos e - idealmente - desativa os discos ou partições que está usando.

Não me importo com erros que surjam em outro software ou conexões remotas ao fazer isso, ou abortar qualquer transferência de arquivo longa prematuramente, só quero que ele desligue o pool da maneira mais rápida que seja consistente em manter sua consistência e possivelmente dar alguns segundos para que qualquer gravação pendente seja concluída e o pool esteja em um estado consistente para fins de dados.

As opções sugeridas pelos comandos do ZFS não parecem promissoras: zpool offlinefunciona apenas em dispositivos individuais, portanto, pode haver uma condição de corrida se a gravação ocorrer enquanto os discos são removidos um por vez; zpool exportrequer a opção -f se estiver em uso e carrega um aviso que -ftambém pode perder dados. Pode-se verificar todos os abertos file descriptorsusando o pool ou seus dispositivos (milhares ou centenas de milhares deles?) E forçar manualmente o fechamento de cada um, mas isso pode atingir as condições de corrida, pois não impede que novos fds sejam criados ao mesmo tempo. Também não devo presumir que toda a atividade do ZFS é mediada por uma lista de daemons de serviço de arquivo remoto para receber sinais de saída, porque é provável que algumas atividades de arquivo sejam locais (cron/CLI/sessões desanexadas).

Então, olhando para a melhor forma de desligar um pool inteiro com segurança e rapidez, parece que umountpode ser minha melhor aposta - funciona no nível do sistema de arquivos e pode desligar todo um sistema de arquivos rapidamente e como uma unidade monolítica, após o que zpool exportparece que seria em seguida, seja capaz de realmente concluir e desativar qualquer atividade interna de maneira segura, sem a -fopção, mantendo os próprios dados em um estado consistente garantido. Se houver atividade de disco bruto em andamento (resilver ou scrub), acho que isso será retomado ou reiniciado quando o pool for colocado online novamente.

Mas ainda umountnão parece fazê-lo completamente, porque também pode haver zvolalvos iSCSI em uso. Os dados dentro deles inerentemente não podem ser mantidos consistentes, pois o servidor não conhece sua estrutura; portanto, os iniciadores remotos terão que reparar os dados da melhor maneira possível quando se reconectarem. Estou bem com isso, mas não tenho certeza se algum tipo de comando para forçar o encerramento ou off-line dos destinos é necessário ou se é uma prática recomendada. (Observação: o encerramento forçado de conexões tem os mesmos problemas que o fechamento de fds individuais.)

Estou ciente de que provavelmente haverá algum tipo de perda ou problema de dados se o pool for abruptamente expulso do estado RW quando as gravações estiverem acontecendo. Mas, desde que não perca a consistência (em um pool ZFS e no nível do sistema de arquivos), tudo bem - todos os arquivos em uso/destinos iSCSI sendo atualizados terão que se arriscar em arquivos/blocos em um ZFS consistente mas estado de dados inválidos devido a ficar off-line no meio da gravação dos dados. Isso é inevitável e não é um problema para a pergunta.

Então, quais etapas eu realmente preciso fazer para desligar um pool em uso o mais rápido possível, consistente com a garantia de segurança e consistência do pool - e fazer manualmente umountum sistema de arquivos ZFS em uso (como parte de uma solução) seria seguro ou carrega algum risco de danos aos dados?

Atualização: mencionando aqui caso alguém ache isso útil. A resposta aceita afirma que export -fpode haver problemas com zvols (iSCSI, etc.). Com base nessa dica, descobri que o manipulador iSCSI usado pelo FreeNAS pode forçar o logout/encerramento de sessões e possui outros subcomandos úteis que podem ser emitidos antecipadamente - consulte man ctladm. Seja qual for o uso de seus zvols, é provável que haja algum comando para encerrar as sessões neles.)

freebsd zfs
  • 1 1 respostas
  • 2425 Views

1 respostas

  • Voted
  1. Best Answer
    user121391
    2018-01-30T08:08:45+08:002018-01-30T08:08:45+08:00

    Isenção de responsabilidade: não tenho muitos links e referências para fazer backup de tudo abaixo no momento e não testei extensivamente. Este é apenas um resumo das coisas que li nos últimos cinco a sete anos sobre o ZFS e como ele funciona, e alguns testes próprios limitados (não coordenados, mas principalmente reinicializações aleatórias).

    Além disso, tudo abaixo é dito sem relação a eventos catastróficos (o servidor queima completamente), bugs de software (bugs no ZFS e no sistema operacional principal, bem como nos controladores de hardware) e malícia ativa (administrador desonesto, erros de administração). Para todos esses casos, você ainda precisa ter backups regulares e restauráveis!


    Dados em repouso/consistência em disco

    Não me importo com erros que surjam em outro software ou conexões remotas ao fazer isso, ou abortar qualquer transferência de arquivo longa prematuramente, só quero que ele desligue o pool da maneira mais rápida que seja consistente em manter sua consistência e possivelmente dar alguns segundos para que qualquer gravação pendente seja concluída e o pool esteja em um estado consistente para fins de dados.

    Primeiro, a boa notícia: como o ZFS usa CoW e transações atômicas, seus dados já existentes estarão seguros mesmo em caso de perda repentina de energia. Isso inclui o layout e os metadados do pool. Como os dados antigos nunca são movidos antes que os novos dados tenham sido completamente gravados (na verdade, nunca são movidos, apenas realocados), esses dados não podem correr perigo de forma alguma se a gravação for interrompida repentinamente.

    Além disso, somas de verificação (árvores de hash Merkle) ajudam a certificar que nada de ruim aconteceu durante a reinicialização, o que você pode verificar limpando o pool. Se você tiver vdevs redundantes, o ZFS corrigirá automaticamente quaisquer erros encontrados em uma cópia em bom estado. Se alguns blocos tivessem sido corrompidos de alguma forma (por exemplo, por um controlador de disco desonesto que não escreve, mas diz que sim), suas somas de verificação não corresponderiam às de outros vdevs e os erros seriam exibidos.

    Dados em modos de voo/gravação e perda dos últimos n segundos

    Gravações sincronizadas e assíncronas

    Normalmente, o ZFS coleta várias transações para acelerar as gravações dispendiosas em unidades rotativas - posicionar o cabeçote de gravação do HDD leva muito mais tempo do que realmente gravar, portanto, você desejará enfileirar o máximo possível e, em seguida, gravá-lo em sequencial (mais rápido !) ordem (lembre-se, temos CoW, isso funciona naturalmente aqui).

    A desvantagem disso é que quanto mais tempo você coletar, mais tempo seus aplicativos terão que esperar por uma mensagem de "gravação bem-sucedida" - o que significa que seu sistema travará por vários segundos, o que é inaceitável. Pior ainda - você perderá todos os dados que devem ser gravados no disco, mas ainda não foram gravados em caso de falha de energia. Se seus aplicativos não puderem lidar com isso, pode ocorrer corrupção na camada do aplicativo.

    Para combater isso, o ZIL (ZFS intent log) foi adicionado. Todas as transações de sincronização são coletadas neste log (que é armazenado por padrão no disco do pool lento, mas pode ser armazenado em SSDs espelhados mais rápidos, chamados de dispositivos SLOG) e depois de armazenados, "gravação bem-sucedida" é retornada ao aplicativo que pode continuar com suas tarefas (não há mais bloqueios longos). Além disso, todas as transações assíncronas são feitas sem o ZIL, para que possam ser mais rápidas - desde que o aplicativo chame as operações de gravação corretas para seus dados (sincronização versus assíncrona).

    Propriedades do ZFS

    Agora, a parte mais interessante - o que acontece com suas gravações? Aí temos que discernir o modo de operação do sistema de arquivos (é uma propriedade do ZFS e pode ser definido individualmente para cada sistema de arquivos). Os três modos possíveis são (das páginas de manual):

    sync=standard
      This is the default option. Synchronous file system transactions
      (fsync, O_DSYNC, O_SYNC, etc) are written out (to the intent log)
      and then secondly all devices written are flushed to ensure
      the data is stable (not cached by device controllers).
    
    sync=always
      For the ultra-cautious, every file system transaction is
      written and flushed to stable storage by a system call return.
      This obviously has a big performance penalty.
    
    sync=disabled
      Synchronous requests are disabled.  File system transactions
      only commit to stable storage on the next DMU transaction group
      commit which can be many seconds.  This option gives the
      highest performance.  However, it is very dangerous as ZFS
      is ignoring the synchronous transaction demands of
      applications such as databases or NFS.
      Setting sync=disabled on the currently active root or /var
      file system may result in out-of-spec behavior, application data
      loss and increased vulnerability to replay attacks.
      This option does *NOT* affect ZFS on-disk consistency.
      Administrators should only use this when these risks are understood.
    

    Você notará que, mesmo que disabledseja escolhido, o layout/consistência interna do seu pool não é afetado - você perderá apenas seus últimos 5 segundos de dados e isso pode colocar seus arquivos em um estado incorreto (por exemplo, porque você tem uma VM em top que espera gravações de sincronização, mas você forneceu apenas um zvol assíncrono como um armazenamento de dados de apoio).

    Por outro lado, se você não quer perder nada , defina todos os seus sistemas de arquivos alwayse mude para SSDs de alto desempenho, pelo menos para o dispositivo SLOG (ou sofra os tempos de espera).

    standardé um compromisso e o mais flexível - o próprio aplicativo decide qual modo de gravação ele precisa. Se seus aplicativos estiverem ruins, você pode sofrer perda de dados. Se eles se comportarem, você terá o melhor desempenho possível com uma determinada linha de base de segurança.

    Exportação/importação de pool:

    Da documentação sobre zpool export:

    O comando tenta desmontar quaisquer sistemas de arquivos montados no conjunto antes de continuar. Se algum dos sistemas de arquivos falhar ao desmontar, você pode desmontá-los à força usando a opção -f.

    Se os dispositivos estiverem indisponíveis no momento da exportação, eles não poderão ser identificados como exportados corretamente. Se um desses dispositivos for posteriormente conectado a um sistema sem nenhum dos dispositivos em funcionamento, ele aparecerá como “potencialmente ativo”.

    Se os volumes ZFS estiverem em uso no pool, o pool não poderá ser exportado, mesmo com a opção -f. Para exportar um pool com um volume ZFS, primeiro certifique-se de que todos os consumidores do volume não estejam mais ativos.

    Isso significa aproximadamente três coisas:

    • -fforça o pool a ser exportado pela desmontagem forçada de todos os sistemas de arquivos, mesmo que estejam ativos (desconsiderando bloqueios ou aplicativos gravados lá)
    • Isso não funciona com zvols
    • Você não deve dividir pools e usá-los em sistemas diferentes (tenha cuidado com situações de failover )

    Resumo:

    • Se tudo o que importa é a consistência no disco, você está export -fpronto ou um desligamento completo
    • Se você se preocupa com todos os dados, use sync=alwaysSSDs rápidos
    • Em relação ao iSCSI/NFS como armazenamento de dados para VMs, esta visão geral também pode ser útil (trecho: use NFS ou desabilite o cache de write-back iSCSI no host convidado/VM; desative a VM antes de tirar um instantâneo do ZFS, o ZFS funcionará de qualquer maneira, mas a VM convidada ser apenas consistente com falhas)

    Em resposta às perguntas de acompanhamento dos comentários (perguntas omitidas para as quais não tenho respostas úteis):

    (1) "boas notícias/COW" - e se os blocos de nível superior estivessem prestes a atualizar - sempre encontrará um bloco de nível superior utilizável (mesmo que aponte para versões ligeiramente antigas da árvore de metadados)? Quão ruim isso pode ficar?

    O pior caso seria que o uberblock (aquele no topo de todos os outros) fosse danificado em todos os dispositivos redundantes. Como não há bloco acima dele, você não pode reconstruí-lo de cima, então existem várias cópias de cada uberblock (IIRC eram cerca de 3 ou 4), então uma pode ser perdida e uma cópia de substituição ainda está lá.

    (2) Estou familiarizado com TXGs e uso ESXi. Usando APC UPS + bom PSU/hw + P3700 NVMe ZIL, então é uma potência decente + ZIL rápido. Mas é improvável que as gravações atuais sejam todas sincronizadas e, como você diz, a sincronização = sempre é lenta. Mas sua resposta levanta um pensamento, posso fazer alguns testes de desempenho. Estou usando dedup (economia de 4x, vale a pena), então escreva = lento de qualquer maneira (precisa procurar DDT). O motivo de sincronizar = sempre afeta apenas a gravação, que é lenta devido ao DDT. Mas definir sync=always força o ZIL, o ZIL é muito rápido e isso torna os TXGs longos seguros, o que pode significar que o acesso ao disco é mais eficiente. Ou pode matar a latência. Não faço ideia de qual! Pode ter que tentar!

    Não tenho experiência real com dedup, então não posso dizer nada de útil aqui, exceto que você já fez boas escolhas em hardware (baixa latência, alta IOPS de gravação aleatória de 64k, interface NVMe). Só poderia ser mais rápido se você investisse em alguma unidade de RAM permanente realmente cara (ZeusRAM et al.).

    (6) Por "consistência de disco" você quer dizer que o ZFS é feliz e o pool é autoconsistente? Não estou preocupado se alguns arquivos/diretórios. terminar com conteúdo inválido ou não movido/excluído é o pool que desaparece repentinamente ou o sistema de arquivos como NTFWS/VMFS em um zvol é corrompido internamente (ou seja, como um ZFS zvol está bom, mas da perspectiva do cliente ele precisa de fsck/chkdsk), pool fornecido é seguro/consistente como o ZFS o vê

    Sim. Essencialmente "minha piscina não está fodida, yay!" em uma configuração multiusuário - mesmo que um usuário tenha problemas com seus arquivos, os outros não sofrem.

    (7) Por "crash consistente" você quer dizer o que eu quero dizer (acho que sim) - que o ZFS vai ficar bem, o pool até onde o ZFS vê vai ficar bem, mas os dados do cliente remoto podem ser mutilados daquele cliente perspectiva da mesma forma como se o cliente tivesse atingido uma falha repentina de E/S de disco e as gravações tivessem sido perdidas? == o pool ficará bem, o cliente pode ter dados perdidos/inconsistentes e pode precisar de ajuda para recuperar, como em qualquer outra falha de E/S de disco ou travamento do sistema?

    Sim, essencialmente um hard power off da VM em vez de um desligamento limpo e ENTÃO tirando um instantâneo - se você ligá-lo depois, fsckou similar dependendo do sistema de arquivos será executado e pode reclamar de desligamento impuro. Isso contrasta com os instantâneos do ESXi, que são retomados no ponto exato no tempo como se nada tivesse acontecido, mas precisam de interação com o sistema convidado (adições de convidado instaladas) e incluem a memória virtual da VM.

    Você pode combinar ambos a seu favor: primeiro tire um instantâneo do ESXi e depois um instantâneo do ZFS do armazenamento de dados (o ESXi armazena seus instantâneos junto com a VM). Em seguida, exclua seu instantâneo ESXi, mas mantenha o ZFS (ocupa muito menos espaço devido às cópias em nível de bloco). Ao restaurar, primeiro restaure o instantâneo do ZFS e, em seguida, reverta para o instantâneo do ESXi (salvo) e você continuará de onde parou. napp-it (excelente sistema de gerenciamento ZFS com interface da Web) tem esse conceito integrado (pelo menos para armazenamentos de dados NFS, não verifiquei o iSCSI, mas suponho que seja semelhante).

    • 5

relate perguntas

  • O ZFS é mais seguro com RAM não ECC se você desativar as somas de verificação?

  • Freebsd setfacl

  • Por que o ZFS não relata o disco como degradado?

  • ps -vxa não classifica em relação à memória

  • FreeBSD's sh: funções de lista

Sidebar

Stats

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

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

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