Ich sende inkrementelle ZFS-Snapshots über eine Punkt-zu-Punkt-T1-Linie, und wir sind an einem Punkt angelangt, an dem die Snapshots eines Tages kaum noch über die Leitung übertragen werden können, bevor die nächste Sicherung beginnt. Unser send / recv Befehl lautet:
zfs send -i tank/vm@2009-10-10 tank/vm@2009-10-12 | bzip2 -c | \
ssh offsite-backup "bzcat | zfs recv -F tank/vm"
Ich habe viele CPU-Zyklen zu sparen. Gibt es einen besseren Komprimierungsalgorithmus oder eine alternative Methode, mit der ich weniger Daten über die Leitung übertragen kann?
compression
zfs
snapshot
Sysadminicus
quelle
quelle
zfs receive
dies ein Schuldiger sein kann:received 953MB stream in 36 seconds (26.5MB/sec)
Antworten:
Es hört sich so an, als hätten Sie die besten Komprimierungsmechanismen ausprobiert und sind immer noch durch die Leitungsgeschwindigkeit begrenzt. Angenommen, es kommt nicht in Frage, eine schnellere Verbindung herzustellen. Haben Sie darüber nachgedacht, die Sicherungen nur seltener auszuführen, damit mehr Zeit für die Ausführung bleibt?
Gibt es eine Möglichkeit, die zu schreibende Datenmenge zu verringern? Ohne zu wissen, wie Ihr Anwendungsstapel funktioniert, ist es schwer zu sagen, aber es kann hilfreich sein, nur dafür zu sorgen, dass Apps vorhandene Dateien überschreiben, anstatt neue zu erstellen. Und stellen Sie sicher, dass Sie keine Backups von temporären / Cache-Dateien speichern, die Sie nicht benötigen.
quelle
Ich habe gelernt, genau das zu tun, was Sie tun. Ich schlage vor, mbuffer zu verwenden. Beim Testen in meiner Umgebung hat es nur auf der Empfangsseite geholfen, ohne dass es beim Senden zu Verzögerungen kam, während der Empfang aufholte.
Einige Beispiele: http://everycity.co.uk/alasdair/2010/07/using-mbuffer-to-speed-up-slow-zfs-send-zfs-receive/
Homepage mit Optionen und Syntax http://www.maier-komor.de/mbuffer.html
Der Sendebefehl aus meinem Replikationsskript:
Dadurch wird mbuffer auf dem Remote-Host als Empfangspuffer ausgeführt, sodass das Senden so schnell wie möglich erfolgt. Ich verwende eine 20-MBit-Leitung und habe festgestellt, dass es nicht hilfreich ist, auch einen MBuffer auf der Sendeseite zu haben. Außerdem verwendet meine Haupt-ZFS-Box den gesamten RAM als Cache. Wenn ich also auch nur 1 g MBuffer zur Verfügung habe, müsste ich einige Cache-Größen reduzieren.
Außerdem, und das ist nicht wirklich mein Fachgebiet, denke ich, ist es am besten, ssh die Komprimierung zu überlassen. In Ihrem Beispiel verwenden Sie vermutlich bzip und dann ssh, das standardmäßig die Komprimierung verwendet. Daher versucht SSH, einen komprimierten Stream zu komprimieren. Am Ende habe ich arcfour als Chiffre verwendet, da es die geringste CPU-Belastung hat und das war für mich wichtig. Möglicherweise erzielen Sie bessere Ergebnisse mit einer anderen Verschlüsselung, aber ich würde definitiv empfehlen, SSH die Komprimierung durchführen zu lassen (oder die ssh-Komprimierung zu deaktivieren, wenn Sie wirklich etwas verwenden möchten, das sie nicht unterstützt).
Was wirklich interessant ist, ist, dass die Verwendung von mbuffer beim Senden und Empfangen auf localhost die Dinge ebenfalls beschleunigt:
Ich fand, dass 4 g für lokale Hosttransfers der Sweetspot für mich zu sein scheint. Es zeigt nur, dass zfs send / receive Latenz oder andere Pausen im Stream nicht wirklich mag, um am besten zu funktionieren.
Nur meine Erfahrung, hoffe das hilft. Ich brauchte eine Weile, um das alles herauszufinden.
quelle
Dies ist eine Antwort auf Ihre spezielle Frage:
Sie können rzip ausprobieren , aber es funktioniert auf eine andere Weise als compress / bzip / gzip:
rzip erwartet, dass die gesamte Datei gelesen werden kann, sodass sie nicht in einer Pipeline ausgeführt werden kann. Dadurch werden Ihre lokalen Speicheranforderungen erheblich erhöht, und Sie können keine Sicherung ausführen und die Sicherung in einer einzigen Pipe über das Kabel senden. Trotzdem sind die resultierenden Dateien, zumindest nach diesem Test, ziemlich viel kleiner.
Wenn Ihre Ressourcenbeschränkung Ihre Pipe ist, werden Sie ohnehin rund um die Uhr Backups ausführen. Sie müssen also nur ständig Snapshots kopieren und hoffen, dass Sie auf jeden Fall auf dem Laufenden bleiben.
Ihr neuer Befehl wäre:
Sie sollten eine bessere Fehlerkorrektur verwenden und die Verwendung von rsync in Betracht ziehen, um die komprimierten Dateien zu übertragen. Wenn die Übertragung in der Mitte fehlschlägt, können Sie dort weitermachen, wo Sie aufgehört haben.
quelle
Dinge haben sich in den Jahren geändert, seit diese Frage gestellt wurde:
1: ZFS unterstützt jetzt die komprimierte Replikation. Fügen Sie einfach das Flag -c zum Befehl zfs send hinzu, und blockiert, was auf der Festplatte komprimiert wurde, und bleibt komprimiert, wenn sie durch die Pipe zum anderen Ende geleitet werden. Möglicherweise muss noch mehr Komprimierung erzielt werden, da die Standardkomprimierung in ZFS lz4 ist
2: Der in diesem Fall am besten zu verwendende Kompressor ist zstd (ZStandard). Er verfügt nun über einen 'adaptiven' Modus, mit dem die Komprimierungsstufe (zwischen den über 19 unterstützten Stufen und den neuen höheren zstd-schnellen Stufen) basierend auf geändert werden kann Die Geschwindigkeit der Verbindung zwischen zfs send und zfs recv. Es komprimiert so viel wie möglich, während die Warteschlange der Daten, die darauf warten, aus der Pipe herauszukommen, auf ein Minimum reduziert wird. Wenn Ihr Link schnell ist, wird keine Zeit mehr für das Komprimieren der Daten verschwendet, und wenn Ihr Link langsam ist, wird er weiter daran arbeiten, die Daten stärker zu komprimieren und Ihnen am Ende Zeit zu sparen. Es unterstützt auch die Komprimierung mit Threads, sodass ich mehrere Kerne nutzen kann, die gzip und bzip außerhalb spezieller Versionen wie pigzip nicht bieten.
quelle
Ich gehe davon aus, dass Sie die unformatierte Bandbreite Ihrer Website einfach nicht erhöhen können ...
Möglicherweise profitieren Sie davon, wenn Sie auf dem Host keine Komprimierung verwenden.
Wenn Sie so etwas wie einen WAN-Optimierer verwenden, kann er die Übertragung viel besser optimieren, wenn Sie die Datei vor dem Senden nicht komprimieren, dh genau das tun, was Sie tun, aber den bzip2 aus der Pipe entfernen. Nach einigen Sicherungsläufen hat das WAN-Optimierungsprogramm einen sehr großen Teil der Daten, die in der Übertragung angezeigt werden, zwischengespeichert, und Sie werden enorme Verbesserungen bei der Übertragungsgeschwindigkeit feststellen.
Wenn Sie sich in einem begrenzten Bereich befinden, können Sie möglicherweise eine ähnliche Verbesserung feststellen, indem Sie rsync verwenden und den nicht komprimierten Snapshot synchronisieren.
Dies wäre schneller, da rsync nur die Unterschiede zwischen dem Snapshot von gestern und dem von heute überträgt. Abhängig davon, wie der Snapshot-Vorgang funktioniert, besteht möglicherweise immer noch eine große Redundanz zwischen beiden, auch wenn es sich nicht wirklich um dieselbe Datei handelt.
Die WAN - Optimierer bei weitem einer eher Art und Weise ist es, dieses Problem zu beheben (gut, Metro - Ethernet ist die am meisten wahrscheinlich Weg , um dieses Problem zu lösen, aber wir werden die vom Tisch verlassen). Der Rsync ist nur eine wilde Szene im Dunkeln, die es wert ist, getestet zu werden (lokal; Rsync gibt an, wie viel Zeit es über eine direkte Kopie auf Ihren lokalen Daten gespart hat), bevor der große Scheck für Glasfaser- oder Flussbettinstallationen geschrieben wird.
quelle
Für was es wert ist. Ich würde nicht direkt senden komprimieren | dekomprimieren | Empfangen Dies kann zu Problemen beim Empfang führen, wenn die Übertragungsleitung abbricht und Ihre Pools während des Empfangs für längere Zeit offline sind. Wir senden an eine lokale Datei, gzipen den Schnappschuss und übertragen ihn mit rsync (mit Flussbett), dann erhalten wir von der Datei. Das Flussbett optimiert den Verkehr nicht, ABER wenn es ein Problem mit der Übertragung gibt und es neu gestartet werden muss, beschleunigt das Flussbett das erneute Senden.
Wir haben uns vorgenommen, den inkrementellen Snapshot nicht mit Rsync-Komprimierung zu komprimieren und keine andere Komprimierung als das Flussbett zu verwenden. Es ist schwer zu sagen, welches das Beste ist, aber wenn wir Archivelogs mit rsync-Komprimierung von Oracle übertragen, ist die Übertragungsrate ungefähr doppelt so hoch wie bei normalen Dateien und im Flussbett (mit RSync).
Wenn Sie ein Flussbett haben, verwenden Sie rsync nicht ssh, da das Flussbett rsync versteht und versucht, es zu optimieren und die Daten zum Cache hinzuzufügen (siehe oben, Übertragung neu starten).
quelle
Ich habe die Erfahrung gemacht, dass dies
zfs send
ziemlich stoßartig ist, obwohl es (im Durchschnitt) viel schneller ist als der folgende Komprimierungsschritt. Mein Backup fügt nachzfs send
und nach erhebliche Puffer eingzip
:In meinem Fall ist das Ausgabegerät über USB (kein Netzwerk) verbunden, aber die Pufferung ist aus einem ähnlichen Grund wichtig: Die gesamte Sicherungszeit ist kürzer, wenn das USB-Laufwerk zu 100% ausgelastet ist. Sie können nicht insgesamt weniger Bytes senden (wie Sie anfordern), aber Sie können immer noch früher beenden. Durch das Puffern wird verhindert, dass der CPU-gebundene Komprimierungsschritt E / A-gebunden wird.
quelle
Ich benutze pbzip2 die ganze Zeit (parallel bzip2) beim Senden über WAN. Da es sich um einen Thread handelt, können Sie die Anzahl der Threads angeben, die mit der Option -p verwendet werden sollen. Installieren Sie zuerst pbzip2 auf dem sendenden und dem empfangenden Host. Die Installationsanweisungen finden Sie unter http://compression.ca/pbzip2/ .
Der Hauptschlüssel besteht darin, Schnappschüsse in regelmäßigen Abständen (~ 10 Minuten) zu erstellen, um die Größe Ihres Schnappschusses zu verringern, und dann jeden Schnappschuss zu senden. ssh wird nicht von einem kaputten Snapshot-Stream fortgesetzt. Wenn Sie also einen großen Snapshot senden möchten, leiten Sie den Stream an pbzip2 und teilen Sie ihn dann in Blöcke mit überschaubarer Größe auf.
Dadurch werden Dateien erzeugt, die in 500-MB-Blöcken benannt sind:
Rsync zum Empfangen des Hosts mehrmals (Sie können Rsync ausführen, noch bevor der ZFS-Sendevorgang abgeschlossen ist oder sobald Sie einen vollständigen 500-MB-Block sehen), drücken Sie jederzeit Strg + C, um abzubrechen:
zfs erhalten:
User freind erwähnt: Für was es sich lohnt. Ich würde nicht direkt senden komprimieren | dekomprimieren | Empfangen Dies kann zu Problemen beim Empfang führen, wenn die Übertragungsleitung abbricht und Ihre Pools während des Empfangs für längere Zeit offline sind. - Ich habe zuvor Probleme mit älteren zfs-Versionen <28 auf dem empfangenden Host festgestellt, wenn ein laufendes Senden / Empfangen durch Netzwerkausfälle unterbrochen wird, jedoch nicht in dem Maße, in dem die Pools nicht ausgelagert sind. Das ist interessant. Senden Sie den Snapshot nur dann erneut, wenn "zfs recv" auf der empfangenden Seite beendet wurde. Töte das "zfs recv" bei Bedarf manuell. zfs send / recv wurde in FreeBSD oder Linux stark verbessert.
quelle
Sie können eine schnellere Verschlüsselung für ssh finden, vielleicht blowfish-cbc. Probieren Sie auch die Schalter -123456789
quelle
Sie müssen mit Ihren Daten testen. Senden Sie es einfach in eine Datei und komprimieren Sie es mit jeder Methode.
Für uns hat gzip einen großen Unterschied gemacht und wir haben alles durchgespielt, aber es gab nicht einmal einen Unterschied von 1% zwischen gzip und bzip oder 7z.
Wenn Sie sich auf einem langsamen T1 befinden, müssen Sie ihn in einer Datei speichern und erneut synchronisieren.
Für diejenigen (nicht Sie), die ein bisschen mehr von der CPU als von der Bandbreite begrenzt sind, wie lstvan sagte, beschleunigt eine andere Chiffre wie arcfour128 die Dinge. Wir verwenden das intern, wenn wir Dinge bewegen.
quelle
Experimentieren Sie mit dem Aktivieren von dedup für zfs send mit -D. Einsparungen hängen natürlich davon ab, wie viele Duplikate in Ihren Daten vorhanden sind.
quelle
-i
"inkrementelles" Backup verwendet, gibt es nicht so viel Hoffnung,-D
die etwas geben würde.Der "beste" Komprimierungsalgorithmus hängt davon ab, über welche Art von Daten Sie verfügen. Wenn Sie eine MP3-Sammlung komprimieren, verlangsamt sich der Prozess wahrscheinlich, während Text- / Protokolldateien erheblich komprimiert werden können
gzip -9
.Wie viele Daten pushen Sie jeden Tag?
quelle
Haben Sie darüber nachgedacht, Ihren TCP / IP-Stack so zu optimieren, dass der TCP-Puffer und die Fenstergröße etwas größer sind? Sie können dazu das
ndd
Tool unter Solaris oder dassysctl
Tool unter Linux / BSD / Mac OSX verwenden. Unter Solaris sind Sie für die/dev/tcp tcp_max_buf
und/dev/tcp tcp_cwnd_max
Werte, und auf Linux Sysctl, sind Sie suchennet.ipv4.tcp_mem
,net.ipv4.tcp_rmem
undnet.ipv4.tcp.wmem
Werte.Diese Links könnten auch eine zusätzliche Hilfe sein:
Solaris TCP-Leistungsoptimierung
Unten auf dieser Seite finden Sie eine Reihe von Links, die erklären, wie Sie dasselbe auch für Linux / BSD / OSX tun.
quelle