TL;DR — Resumo Rápido

Snapshots ZFS oferecem proteção de dados instantânea e eficiente. Aprenda pools, datasets, rollback, replicação send/receive e automação com sanoid em produção.

Os snapshots ZFS oferecem proteção de dados quase instantânea e eficiente em espaço que nenhuma ferramenta de backup tradicional consegue igualar no nível do sistema de arquivos. Este guia cobre desde os fundamentos do ZFS até as políticas de retenção automatizadas com sanoid.

Pré-requisitos

  • Servidor Linux com Ubuntu 22.04/24.04, Debian 12 ou RHEL 9/Fedora
  • Um ou mais dispositivos de bloco
  • Acesso root ou sudo
  • Familiaridade básica com linha de comando Linux

Fundamentos do ZFS

Copy-on-Write (CoW): O ZFS nunca sobrescreve dados existentes. Quando um bloco muda, o ZFS escreve a nova versão em um novo local e atualiza o ponteiro. O bloco antigo permanece até que a transação confirme. É assim que os snapshots são instantâneos.

Pools, vdevs e datasets:

  • Um pool (zpool) é o contêiner de armazenamento de nível superior.
  • Um vdev define a redundância: disco único, mirror, raidz, raidz2 ou raidz3.
  • Um dataset é um sistema de arquivos montável dentro do pool.

Checksums e autocorreção: Cada bloco armazena um checksum. Na leitura, o ZFS o verifica e, se o pool tiver redundância, repara automaticamente os blocos corrompidos.


Criando Pools ZFS

# Ubuntu / Debian
sudo apt install zfsutils-linux -y

# Mirror (equivalente RAID-1)
sudo zpool create tank mirror /dev/sdb /dev/sdc

# RAIDZ2 (equivalente RAID-6) — recomendado para produção
sudo zpool create tank raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde

# Verificar status
zpool status tank

Gerenciamento de Datasets

# Criar dataset com ponto de montagem personalizado
zfs create -o mountpoint=/srv/web tank/web

# Compressão LZ4 (quase sempre benéfica)
zfs set compression=lz4 tank/data

# Cota — limite rígido no tamanho do dataset
zfs set quota=500G tank/data

# Ajustar recordsize para bancos de dados
zfs set recordsize=16K tank/databases

# Listar propriedades
zfs get compression,quota,recordsize tank/data

Snapshots: Criação e Gerenciamento

# Snapshot de um dataset (convenção: @AAAA-MM-DD)
zfs snapshot tank/data@2026-03-23

# Snapshot recursivo — captura dataset e todos os filhos simultaneamente
zfs snapshot -r tank@2026-03-23T03:00

# Snapshot com rótulo descritivo
zfs snapshot tank/data@antes-atualizacao-nginx
# Listar todos os snapshots
zfs list -t snapshot

# Mostrar espaço usado por cada snapshot
zfs list -t snapshot -o name,used,referenced,written tank/data

Rollback

# Rollback para o snapshot mais recente
zfs rollback tank/data@2026-03-23

# Rollback através de snapshots intermediários (destrói tudo intermediário)
zfs rollback -r tank/data@antes-atualizacao-nginx

Atenção: zfs rollback -r destrói TODOS os snapshots intermediários entre o alvo e o estado atual. Crie um clone do estado atual antes se precisar desses dados.


Clones: Alternativa Segura ao Rollback

# Criar um clone de um snapshot
zfs clone tank/data@2026-03-23 tank/data-clone

# Se o clone deve se tornar o principal, promovê-lo
zfs promote tank/data-clone

Send e Receive: Replicação

# Envio completo inicial para servidor remoto
zfs send tank/data@2026-03-23 | ssh user@backup-server zfs receive backup/data

# Envio incremental (-i: delta entre dois snapshots específicos)
zfs send -i tank/data@2026-03-22 tank/data@2026-03-23 | ssh user@backup-server zfs receive backup/data

# Envio comprimido (-c: transfere blocos já comprimidos)
zfs send -c -i tank/data@snap1 tank/data@snap2 | ssh user@remote zfs receive backup/data

# Envio cifrado raw (para datasets com criptografia nativa)
zfs send -w tank/data@snap1 | ssh user@remote zfs receive backup/data

Criptografia Nativa

# Criar dataset criptografado
zfs create -o encryption=aes-256-gcm -o keylocation=prompt -o keyformat=passphrase tank/secrets

Snapshots Automatizados com sanoid

# Ubuntu / Debian
sudo apt install sanoid -y

Editar /etc/sanoid/sanoid.conf:

[tank/data]
  use_template = producao

[tank/databases]
  use_template = producao
  recursive = yes

[template_producao]
  hourly = 24
  daily = 30
  weekly = 8
  monthly = 12
  autosnap = yes
  autoprune = yes
# Teste em modo seco
sudo sanoid --cron --verbose --dryrun

# Ativar timer do systemd
sudo systemctl enable --now sanoid.timer

Syncoid para Replicação

# Replicar tank/data para servidor remoto
sudo syncoid tank/data user@backup-server:backup/data

# Replicação recursiva
sudo syncoid -r tank user@backup-server:backup

Agendamento de Scrub

# Scrub manual
sudo zpool scrub tank

# Agendar scrub mensal via systemd
sudo systemctl enable --now zfs-scrub-monthly@tank.timer

# Ou via cron
0 2 1 * * zpool scrub tank

ZFS vs Tecnologias Alternativas de Snapshots

RecursoZFSBtrfsLVM Snapshotsext4+LVMXFS
Snapshots instantâneosSimSimSimSim (via LVM)Não nativo
Snapshots recursivosSim (-r)Apenas subvolumesNãoNãoNão
Replicação send/receiveSim (nativo)Sim (btrfs send)NãoNãoNão
Checksums autocorretivosSimSimNãoNãoNão
Criptografia nativaSim (ZoL 0.8+)NãoVia dm-cryptVia dm-cryptVia dm-crypt
RAID integradoSim (raidz)Sim (raid1/5/6)NãoNãoNão
DeduplicaçãoSim (alto RAM)Sim (limitada)NãoNãoNão

Estratégia de Backup em Produção com sanoid + syncoid

Nível 1 — Snapshots locais (sanoid): A cada hora por 24 horas, diários por 30 dias, semanais por 8 semanas.

Nível 2 — Replicação para servidor de backup (syncoid): Sincronização diária para um servidor backup na mesma rede. Recuperação rápida em caso de falha de hardware.

Nível 3 — Replicação fora do site (syncoid via SSH): Envio cifrado semanal para um servidor cloud. Proteção contra desastres no nível do site.


Casos Especiais e Erros Frequentes

Requisito de RAM para deduplicação: O dedup do ZFS precisa de ~5 GB de RAM por TB de dados deduplicados. Sem RAM suficiente causa swapping intenso. Use dedup apenas para repositórios com alta redundância.

Acumulação de snapshots: Snapshots esquecidos retêm blocos que o ZFS não pode liberar. Um pool que parece “cheio” mas tem pouco dado referenciado geralmente tem snapshots com alto used. Use sempre sanoid ou zfs destroy explícito.

Tamanho do ARC: O ZFS usa um cache adaptativo (ARC) que pode consumir quase toda a RAM. Limite em /etc/modprobe.d/zfs.conf: options zfs zfs_arc_max=4294967296 (4 GB).


Resumo

  • O copy-on-write do ZFS torna os snapshots instantâneos e sem custo até que os dados divirjam.
  • Use raidz2 para pools de produção; mirror para dois discos.
  • Ajuste recordsize e compression=lz4 por dataset conforme a carga de trabalho.
  • zfs snapshot -r para snapshots recursivos atômicos; prefira clones para testes seguros.
  • zfs send | zfs receive por SSH fornece replicação nativa incremental e criptografada.
  • sanoid + syncoid é o padrão em produção para retenção e replicação automatizadas.

Artigos Relacionados