ZFS è un file system incredibile e risolve molte delle mie esigenze di archiviazione dei dati locali e condivisi.
Tuttavia, mi piace l'idea di ZFS in cluster, ove possibile, a volte non è pratico o ho bisogno di una separazione geografica dei nodi di archiviazione.
Uno dei casi d'uso che ho è per l'archiviazione replicata ad alte prestazioni su server di applicazioni Linux. Ad esempio, supporto un prodotto software legacy che beneficia di unità SSD NVMe a bassa latenza per i suoi dati. L'applicazione ha un'opzione di mirroring a livello di applicazione che può replicarsi su un server secondario, ma spesso è inaccurata e ha un RPO di 10 minuti .
Ho risolto questo problema disponendo di un server secondario (che esegue anche ZFS su hardware simile o diverso) che può essere locale, remoto o entrambi. Combinando le tre utility descritte di seguito, ho creato una soluzione di replica che mi offre una replica continua, una conservazione approfondita delle istantanee e opzioni di failover flessibili.
zfs-auto-snapshot - https://github.com/zfsonlinux/zfs-auto-snapshot
È solo uno strumento utile per abilitare le istantanee periodiche a livello di filesystem ZFS. In genere corro con il seguente programma sui volumi di produzione:
# /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
Questo programma può eseguire snap / replica ad hoc di un filesystem ZFS su una destinazione secondaria. Uso solo la parte syncoid del prodotto.
Supponendo server1 e server2 , semplice comando eseguito da server2 per estrarre i dati da server1 :
#!/bin/bash
/usr/local/bin/syncoid root@server1:vol1/data vol2/data
exit $?
Monit - https://mmonit.com/monit/
Monit è un programmatore di lavori estremamente flessibile e responsabile dell'esecuzione. Per impostazione predefinita, funziona su un intervallo di 30 secondi, ma modifico la configurazione per utilizzare un ciclo temporale di base di 15 secondi.
Una configurazione di esempio che esegue lo script di replica sopra ogni 15 secondi (1 ciclo)
check program storagesync with path /usr/local/bin/run_storagesync.sh
every 1 cycles
if status != 0 then alert
Questo è semplice da automatizzare e aggiungere tramite la gestione della configurazione. Concludendo l'esecuzione dell'istantanea / replica in Monit, si ottiene uno stato centralizzato, controllo del lavoro e avvisi (e-mail, SNMP, script personalizzati).
Il risultato è che ho server con più mesi di snapshot mensili e molti punti di rollback e conservazione all'interno di: https://pastebin.com/zuNzgi0G - Plus, una replica atomica a rotazione continua di 15 secondi:
# 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