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 offline
funciona 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 export
requer a opção -f se estiver em uso e carrega um aviso que -f
também pode perder dados. Pode-se verificar todos os abertos file descriptors
usando 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 umount
pode 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 export
parece que seria em seguida, seja capaz de realmente concluir e desativar qualquer atividade interna de maneira segura, sem a -f
opçã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 umount
não parece fazê-lo completamente, porque também pode haver zvol
alvos 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 umount
um 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 -f
pode 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.)
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
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):
Você notará que, mesmo que
disabled
seja 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
always
e 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
:Isso significa aproximadamente três coisas:
-f
forç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á)zvol
sResumo:
export -f
pronto ou um desligamento completosync=always
SSDs rápidosEm resposta às perguntas de acompanhamento dos comentários (perguntas omitidas para as quais não tenho respostas úteis):
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á.
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.).
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.
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,
fsck
ou 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).