[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Job Scheduler (was: Re: File-Locking in Shellscripten auf NFS)
[Thread Prev] | [Thread Next]
- Subject: Re: Job Scheduler (was: Re: File-Locking in Shellscripten auf NFS)
- From: Raphael Eiselstein <rabe@xxxxxxxxx>
- Date: Sat, 18 Dec 2010 00:16:00 +0100
- To: uugrn@xxxxxxxxxxxxxxx
On Fri, Dec 17, 2010 at 08:49:55PM +0100, Markus Hochholdinger wrote: > Hi, > > Am 17.12.2010 um 18:39 Uhr schrieb Thomas Stiefel <Tom@xxxxxxx>: > > ich bin neu hier und wollte auch mal meinen Senf dazu geben ;-) > > aber immer doch :-) > > > > On Thu, Dec 09, 2010 at 10:23:03AM +0100, Alexander Holler wrote: > > > > Gibt es eine *einfache* Loesung basierend auf NFS? > > > Ich wuerde das eigentliche Problem beseitigen. D.h. die offensichtlich > > > zentrale Aufgabe (sonst waere Mehrfachausfuehrung ja wohl kein > > > Problem), zentral erledigen lassen, oder die Problemstellung so > > > angehen, dass Mehrfachausfuehrung kein Problem ist. > > Ich sehe das genauso. Wenn es schon einen zentralen Server gibt, der fuer > > Ist die Frage ob es "EIN" zentraler NFS-Server ist oder ob einfach nur der > Dienst nfs "hochverfuegbar" ist!? Ich gehe von einem hochverfuegbaren Dienst mit NFS aus, d.h. ein NFS-Serverpaar, das mit zB Heartbeat und drbd hochverfuegbar NFS anbietet, nur um mal eine Technologie zu nennen. > Ist halt die Frage ob der nfs-Server dafuer ausgeruestet ist diese Aufgabe zu > erledigen? Evtl. gab es ja einen Grund dieses Script auf andere Server > auszulagern? Man kann auch NFS aus Kisten heraus anbieten, die kein (extern erreichbares) unixoides Betriebssystem im innern haben. > > Mi rsync und SSH-Keys ist sowas total easy einzurichten und das benutze > > ich eigentlich schon seit Jahren immer wieder in dieser Art. > Ich denke das wuerde Raphael hinbekommen, wenn er das benoetigt ;-) Es gibt im konkreten Setup mehrere hochverfuegbare NFS-Quellen, die allesamt auf mehreren unabhaengigen Servern gemountet sind. Diese Server bieten irgendwelche Dienste an, hier zB im Rahmen eines Datawarehouses den Import und Export von Daten (in Dateiform) durchfuehren. Da Daten (Dateien) kontinuierlich beschafft und verarbeitet werden muessen, sollte unter keinen Umstaenden die Beschaffung (Import) von Daten unterbrochen werden. Um das zu gewaehrleisten betreibe ich mehrere Rechner, die bestimmte Copy-Jobs ausfuehren. Ich nehme dafuer mehrere Server nicht, weil es zuviel Last waere fuer nur einen, sondern weil ich damit eine Ausfallsicherheit bekomme und zusaetzlich im Normalbetrieb keine Bottlenecks habe. Ausserdem laufen auf diesen "Beschaffungsservern" nicht nur Copy-Jobs, die aktiv Daten abholen sondern auch plain rsync-daemons, die Daten annehmen, also per "Push" von extern bekommen (oder zur Abholung anbieten). Da die Quellen sich schlecht syncronisieren lassen und es teilweise zu sehr vielen parallelen Transfers kommt, werden eingehende rsync-Verbindungen ueber einen LoadBalancer (IPVS, direct routing) auf mehrere rsync-daemons verteilt, die alle die gleiche rsyncd.conf haben und zudem jeweils alle NFS-Quellen und -Senken gemountet haben. Datenexporte laufen ebenfalls als Copy-Job (per rsync, cron) oder werden per rsyncd, httpd und sftp fuer bestimmte Mandanten zur Abholung angeboten, auch hier per IPVS-Loadbalancer, auf dem ein ldirectord regelmaessig prueft, dass die dahinter liegenden Dienste auch wirklich erreichbar sind und Zugriffe nur an "lebende Dienste" durchleitet. Es gibt in diesem Spiel also keine Funktion und keinen Dienst, der ausschliesslich auf nur einem Server verfuegbar ist. Da es wie erwaehnt eben diese CopyJobs gibt, die per cron aufgerufen werden, ist es nicht weiter schlimm, wenn der gleiche Job auf 2 Servern gleichzeitig ausgefuehrt wird, das erzeugt schlimmstenfalls einfach sinnlosen Traffic oder I/O auf den Storages hinter den NFS-Servern. Ich suche also nach einer Moeglichkeit in diesem vorne und hinten und in der Mitte redundant ausgelegten System wiederkehrende Jobs verteilt auf mehreren Systemen auszufuehren und dabei sicherstellen, dass identische Jobs sowohl pro System aber auch im gesamten Verbund nie parallel ausgefuehrt werden. PID-Files oder Lock-Files auf der gemeinsamen NFS-Ressource koennten da helfen, aber wenn ein CopyJob einmal abstuerzt, hinterlaesst er dann PID-Files mit nicht mehr gueltigen PIDs oder Lockfiles, die ihren Lock nicht verlieren. Also suche ich nach einer Moeglichkeit zweifelsfrei und mit geringem technischen Aufwand herauszufinden, ob PID/Lockfiles noch "gueltig" sind. Oder, weil cron hier eher das Problem darstellt: Einen verteilten Job-Scheduler, der ohne zentrale Instanz auskommt und trotzdem dafuer sorgt, dass konkrete Jobs nie mehr als einmal parallel ausgefuehrt werden *und* eine Fehlerbehandlung ermoeglicht, wenn ein Job einmal unsauber abgebrochen ist, etwa weil Quelle oder Ziel ploetzlich nicht mehr verfuegbar sind (Timeout). Ich koennte mir vorstellen, dass ich anstelle von cron einen Dienst verwende (nehmen wir einfach mal sshd, aber das ist nur ein Beispiel), der von aussen angesprochen wird. Das Ganze ist verteilt auf sagen wir 3 Systeme. Fuer jeden "Job" gibt es beispielsweise einen eigenen TCP-Port, also zB 4711, 4712, 4713, 4714, ... auf allen 3 Systemen jeweils alle oder eine beliebige Teilmenge der "Ports". Durch einen authentifizierten Connect auf diesen Port wird der damit assoziierte Job ausgefuehrt. Das ganze wird dann ueber einen Loadbalancer angesprochen, der einen eingehenden Request zB fuer 4714/tcp auf ServerB:4714 durchreicht, waehrend er zufaellig einen parallel eingehenden Request auf :4712 auf ServerC:4712 durchreicht. Jetzt braeuchte ich "nur" noch einen zentralen Dienst, der via LoadBalancer fuer die verschiedenen konfigurierten Jobs die jeweiligen Zugriffe startet und somit auf einem der Server{A,B,C} den entsprechenden Job dann triggert. Aber hier ist genau wieder der Knackpunkt: Ich brauche hierfuer eine singulaere Instanz, die selbst wieder hochverfuegbar aufgebaut sein muss. Aber genau das erwarte ich von einem Jobscheduler, dass er konfigurierte Jobs sicher zur Ausfuehrung bringt (und ueberwacht), auch wenn das Blech auf dem der Scheduler installiert ist mal wackelt. Ein Scheduler bringt leider eine gewisse Komplexitaet mit, die ich durch "kooperatives Multitasking" der verteilten Cronjobs gerne durch "intelligente Lockfiles" an zentraler Stelle geloest haette, also Lockfiles, die von selbst verschwinden, wenn der assoziierte Prozess "weg" ist (egal ob regulaer beendet, durch kill -9 abgeschossen oder durch spontanen Stromausfall). Alternatives Konzept: ein verteilter cron-daemon, der sich per multicast ueber mehrere Systeme hinweg synct und "abstimmt", sodass auf jedem System immer bekannt ist, welche Jobs derzeit aktiv laufen und entsprechend nicht neu ausgefuehrt werden sollen/duerfen. Das waere ausfallsicher und kommt ohne zentrale Instanz ("Master") aus. Statt einer Alternative fuer cron koennte hier auch ein wrapper verwendet werden, der per multicast das Aequivalent eines PID/Lockfiles pro Job implementiert, sodass ein cronjob ganz traditionell ueber /etc/crontab oder /etc/cron.d/ so aussehen koennte: ----------------------------- 10 8-18 * * * jobuser runjob --jobname importABC --parallel=2 /opt/jobs/bin/importABC.sh ----------------------------- ... wobei "importABC" der symbolische Name fuer den Job ist, den es im Netz als "laeuft derzeit bei mir" zu markieren gilt bzw. geprueft werden kann, ob unter diesem Namen die maximale Anzahl der parallelen Jobs (einer Klasse) bereits erreicht ist, zum Beispiel wenn man eine 2-aus-3 Ausfallsicherheit haben moechte. Dieser "runjob"-Wrapper wuerde also dafuer sorgen, dass beliebige Jobs nicht kollidieren, obwohl sie potenziell zeitgleich auf verschiedenen Systemen gestartet werden koennten. Die Idee eines einfachen runjob-Wrappers, der sich per multicast mit seinen (allen) Nachbarn synct, noch mit die beste weil einfachste Loesung ("KISS Prinzip"). Das waere dann auch nicht beschraenkt auf cronjobs, sondern koennte auch aus anderen Konstrukten her in einer Form verwendet werden, dass bestimmte Prozesse sich ueber Systemgrenzen hinweg "abstimmen". Einzig: Ich kenne so ein Tool bisher nicht und kann mir sowas auch nicht mal eben selbst programmieren. Ideen anyone? Gruss Raphael -- Raphael Eiselstein <rabe@xxxxxxxxx> http://rabe.uugrn.org/ xmpp:freibyterægmx.de | https://www.xing.com/profile/Raphael_Eiselstein GnuPG: E7B2 1D66 3AF2 EDC7 9828 6D7A 9CDA 3E7B 10CA 9F2D .........|.........|.........|.........|.........|.........|.........|.. -- UUGRN e.V. http://www.uugrn.org/ http://mailman.uugrn.org/mailman/listinfo/uugrn Wiki: https://wiki.uugrn.org/UUGRN:Mailingliste Archiv: http://lists.uugrn.org/