Skripts für Produktionsübertragungen erstellen

Überblick

Wenn Sie gsutil für große Produktionsaufgaben verwenden (z. B. um jede Nacht viele GiB an Daten hoch- oder herunterzuladen), können Sie eine Reihe von Maßnahmen ergreifen, um den Erfolg dieser Aufgaben zu gewährleisten. In diesem Abschnitt wird insbesondere erläutert, wie Skripts für große Produktionsaufgaben im Rahmen des gsutil-Mechanismus für fortsetzbare Übertragungen erstellt werden.

Hintergrundinformationen zu fortsetzbaren Übertragungen

Zuerst ist es hilfreich, den gsutil-Mechanismus für fortsetzbare Übertragungen zu verstehen und nachzuvollziehen, wie Ihr Skript im Rahmen dieses Mechanismus implementiert werden muss, um zuverlässig zu funktionieren. gsutil setzt fortsetzbare Übertragungen ein, wenn Sie versuchen, eine Datei beliebiger Größe herunterzuladen oder eine Datei hochzuladen, die größer als ein konfigurierbarer Schwellenwert (standardmäßig 8 MiB) ist. Wenn eine Übertragung nach der Hälfte der Zeit fehlschlägt (z. B. aufgrund eines zeitweiligen Netzwerkproblems), verwendet gsutil die Strategie eines abgeschnittenen, randomisierten, binären exponentiellen Backoff, bei der Übertragungen standardmäßig innerhalb von 10 Minuten bis zu 23 Mal wiederholt werden (siehe Strategie im Umgang mit Wiederholungen). Wenn bei der Übertragung jeder dieser Versuche ohne zwischenzeitlichen Fortschritt fehlschlägt, unterbricht gsutil die Übertragung, speichert aber eine "Tracker"-Datei an einem konfigurierbaren Speicherort. Der Standardspeicherort ist "~/.gsutil/" in einer Datei, die anhand einer Kombination aus dem SHA1-Hash des Namens des Buckets und Objekts, die übertragen werden, sowie der letzten 16 Zeichen des Dateinamens benannt wird. Wenn Übertragungen auf diese Weise fehlschlagen, können Sie gsutil zu einem späteren Zeitpunkt noch einmal ausführen, z. B. nachdem das Netzwerkproblem behoben wurde. Die fortsetzbare Übertragung wird dort fortgesetzt, wo sie unterbrochen wurde.

Skripts für Aufgaben zur Datenübertragung erstellen

Wenn Sie Skripts für umfangreiche Aufgaben zur Übertragung von Produktionsdaten um diesen Mechanismus herum erstellen möchten, können Sie ein Skript implementieren, das regelmäßig ausgeführt wird, ermittelt, welche Dateiübertragungen noch nicht erfolgreich waren, und gsutil ausführt, um sie zu kopieren. Im Folgenden finden Sie einige Vorschläge zur Implementierung dieser Art von Skripts:

  1. Wenn fortsetzbare Übertragungen innerhalb von bis zu 10 Minuten nacheinander 23 Mal ohne Fortschritt fehlschlagen, funktioniert es wahrscheinlich nicht, wenn sie einfach sofort wiederholt werden. Eine erfolgreichere Strategie wäre, einen Cronjob zu nutzen, der alle 30 Minuten ausgeführt wird, bestimmt, welche Übertragungen ausgeführt werden müssen, und diese dann ausführt. Wenn im Netzwerk zeitweise Probleme auftreten, wird das Skript an der Stelle fortgesetzt, an der es unterbrochen wurde, und ist schließlich erfolgreich, sobald das Netzwerkproblem behoben wurde.

  2. Wenn Ihr Unternehmen auf eine zeitnahe Datenübertragung angewiesen ist, sollten Sie Netzwerkmonitoring in Betracht ziehen. Sie können beispielsweise eine Aufgabe implementieren, die alle paar Minuten versucht, einen kleinen Download zu starten, und eine Warnung auslöst, wenn der Versuch mehrere Male in Folge (oder je nach Ihren Anforderungen häufiger oder weniger häufig) fehlschlägt, damit Ihre IT-Mitarbeiter Probleme umgehend untersuchen können. Wie bei den Monitoringimplementierungen sollten Sie mit den Schwellenwerten für Benachrichtigungen experimentieren, um falsch-positive Warnungen zu vermeiden. Solche Warnungen führen nämlich dazu, dass Ihre Mitarbeiter Benachrichtigungen ignorieren.

  3. Es gibt verschiedene Möglichkeiten zu bestimmen, welche Dateien übertragen werden sollen. Sie sollten nicht versuchen, eine vollständige Liste eines Buckets abzurufen, der viele Objekte enthält (z. B. Zehntausende oder mehr). Eine Strategie besteht darin, die Objektnamen so zu strukturieren, dass sie den Übertragungsprozess darstellen, und mithilfe von gsutil-Präfix-Platzhaltern teilweise Bucket-Auflistungen anzufordern. Wenn Ihr regelmäßiger Prozess beispielsweise das Herunterladen der Objekte des aktuellen Tages umfasst, können Sie Objekte anhand des Formats "Jahr-Monat-Tag-Objekt-ID" benennen und die heutigen Objekte mit einem Befehl wie gsutil ls "gs://bucket/2011-09-27-*" suchen. Beachten Sie, dass ein solches Nichtplatzhalter-Präfix effizienter ist als beispielsweise die Verwendung von gsutil ls "gs://bucket/*-2011-09-27". Der letztere Befehl fordert eine vollständige Bucket-Auflistung an und filtert dann in gsutil. Der erste Befehl hingegen fordert Google Storage auf, die Teilmenge von Objekten zurückzugeben, deren Name mit allen Zeichen bis zu "*" beginnt.

    Eine weitere Methode für das Hochladen von Daten besteht darin, lokale Dateien aus einem Bereich "Zu bearbeiten" in einen Bereich "Fertig" zu verschieben, wenn das Skript Dateien erfolgreich in die Cloud kopiert hat. Sie können dies in parallelen Batches mit einem Befehl wie diesem tun:

    gsutil -m cp -r to_upload/subdir_$i gs://bucket/subdir_$i
    

    wobei "i" eine Shell-Schleifenvariable ist. Achten Sie darauf, dass die Shell-Statusvariable "$" nach jedem gsutil cp-Befehl 0 ist, um festzustellen, ob einige der Kopien fehlgeschlagen sind, und um die betroffenen Kopien noch einmal auszuführen.

    Mit dieser Strategie erfasst das Dateisystem alle verbleibenden Aufgaben.

  4. Wenn sich in einem einzelnen Bucket sehr viele Objekte befinden (z. B. Hunderttausende oder mehr), sollten Sie erwägen, Ihre Objekte in einer Datenbank zu verfolgen, anstatt Bucket-Auflistungen zur Aufzählung der Objekte zu verwenden. Eine solche Datenbank könnte beispielsweise den Status Ihrer Downloads verfolgen, sodass Sie bestimmen können, welche Objekte über Ihr Skript für regelmäßige Downloads heruntergeladen werden müssen. Dazu fragen Sie die Datenbank lokal ab, anstatt eine Bucket-Auflistung durchzuführen.

  5. Achten Sie darauf, nach einer fehlgeschlagenen Übertragung keine teilweise heruntergeladenen temporären Dateien zu löschen: gsutil setzt den Vorgang an der Stelle fort, an der er unterbrochen wurde, und führt einen Hash des zuletzt heruntergeladenen Inhalts aus, um die Datenintegrität zu gewährleisten. Löschen Sie also teilweise übertragene Dateien nicht, da dies zum Verlust Ihres Fortschritts führt und Ihre Netzwerkkapazitäten verschwendet.

  6. Wenn Sie eine schnelle Netzwerkverbindung haben, können Sie die Übertragung einer großen Anzahl von Dateien mit der gsutil-Option "-m" (Multi-Threading/Multi-Processing) beschleunigen. Beachten Sie jedoch, dass gsutil nicht nachverfolgt, welche Dateien erfolgreich heruntergeladen wurden, falls einige Dateien nicht heruntergeladen werden konnten. Wenn Sie beispielsweise Übertragungen mit mehreren Threads zum Herunterladen von 100 Dateien verwenden und drei davon nicht heruntergeladen werden können, muss Ihr Skriptprozess feststellen können, welche Übertragungen nicht erfolgreich waren, und es dann noch einmal versuchen. Der oben beschriebene Ansatz zum regelmäßigen Prüfen und Ausführen wäre für diesen Fall geeignet.

    Wenn Sie parallele Übertragungen (gsutil -m) verwenden, sollten Sie möglicherweise mit der Anzahl der verwendeten Threads (über die Einstellung "parallel_thread_count" in der .boto-Konfigurationsdatei) experimentieren. gsutil verwendet standardmäßig 10 Threads für Linux und 24 Threads für andere Betriebssysteme. Je nach Netzwerkgeschwindigkeit, verfügbarem Arbeitsspeicher, CPU-Auslastung und anderen Bedingungen ist dieser Vorgang möglicherweise nicht optimal. Experimentieren Sie mit einer höheren oder niedrigeren Anzahl an Threads, um die beste Anzahl an Threads für Ihre Umgebung zu ermitteln.