Bei Verwendung von zwei Debian-Servern muss eine starke Failover-Umgebung für Cron-Jobs eingerichtet werden, die jeweils nur auf einem Server aufgerufen werden kann.
Das Verschieben einer Datei in /etc/cron.d sollte ausreichen, aber gibt es eine einfache HA-Lösung, um eine solche Aktion auszuführen? Und wenn möglich nicht mit Herzschlag;)
Antworten:
Ich denke, Herzschlag / Herzschrittmacher wäre die beste Lösung, da sie viele Rennbedingungen, Fechten usw. für Sie erledigen können, um sicherzustellen, dass der Job jeweils nur auf einem Host ausgeführt wird. Es ist möglich, etwas selbst zu entwerfen, aber es wird wahrscheinlich nicht alle Szenarien berücksichtigen, die diese Pakete ausführen, und Sie werden schließlich den größten Teil, wenn nicht den gesamten Teil des Rads ersetzen.
Wenn Sie sich nicht wirklich für solche Dinge interessieren und eine einfachere Einrichtung wünschen. Ich schlage vor, die Cron-Jobs auf den Servern um einige Minuten zu verschieben. Wenn der Job dann auf dem primären Job gestartet wird, kann er irgendwie eine Markierung auf der gemeinsam genutzten Ressource hinterlassen, auf der die Jobs ausgeführt werden (Sie geben dies nicht an, daher bin ich absichtlich vage). Wenn es sich um eine Datenbank handelt, können sie ein Feld in einer Tabelle aktualisieren oder wenn es sich in einem gemeinsam genutzten Dateisystem befindet, eine Datei sperren.
Wenn der Job auf dem zweiten Server ausgeführt wird, kann er das Vorhandensein des Markers überprüfen und abbrechen, wenn er vorhanden ist.
quelle
Abhängig von den Anforderungen verwenden wir zwei Ansätze. In beiden Fällen müssen die Cron von allen Maschinen aus vorhanden sein und ausgeführt werden, wobei jedoch ein wenig Überprüfung der Gesundheit erforderlich ist:
Wenn sich die Computer in einer primären und sekundären Beziehung befinden (es kann mehr als eine sekundäre Beziehung geben), werden die Skripts geändert, um zu überprüfen, ob der Computer, auf dem sie ausgeführt werden, ein primärer Status ist. Wenn nicht, dann verlassen sie einfach leise. Ich habe momentan kein HB-Setup zur Hand, aber ich glaube, Sie können HB nach diesen Informationen abfragen.
Wenn alle Computer berechtigte Primärdaten sind (z. B. in einem Cluster), wird eine gewisse Sperrung verwendet. Über eine gemeinsam genutzte Datenbank oder eine PID-Datei. Nur eine Maschine erhält jemals den Sperrstatus und diejenigen, die nicht leise austreten.
quelle
Um es kurz zu machen, müssen Sie Ihre Cron-Skripte in eine Art clusterfähige Anwendungen verwandeln. Da die Implementierung so leicht oder so schwer ist, wie Sie es benötigen, benötigen sie noch eines: Sie können die Aktion nach dem Failover des primären Knotens ordnungsgemäß fortsetzen / neu starten (oder ihren Status wiederherstellen). Der triviale Fall ist, dass es sich um zustandslose Programme (oder "zustandslose" Programme) handelt, die jederzeit einfach neu gestartet werden können und problemlos funktionieren. Dies ist wahrscheinlich nicht Ihr Fall. Beachten Sie, dass Sie für zustandslose Programme kein Failover benötigen, da Sie sie einfach auf allen Knoten parallel ausführen können.
In einem normalerweise komplizierten Fall sollten sich Ihre Skripte im gemeinsam genutzten Speicher des Clusters befinden, ihren Status in Dateien dort speichern, den auf der Festplatte gespeicherten Status nur atomar ändern und in der Lage sein, ihre Aktion von jedem vorübergehenden Status aus fortzusetzen, den sie beim Start erkennen.
quelle
Tatsächlich gibt es in diesem Bereich keine zufriedenstellende Lösung. Wir haben sie alle ausprobiert. Skriptlösungen, Cron mit Herzschlag / Schrittmacher und mehr. Die einzige Lösung war bis vor kurzem eine Netzlösung. Natürlich ist dies nicht das, was wir sehen wollen, da eine Grid-Lösung für das Szenario etwas mehr als übertrieben ist.
Deshalb habe ich das CronBalancer-Projekt gestartet. funktioniert genau wie ein normaler Cron-Server, nur dass er verteilt, ausgeglichen und HA ist (wenn er fertig ist). Derzeit sind die ersten 2 Punkte fertig (Beta) und funktionieren mit einer Standard-Crontab-Datei.
Das HA-Framework ist vorhanden. Alles, was übrig bleibt, ist die Signalisierung, die erforderlich ist, um die Failover- und Wiederherstellungsaktionen zu bestimmen.
http://sourceforge.net/projects/cronbalancer/
Futter
quelle
Ich hatte Nagios Event Handler als einfache Lösung verwendet.
Auf dem NRPE-Server:
Vergessen Sie nicht, den
nagios
Benutzer zur Sudoers-Gruppe hinzuzufügen:und deaktivieren
requiretty
:Auf dem Nagios-Server:
services.cfg
befehle.cfg
autostart_crond.sh
Ich habe jedoch auf Pacemaker und Corosync umgestellt, da dies die beste Lösung ist, um sicherzustellen, dass die Ressource jeweils nur auf einem Knoten ausgeführt wird.
Hier sind die Schritte, die ich getan habe:
Stellen Sie sicher, dass das crond init-Skript LSB-kompatibel ist . Auf meinem CentOS muss ich den Exit-Status von 1 auf 0 ändern (wenn ein Lauf gestartet oder ein Stopp gestoppt wird), um den Anforderungen zu entsprechen:
dann kann es dem Schrittmacher hinzugefügt werden, indem Folgendes verwendet wird:
crm configure show
crm status
Testen des Failovers durch Stoppen von Pacemaker und Corosync unter 3.145:
Überprüfen Sie dann den Clusterstatus auf 2.93:
quelle
Es ist trivial, es auf einem bestimmten Computer ausführen / nicht ausführen zu lassen. Lassen Sie entweder ein Skript einen Cron-Job in /etc/cron.d ablegen, wie Sie vorschlagen, oder lassen Sie das Skript dauerhaft in /etc/cron.d, aber lassen Sie das Skript selbst die Failover-Prüfung durchführen und entscheiden, ob es ausgeführt werden soll.
Der gemeinsame (fehlende) Teil in beiden ist, wie das Skript prüft, ob das Skript auf dem anderen Computer ausgeführt wird.
Ohne weitere Informationen darüber, was Sie tun möchten, ist dies schwer zu beantworten.
quelle
Ich bevorzuge Rcron für dieses spezielle Problem. Sie haben eine Statusdatei, die einfach "aktiv" oder "passiv" sagt, und wenn sie aktiv ist, wird Ihr Cron auf einem bestimmten Computer ausgeführt. Wenn die Statusdatei auf passiv gesetzt ist, wird sie nicht ausgeführt. So einfach ist das.
Jetzt können Sie RedHat Cluster Suite oder eine andere Cluster-Middleware verwenden, um Statusdateien in Ihrem Cluster zu verwalten, oder Sie können manuell auf einem bestimmten Knoten aktiv setzen, und das war's.
quelle