Hot-Clone eines lebenden Linux-Dienstes


14

Wir müssen einen Linux-Dienst im laufenden Betrieb klonen, nicht nur, weil wir ihn nicht neu starten können oder so. Es liegt nur an unserem speziellen Szenario (ja, ich habe diese Antwort bereits gelesen, aber es unterscheidet sich ein wenig von meinem Clone, einem funktionierenden Linux-Server ).

Wir haben einen Berechnungsknoten, Sie können sagen, einen NLP-Berechnungsknoten, auf dem einige Modelle ausgeführt werden. Wenn wir den Knoten starten (natürlich mit einem Service), wird die Berechnung schrecklich langsam sein, bis wir ihn mehrmals füttern. Wir haben es Aufwärmen genannt.

Leider dauert es lange, bis der Aufwärmvorgang abgeschlossen ist (möglicherweise ist die Berechnung abgeschlossen, bevor sich der Knoten aufgewärmt hat).

Das Problem ist also, ob es eine stabile Möglichkeit gibt, einen Linux-Server im laufenden Betrieb zu klonen, um die bestmögliche Leistung des Knotens zu erzielen, damit wir ihn in kürzerer Zeit klonen und online stellen können.


Wäre es sinnvoll, die Maschine zu visualisieren und eine Momentaufnahme des "aufgewärmten" Zustands zu machen?
TripeHound

13
Verstehst du, warum dieses Aufwärmen passiert? Dies kann beispielsweise ein Nebeneffekt des Dateicaches sein. Bei einigen Antworten auf das Klonen von Maschinen wird der Dateicache verworfen, da ein Cache per Definition aus dem zugrunde liegenden Original rekonstruiert werden kann.
MSalters

fork () ist eine Möglichkeit, mehr Prozesse auf einem bestimmten Computer zu erstellen und gleichzeitig den Startaufwand zu verringern.
Noch ein Benutzer

Vielen Dank, Leute, @TripeHound, ich habe einen Freund von mir gefragt, der in VMWare arbeitet, und er sagte, es sei unmöglich, einfach einen Schnappschuss des "aufgewärmten" Zustands zu machen, und auch nichts von Spiegeln. MSalters, ich bin nicht zu 100% sicher, was während des Aufwärmens passiert, aber es sieht so aus, als ob nach dem Ende des Dienstes ein fauler Ladevorgang ausgeführt wird, nachdem der Rechenvorgang ausgeführt wurde
Chen Steven,

2
Sie wissen nichts von Ihrem Hintergrund-Setup, aber das riecht nach einer Situation, in der Ihr Server niemals ausfallen darf. Dies deutet darauf hin, dass der Kernel Ihres Hosts veraltet sein könnte und dass keine Updates angewendet wurden. Vielleicht ist dies ein Hinweis auf einen systembedingten Konstruktionsfehler, der berücksichtigt werden muss.
Criggie

Antworten:


28

Möglicherweise können Sie nicht einen ganzen Server im laufenden Betrieb "klonen" (Sie können es, aber nur, wenn es sich um eine virtuelle Maschine handelt), aber Sie können einen einzelnen Prozess mit criu , Checkpoint / Restore in Userspace einfrieren und wiederherstellen .

Auf diese Weise können Sie den internen Status des Programms auf der Festplatte speichern und das Programm stoppen und später das Programm aus den gespeicherten Dateien in diesem Status wiederherstellen.

Um den gewünschten Vorgang zu unterstützen, können Sie die Dateien, die das gespeicherte Programm darstellen, auf einen anderen Server kopieren und dort wiederherstellen.

criu benötigt einen aktuellen Kernel mit verschiedenen Funktionen, so dass ältere Linux-Distributionen möglicherweise nicht funktionieren. Sie können criu checkauf einem bestimmten Computer ausführen , um festzustellen, ob die Voraussetzungen für criu vorliegen.


es sieht fantastisch und ich werde einige Tests auf diese dank bro tun
chen steven

Wie gut funktioniert dies aus Ihrer Erfahrung in der Praxis? Wenn ich mir die Criu-Listen mit den Einschränkungen anschaue (die so ziemlich die gleichen sind, die ich erwartet hätte - das ist ein schwieriges Problem), habe ich das Gefühl, dass dies mit Anwendungen, die nicht für diesen Anwendungsfall entwickelt wurden, wahrscheinlich nicht funktioniert.
James_pic

@James_pic Es ist vielleicht ein Jahr her, seit ich es mir ernsthaft angesehen habe, da ich momentan keine Verwendung dafür habe. Für einen Daemon, der nur Verbindungen akzeptiert und einige Berechnungen vornimmt (z. B. den maschinellen Lernjob des OP oder einen Webserver), funktioniert dies ziemlich gut.
Michael Hampton

12

Möglicherweise liegt es außerhalb Ihres aktuellen Umfelds, aber die branchenübliche Vorgehensweise besteht darin, Ihren Server zu virtualisieren. Viele Virtualisierungshosts (VMware, VirtualBox usw.) ermöglichen "Snapshots", die den Status eines Servers speichern und dann in neue Instanzen geklont werden können. Diese neuen Instanzen haben genau den gleichen Status wie die ursprünglichen, bis auf laufende Prozesse. Natürlich möchten Sie sicherstellen, dass die Software, die Sie ausführen, in einer virtuellen Umgebung immer noch ordnungsgemäß funktioniert (die Berechnung von CUDA / GPU ist denkbar).


Die Virtualisierung ist großartig, bis die Software (oder ihre Abhängigkeiten) ein Update erfordert und keinen angemessenen Mechanismus zum erneuten Laden bietet. Bei einem VM-Snapshot oder einer Live-Migration wird der alte Code ausgeführt.
John Mahowald

Es ist für mich sowohl akzeptabel, das Projekt auf einer "realen" Maschine oder einem Virtualisierungshost auszuführen, als auch auf verschiedene Weise mit dem "alten" Code umzugehen, beispielsweise mit einem A / B-Test oder einem fortlaufenden Update. Aber sind Sie sicher, dass die Snapshots den Aufwärmzustand meines Arbeitsknotens vollständig klonen können?
Chen Steven

3
Wenn Sie eine Maschine live migrieren, muss sie angehalten werden. Während es angehalten ist, wird sein Speicher 1: 1 auf einen anderen Computer in einem Cluster kopiert, auf dem er nicht angehalten ist - intakt. Dies kann einige Zeit in Anspruch nehmen, je nachdem, wie viel Speicher verwendet wird und wie schnell die Netzwerkstruktur ist. Möglicherweise können Sie diese Methode verwenden, wenn die Ausfallzeit für Ihre Anforderungen niedrig genug ist.
Spooler

@chensteven Ich komme zuletzt aus einer Virtualbox-Umgebung. Das ist einige Zeit her, aber soweit ich mich erinnere, enthält ein laufender Snapshot den genauen Status der VM zum Zeitpunkt der Erstellung des Snapshots, einschließlich der laufenden Prozesse und des Inhalts des Speichers. Dieser Snapshot kann dann auf eine neue VM geklont werden, sodass Sie zwei Maschinen im exakt gleichen Zustand haben.
Kawott

3

Die Frage, die Sie erwähnen, bezieht sich auf einen Link, http://www.linuxfocus.org/English/March2005/article370.shtml , der alle Möglichkeiten beschreibt, die ich mir vorgestellt hatte, um Ihre Anforderungen zu erfüllen.

Dass die Optionen vorhanden sind, bedeutet nicht viel für die Ausführung auf dem Server. Sie müssen berücksichtigen, dass alle Dateien, die sich beim Klonen ändern können, inkonsistente Dateien auf dem Zielcomputer sein können. In diesem Beitrag, den Sie angeben, wird über Datenbanken gesprochen, und das Klonen auf diese Weise bietet keine Garantie für die Datenintegrität.

Es ist nicht ganz klar, was Sie damit gemeint haben, "bis wir es mehrmals füttern" .

Aber wenn ich richtig verstanden habe, was Sie verlangen, müssen Sie berücksichtigen, dass zum Klonen eines Systems Zeit zum Kopieren und Berechnen von Ressourcen erforderlich ist.

Um eine "ON / OF" - oder besser "Active / Backup" -Umgebung durchzuführen, muss der Server im Cluster ordnungsgemäß konfiguriert sein.

Es tut mir leid, wenn dies nicht die Antwort ist, die Sie erwarten, aber Sie haben die folgenden Optionen.


Ich bin schuld daran, dass Sie hier ein wenig verwirrt sind. Das bedeutet, dass wir nach dem Start meines Dienstes die Berechnungsaufgaben mehrmals aufrufen müssen, um sicherzustellen, dass der Knoten für die Höchstleistung "aufgewärmt" ist. Das Problem hier ist also wie der dynamische Klon oder die Erweiterung für unsere lebenden Jobs, als ob die große Anzahl von Anfragen unser System trifft, wir nicht genug Zeit haben, neue Berechnungsknoten einzurichten (das Aufwärmen nimmt zu viel Zeit in Anspruch) Behandle sie, weißt du, genau wie die Wellen, die kommen
Chen Steven

1

Es gibt viele potenzielle Probleme mit dem, was Sie versuchen, und natürlich ist es, wie Sie wissen, am besten, den Server offline zu schalten und zu klonen, während keine Daten dynamisch gespeichert werden.

Was Sie jedoch tun möchten, ist durchaus plausibel, so wie ich es zuvor getan habe. Wenn Sie verwenden dd, können Sie den vollständigen Server auf Blockebene auf ein anderes Laufwerk oder einen anderen Server klonen. Auf dem neuen Server ist jedoch eine zusätzliche Einrichtung erforderlich, und Sie können den anderen Server wahrscheinlich nicht einfach aus- und den neuen Server einschalten. Um dies zu verstehen, müssen wir einige Dinge über Ihre Serverhardware und -software wissen.

Erstens wäre es hilfreich zu wissen, was regelmäßig aktualisiert wird, um die beste Datenstrategie zu bestimmen. Haben Sie einen SQL Server, der dynamisch aktualisiert wird, aber statischen Inhalt hat? Haben Sie alternativ ein Entwicklerteam, das über ein Subversion-System wie git verfügt und ständig Datenaktualisierungen an Ihre Inhalte sendet? Je nachdem, was aktualisiert wird, wird die beste Vorgehensweise ermittelt.

Wenn beispielsweise nur SQL regelmäßig aktualisiert wird, können Sie auf folgende Weise auf einen neuen Server migrieren, während dieser Server aktiv ist:

  • dd um alle daten auf den neuen server zu klonen.
  • Beginnen Sie mit dem Einrichten des neuen Servers. Dies kann einige Arbeit in Anspruch nehmen, insbesondere wenn es sich um eine andere Hardware handelt, ist jedoch möglicherweise schneller als das Einrichten von Grund auf neu.
  • Möglicherweise sind auch einige DNS-Änderungen erforderlich, da Sie nicht denselben DNS auf einem anderen Server verwenden können, wenn Sie auf dem zweiten Server live arbeiten müssen, während der erste Server noch aktiv ist.
  • Nachdem der neue Server vollständig ist und unabhängig ausgeführt wird, erstellen Sie eine letzte Sicherung des SQL-Servers auf dem ursprünglichen Server und importieren Sie sie auf den neuen Server.

Möglicherweise müssen Sie Ihren ursprünglichen Server vorübergehend offline schalten, um sicherzustellen, dass Sie keine Daten verpassen. Um keine Ausfallzeit zu haben, können Sie alternativ die zweite live schalten, den DNS auf den neuen Server verweisen und dann alle DNS-Einträge auf dem neuen Server manuell aktualisieren, sodass praktisch keine Ausfallzeit entsteht. Dies ist zwar umständlicher als ein paar Minuten Ausfallzeit, um die SQL zu sichern und auf dem neuen Server wiederherzustellen, kann jedoch für eine Ausfallzeit von null erforderlich sein .

Dies ist natürlich nur ein Anwendungsfallbeispiel. Abhängig von Ihrer Konfiguration und mehreren Variablen müssen Sie möglicherweise eine eigene Strategie für die Migration erstellen, die auf Ihrem speziellen Fall basiert.

Das andere Problem betrifft die Serverhardwarekonfiguration. Ist der neue Server in der Hardware 100% identisch mit dem alten Server? Wenn ja, ist die Einrichtung einfacher. Wenn es sich jedoch um eine völlig andere Hardwarekonfiguration handelt, müssen Sie möglicherweise eine andere Strategie implementieren: Richten Sie einfach den zweiten Server im Voraus ein und sichern Sie dann alle Ihre Daten und SQL-Datenbanken auf den ersten Server und migrieren Sie sie manuell über und ändern Sie die Konfiguration nach Bedarf.

Die Servermigration ist keineswegs trivial. Um einen erfolgreichen Umzug durchführen zu können, müssen Sie über fundierte Kenntnisse der Server oder der Mitarbeiter verfügen, die über die gleichen Kenntnisse verfügen. In jedem Fall wird dringend empfohlen, sofort ein vollständiges Backup zu erstellen und es auf einer dritten Quelle zu speichern, auch auf Ihrem lokalen Computer, damit Sie im schlimmsten Fall (wenn beide Server abstürzen und irreparabel ausfallen) immer noch eine andere haben Kopie Ihrer Daten zum Wiederaufbau Ihrer Server mit.

Hoffe das hilft und viel Glück beim Serverumzug!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.