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,raidz2ouraidz3. - 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 -rdestró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
| Recurso | ZFS | Btrfs | LVM Snapshots | ext4+LVM | XFS |
|---|---|---|---|---|---|
| Snapshots instantâneos | Sim | Sim | Sim | Sim (via LVM) | Não nativo |
| Snapshots recursivos | Sim (-r) | Apenas subvolumes | Não | Não | Não |
| Replicação send/receive | Sim (nativo) | Sim (btrfs send) | Não | Não | Não |
| Checksums autocorretivos | Sim | Sim | Não | Não | Não |
| Criptografia nativa | Sim (ZoL 0.8+) | Não | Via dm-crypt | Via dm-crypt | Via dm-crypt |
| RAID integrado | Sim (raidz) | Sim (raid1/5/6) | Não | Não | Não |
| Deduplicação | Sim (alto RAM) | Sim (limitada) | Não | Não | Nã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
raidz2para pools de produção; mirror para dois discos. - Ajuste
recordsizeecompression=lz4por dataset conforme a carga de trabalho. zfs snapshot -rpara snapshots recursivos atômicos; prefira clones para testes seguros.zfs send | zfs receivepor SSH fornece replicação nativa incremental e criptografada.- sanoid + syncoid é o padrão em produção para retenção e replicação automatizadas.