ZFS ist ein unglaubliches Dateisystem und löst viele meiner lokalen und gemeinsam genutzten Datenspeicheranforderungen.
Obwohl mir die Idee von Clustered ZFS nach Möglichkeit gefällt , ist sie manchmal nicht praktikabel, oder ich benötige eine geografische Trennung der Speicherknoten.
Einer der Anwendungsfälle, die ich habe, ist für replizierten Hochleistungsspeicher auf Linux-Anwendungsservern. Ich unterstütze beispielsweise ein älteres Softwareprodukt, das für seine Daten von NVMe-SSD-Laufwerken mit geringer Latenz profitiert. Die Anwendung verfügt über eine Spiegelungsoption auf Anwendungsebene, die auf einen sekundären Server repliziert werden kann, jedoch häufig ungenau ist und eine RPO von 10 Minuten umfasst .
Ich habe dieses Problem gelöst, indem ich einen sekundären Server (auf dem auch ZFS auf ähnlicher oder unterschiedlicher Hardware ausgeführt wird) habe, der lokal, remote oder beides sein kann. Durch die Kombination der drei unten aufgeführten Dienstprogramme habe ich eine Replikationslösung entwickelt, die mir kontinuierliche Replikation, tiefe Snapshot-Aufbewahrung und flexible Failover-Optionen bietet.
zfs-auto-snapshot - https://github.com/zfsonlinux/zfs-auto-snapshot
Nur ein praktisches Tool, um regelmäßige Snapshots auf ZFS-Dateisystemebene zu aktivieren. Ich arbeite normalerweise mit dem folgenden Zeitplan für Produktionsvolumen:
# /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
Dieses Programm kann Ad-hoc-Snap / Replikation eines ZFS-Dateisystems auf ein sekundäres Ziel ausführen. Ich verwende nur den syncoiden Teil des Produkts.
Angenommen, Server1 und Server2 führen einen einfachen Befehl von Server2 aus , um Daten von Server1 abzurufen :
#!/bin/bash
/usr/local/bin/syncoid root@server1:vol1/data vol2/data
exit $?
Monit - https://mmonit.com/monit/
Monit ist ein extrem flexibler Job Scheduler und Execution Manager. Standardmäßig funktioniert es in einem Intervall von 30 Sekunden, aber ich ändere die Konfiguration, um einen Basiszeitzyklus von 15 Sekunden zu verwenden.
Eine Beispielkonfiguration, die das obige Replikationsskript alle 15 Sekunden (1 Zyklus) ausführt
check program storagesync with path /usr/local/bin/run_storagesync.sh
every 1 cycles
if status != 0 then alert
Dies ist einfach zu automatisieren und über das Konfigurationsmanagement hinzuzufügen. Wenn Sie die Ausführung des Snapshots / der Replikation in Monit einbinden, erhalten Sie einen zentralisierten Status, Auftragssteuerung und Warnmeldungen (E-Mail, SNMP, benutzerdefiniertes Skript).
Das Ergebnis ist, dass ich Server mit monatelangen monatlichen Snapshots und vielen Rollback- und Aufbewahrungspunkten habe: https://pastebin.com/zuNzgi0G - Plus, ein fortlaufendes 15-Sekunden-Atom-Replikat:
# 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