O ZFS é um sistema de arquivos incrível e resolve muitas das minhas necessidades de armazenamento de dados locais e compartilhados.
Embora eu goste da ideia de ZFS em cluster sempre que possível, às vezes não é prático ou preciso de uma separação geográfica dos nós de armazenamento.
Um dos casos de uso que tenho é para armazenamento replicado de alto desempenho em servidores de aplicativos Linux. Por exemplo, eu apoio um produto de software legado que se beneficia das unidades SSD NVMe de baixa latência para seus dados. O aplicativo possui uma opção de espelhamento no nível do aplicativo que pode ser replicada em um servidor secundário, mas geralmente é imprecisa e é um RPO de 10 minutos .
Resolvi esse problema com um servidor secundário (também executando o ZFS em hardware semelhante ou diferente) que pode ser local, remoto ou ambos. Ao combinar os três utilitários detalhados abaixo, criei uma solução de replicação que me oferece replicação contínua, retenção profunda de instantâneos e opções flexíveis de failover.
zfs-auto-snapshot - https://github.com/zfsonlinux/zfs-auto-snapshot
Apenas uma ferramenta útil para habilitar instantâneos periódicos no nível do sistema de arquivos ZFS. Normalmente, eu executo o seguinte cronograma nos volumes de produção:
# /etc/cron.d/zfs-auto-snapshot
PATH="/usr/bin:/bin:/usr/sbin:/sbin"
*/5 * * * * root /sbin/zfs-auto-snapshot -q -g --label=frequent --keep=24 //
00 * * * * root /sbin/zfs-auto-snapshot -q -g --label=hourly --keep=24 //
59 23 * * * root /sbin/zfs-auto-snapshot -q -g --label=daily --keep=14 //
59 23 * * 0 root /sbin/zfs-auto-snapshot -q -g --label=weekly --keep=4 //
00 00 1 * * root /sbin/zfs-auto-snapshot -q -g --label=monthly --keep=4 //
Syncoid (Sanoid) - https://github.com/jimsalterjrs/sanoid
Este programa pode executar snap / replicação ad-hoc de um sistema de arquivos ZFS para um destino secundário. Eu uso apenas a parte syncoid do produto.
Supondo server1 e server2 , um comando simples é executado no server2 para extrair dados do server1 :
#!/bin/bash
/usr/local/bin/syncoid root@server1:vol1/data vol2/data
exit $?
Monit - https://mmonit.com/monit/
O Monit é um agendador de tarefas e um gerenciador de execução extremamente flexíveis. Por padrão, ele funciona em um intervalo de 30 segundos, mas modifico a configuração para usar um ciclo de tempo base de 15 segundos.
Um exemplo de configuração que executa o script de replicação acima a cada 15 segundos (1 ciclo)
check program storagesync with path /usr/local/bin/run_storagesync.sh
every 1 cycles
if status != 0 then alert
Isso é simples de automatizar e adicionar via gerenciamento de configuração. Ao envolver a execução do instantâneo / replicação no Monit, você obtém status centralizado, controle de tarefas e alertas (email, SNMP, script personalizado).
O resultado é que tenho servidores com vários meses de instantâneos mensais e muitos pontos de reversão e retenção em: https://pastebin.com/zuNzgi0G - Além disso, uma réplica atômica contínua de 15 segundos:
# monit status
Program 'storagesync'
status Status ok
monitoring status Monitored
last started Wed, 05 Apr 2017 05:37:59
last exit value 0
data collected Wed, 05 Apr 2017 05:37:59
.
.
.
Program 'storagesync'
status Status ok
monitoring status Monitored
last started Wed, 05 Apr 2017 05:38:59
last exit value 0
data collected Wed, 05 Apr 2017 05:38:59