| Autor |
Beitrag |
Peter2002
      
Beiträge: 103
Win XP, Win 7
Delphi 2007 / XE3
|
Verfasst: So 12.12.10 22:54
Hallo,
ich habe ein System, das in verschiedene Module (Windows-Dienste) aufgeteilt ist. Dieses System soll hoch verfügbar gemacht werden.
Habt ihr Strategien oder Konzepte, wie ich sowas veranstalten kann? Nur die Software betreffend.
Also, wie z.B. finde ich heraus, ob ein Dienst einen unerwarteten Fehler hat und deshalb seinen Aufgabe nicht mehr erfüllen kann? Oder ob er in eine Endlosschleife geraten ist? Um dann evtl. eine neue Instanz zu starten, die den Job übernimmt.
_________________ Gruß Peter
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: So 12.12.10 23:17
Die Dienste könnten eine Statusliste mit Timestamp als Ringbuffer vorhalten, ein Watchdogdienst checkt regelmäßig den Ringbuffer.
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 12.12.10 23:34
Ich würde einen Watchdog starten, der zweimal läuft. Wenn nur eine Instanz läuft, wird eine zweite gestartet. Eine der beiden kümmert sich dann um die Überwachung des zu überwachenden Programms. Zum Beispiel der Watchdog mit der höheren Process-ID.
Dem zu überwachenden Programm wird dann eine Message geschickt, auf die geantwortet werden muss. Kommt keine Antwort, reagiert das Programm nicht mehr.
So haben das sowohl Antivirenprogramme früher gemacht als auch Viren oft.
|
|
Quake User
      
Beiträge: 159
|
Verfasst: Mo 13.12.10 04:58
Peter2002 hat folgendes geschrieben : | Hallo,
ich habe ein System, das in verschiedene Module (Windows-Dienste) aufgeteilt ist. Dieses System soll hoch verfügbar gemacht werden.
Habt ihr Strategien oder Konzepte, wie ich sowas veranstalten kann? |
Hochverfügbarkeit bedeutet aber noch mehr. Warum lässt Du nicht 10 Instanzen Deiner Dienste laufen und programmierst einen Load Balancer, der die Anfragen entgegen nimmt und auf einen freien Dienst verteilt. Antwortet Das System zu langsam, startet der Load Balancer zusätzliche Dienste. Antwortet einer der Deinste nicht nach einem Timeout, wird er beendet und einer neuer gestartet.
Ein Watch Dog ist eine gute Idee, er müsste aber dann auf einem anderen Rechner laufen. Wenn der Rechner abstürzt, läuft auch der Watch Dog nicht mehr. Der Load Balancer könnte von vorn herein auf einem anderen Rechner laufen. So wäre Dein System noch durch den Einsatz von mehreren Servern skalierbar.
Hochverfügbarkeit bezeichnet die Fähigkeit eines Systems, trotz Ausfall von Komponenten (deffekt, beschäftigt, abgestürzt, Prozess unerwartet beendet...) mit einer hohen Wahrscheinlichkeit einen ununterbrochenen Betrieb zu gewährleisten.
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Mo 13.12.10 09:44
berechtigte Einwände, aber
| Zitat: |
Der Load Balancer könnte von vorn herein auf einem anderen Rechner laufen.
|
in dem Fall sitzt der single Point of failure gegf. dort.
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
Peter2002 
      
Beiträge: 103
Win XP, Win 7
Delphi 2007 / XE3
|
Verfasst: Mo 13.12.10 10:54
Momentan würde es vollkommen reichen, wenn ich sicherstellen kann, dass alle Prozesse laufen und ihren Job tuen. Auf einer einzigen Maschine.
Ist der ganze Rechner weg (Hardwarefehler), soll ein zweiter übernehemen. Das wäre dann ein Watchdog auf der 2. Maschine, die den Watchdog der 1. prüft?
Wie funktioniert ein solcher Watchdog? Wie kann ich erkennen, ob ein Thread sich verarbschiedet hat, obwohl er da sein sollte; ob er in einer Endlosschleife ist; unbehandelte Exceptions ...
Ob der Prozess vorhanden ist, ist ja recht leicht rauszufinden, aber ob er auch das tut, was er tun soll?
_________________ Gruß Peter
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Mo 13.12.10 11:50
Die Idee mit dem Ringpuffer und Timestamps gefällt Dir nicht ?
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 13.12.10 12:04
Peter2002 hat folgendes geschrieben : | | Wie kann ich erkennen, ob ein Thread sich verarbschiedet hat, obwohl er da sein sollte; ob er in einer Endlosschleife ist; unbehandelte Exceptions ... |
Wie gesagt: jaenicke hat folgendes geschrieben : | | Dem zu überwachenden Programm wird dann eine Message geschickt, auf die geantwortet werden muss. Kommt keine Antwort, reagiert das Programm nicht mehr. |
Bei einer Antwort kannst du den Status ja mitschicken. Wenn das Programm antworten kann, weiß es auch in welchem Zustand es ist. Und wenn es nicht mehr antworten kann, ist eh alles klar.
Das gilt natürlich genauso für Threads innerhalb eines Programms.
|
|
Peter2002 
      
Beiträge: 103
Win XP, Win 7
Delphi 2007 / XE3
|
Verfasst: Mo 13.12.10 12:13
bummi hat folgendes geschrieben : | | Die Idee mit dem Ringpuffer und Timestamps gefällt Dir nicht ? |
Sorry. hab ich überlesen. Aber warum ein Ringpuffer?
@jaenicke: D.h. ein Dienst überwacht sich selbst? Also er checkt alle sein Threads und antwortet dem Watchdog?
_________________ Gruß Peter
|
|
Peter2002 
      
Beiträge: 103
Win XP, Win 7
Delphi 2007 / XE3
|
Verfasst: Di 21.12.10 20:09
Wenn ich nun einen Watchdog auf einer anderen Maschnine habe, der die primäre überwacht und feststellt, dass diese nicht mehr verfügbar ist, soll die sekundäre aktiviert werden. Die sollte sinnigerweise ja auf die gleiche IP reagieren, damit die Clients nichts davon mitbekommen.
Wie stelle ich nun sicher, dass ich mir keinen IP-Adressen-Konfilkt einhandle? Wenn der ausgefallenen Rechner wieder gestartet wird hat diese ja noch immer seine IP, weleche der sekundäre inzwischen ja auch hat.
_________________ Gruß Peter
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 21.12.10 20:18
Wenn es auch um die Verfügbarkeit der Rechner selbst geht, kommen wir in Bereiche, in denen Virtualisierung sinnvoll ist. Denn anders kannst du nicht sicherstellen, dass du im Falle eines Absturzes automatisiert oder aus der Ferne eine Fehlerbehebung hinbekommst.
Wenn du virtuelle Server verwendest, kannst du diese von außen steuern und neustarten usw.
Je nach Anwendungsfall bietet es sich hier aber auch an direkt Server zu mieten. Denn in einem Rechenzentrum ist eine sehr hohe Verfügbarkeit gewährleistet und wenn etwas kaputtgeht, ist auch jemand da, der sich darum kümmern kann.
Die Cloud bzw. Cloud Computing ist auch ein Stichwort. Programmiersprachen wie Delphi unterstützen cloudbasierte Dienste direkt. Das heißt man kann sich entsprechende Kapazitäten von z.B. Amazon (Amazon Web Services) mieten und je nach Bedarf auch erweitern, wenn eine höhere Last anfällt bzw. erwartet wird.
Es ist alles eine Frage der Anforderungen und des finanziellen Rahmens.
|
|
Peter2002 
      
Beiträge: 103
Win XP, Win 7
Delphi 2007 / XE3
|
Verfasst: Di 21.12.10 20:59
Danke für die Hinweise.
Es geht hierbei um ein Etikettiersystem, welches in der Produktion in unterschiedlichen Takt-Zeiten (ca. 30 Sek.) verschiedene Etiketten drucken soll. Von daher ist es vermutlich sinnvoller, wenn alles innerhalb dieses Netzes läuft.
Cloud-Computing oder ext. Rechenzentren kommen für mich eher nicht in Frage.
Virtualisierung wär aber eine Option. Nur habe ich noch nicht begriffen, wie ich mit VMs das besser machen kann.
Die Situation bleibt doch die gleiche, A fällt aus, B übernimmt (auch die IP), A wird wieder gestartet und perfekt ist der IP-Konflikt?
Oder muss ich mit diesem Risiko einfach leben und sicher sein, dass A erst mal ohne Netzwerkanbindug startet.
_________________ Gruß Peter
Zuletzt bearbeitet von Peter2002 am Mi 22.12.10 10:23, insgesamt 1-mal bearbeitet
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Di 21.12.10 23:22
Peter2002 hat folgendes geschrieben : | | Die Situation bleibt doch die gleiche, A fällt aus, B übernimmt (auch die IP), A wird wieder gestartet und perfekt ist der IP-Konflikt? |
Die einfachste Lösung wäre doch sicherlich, wenn die Clients beide IP-Adressen kennen (von Rechner A und B).
|
|
Peter2002 
      
Beiträge: 103
Win XP, Win 7
Delphi 2007 / XE3
|
Verfasst: Mi 22.12.10 10:22
Gerd Kayser hat folgendes geschrieben : | | Die einfachste Lösung wäre doch sicherlich, wenn die Clients beide IP-Adressen kennen (von Rechner A und B). |
Ja und nein. Genau das will ich eigentlich nicht. Kommt ein weiteres Programm hinzu, das mit dem Service kommunizieren will, fang ich wieder von vorn an, weil ich die Logik hier auch wieder brauch...
Viel schöner ist es doch, wenn die Clients gar nicht mitbekommen, dass jetzt ein anderer Rechner die Arbeit übernimmt.
_________________ Gruß Peter
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Mi 22.12.10 10:42
Peter2002 hat folgendes geschrieben : | | Viel schöner ist es doch, wenn die Clients gar nicht mitbekommen, dass jetzt ein anderer Rechner die Arbeit übernimmt. |
Bei Deiner Variante hast Du einen Rechner A, der evtl. durch zahlreiche Anfragen ins Schwitzen kommt, während Rechner B in der Ecke vor sich hin staubt.
Besser wäre es doch, wenn die Clients beide IP-Adressen kennen. Eine Hälfte der Clients rufen vorzugsweise Rechner A, die andere Hälfte vorzugsweise Rechner B. Nur wenn eine Verbindung z. B. durch Rechnerausfall nicht zustande kommt, wird die alternative Adresse (und damit der andere Rechner) gerufen.
Vorteil: Lastverteilung und beide Rechner im produktiven Einsatz. Wenn einer der Rechner ausfällt (geplant oder ungeplant), dann steht immer noch der andere Produktionsrechner bereit. Und beim Reaktivieren des ausgefallenen Rechners sind keine weiteren Maßnahmen erforderlich.
|
|
Peter2002 
      
Beiträge: 103
Win XP, Win 7
Delphi 2007 / XE3
|
Verfasst: Mi 22.12.10 11:37
OK. Im Sinne einer Lastverteilung und dass der zweite Rechner nicht ungenutzt bleibt, ist die Idee top.
Mein Problem ist nur, dass ich die bestehen Clients nicht unbedingt ändern möchte und ggf. andere Systeme Zufgriff haben sollen, auf die ich evtl. keinen Einfluss habe.
Von daher bevorzuge ich eine serverseitige Lösung, welche aber auch sicher funktionieren muss. Mit einem IP-Konfilikt z.B. hätte ich dann ja leider das Gegenteil erreicht.
_________________ Gruß Peter
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 22.12.10 12:01
Also grundsätzlich gibt es bei deiner Herangehensweise irgendein Gerät, welches das auch ist, das über die IP erreichbar ist und sein muss. Ob das jetzt die Zugriffe weiterleitet oder wie auch immer, irgendein Gerät muss über die eine IP angesprochen werden.
Eine Möglichkeit wäre ein elektronischer Schalter. Dann könnte ein zweiter Rechner den ersten überwachen. Funktioniert der nicht mehr, schaltet der zweite den Switch zum ersten Rechner aus und aktiviert eine zweite Netzwerkkarte, die mit der selben IP konfiguriert ist. Dann ist die IP wieder auf dem zweiten Rechner erreichbar.
Zudem muss der zweite Rechner natürlich sofort z.B. per E-Mail Bescheid geben, damit der Ausfall bekannt wird.
Auf diese Weise lässt sich das denke ich einfach und ohne große Kosten realisieren.
Eine andere Möglichkeit:
Ein Router wird über die IP auf dem Port angesprochen. Dort wird der Zugriff über eine Portweiterleitung auf einen PC weitergeleitet. Welcher das ist, ist dabei dann egal. Ein zweiter überwachender PC kann dann einfach die Portweiterleitung verändern.
Dass der Router selbst abschmiert, sollte bei einem guten Gerät sehr unwahrscheinlich sein, zudem kann man den auch an einen elektronischen Schalter anschließen, damit er von außen (durch einen der beiden PCs bei Nichterreichbarkeit) nach einem Absturz neugestartet werden kann.
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Mi 22.12.10 12:24
Peter2002 hat folgendes geschrieben : | | OK. Im Sinne einer Lastverteilung und dass der zweite Rechner nicht ungenutzt bleibt, ist die Idee top. |
Es gibt noch einen weiteren Vorteil meiner Lösung mit zwei produktiven PCs. Ein nicht genutzter PC weckt immer Begehrlichkeiten. Wenn kurzfristig für einen neuen Mitarbeiter ein PC benötigt wird, ist der Backup-Rechner meist im Gespräch, weil der andere PC ja bislang fehlerfrei lief. "Warum sollte genau in den nächsten Tagen der Produktionsrechner ausfallen?", wird sicherlich das Argument des Chefs sein. Ich kenne das noch aus meiner bisherigen Berufspraxis ...
| Zitat: | | Mein Problem ist nur, dass ich die bestehen Clients nicht unbedingt ändern möchte und ggf. andere Systeme Zufgriff haben sollen, auf die ich evtl. keinen Einfluss habe. |
Auch eine einfache Hochverfügsbarkeitslösung ist nicht zum Nulltarif zu haben, sei es durch zusätzliche Hardware oder etwas höheren Programmieraufwand. Auch die Lösung von Jaenicke bedeutet, Geld in die Hand zu nehmen...
|
|
Peter2002 
      
Beiträge: 103
Win XP, Win 7
Delphi 2007 / XE3
|
Verfasst: Mi 22.12.10 14:24
jaenicke hat folgendes geschrieben : | [...]Eine Möglichkeit wäre ein elektronischer Schalter. [...]
Zudem muss der zweite Rechner natürlich sofort z.B. per E-Mail Bescheid geben, damit der Ausfall bekannt wird.[...] |
Danke. Guter Hinweis mit der email.
Wie meinst du das mit dem elektronischen Schalter? Dem Ding einfach den Strom klauen?
Gerd Kayser hat folgendes geschrieben : | | [...]weckt immer Begehrlichkeiten. Wenn kurzfristig für einen neuen Mitarbeiter ein PC benötigt wird, ist der Backup-Rechner meist im Gespräch, weil der andere PC ja bislang fehlerfrei lief. [...] |
Sowas darfs aber nicht geben. Wenn gnadenlos Backup-Systeme abeschaltet werden, ist jede Diskusion bezüglich Hochverfügbarkeit hinfällig.
Gerd Kayser hat folgendes geschrieben : |
Auch eine einfache Hochverfügsbarkeitslösung ist nicht zum Nulltarif zu haben [...] |
Ja schon klar. Ich möchte aber Aufwand und Kosten möglichst gering halten.
_________________ Gruß Peter
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 22.12.10 14:36
Peter2002 hat folgendes geschrieben : | | Wie meinst du das mit dem elektronischen Schalter? Dem Ding einfach den Strom klauen? |
Ja. Dem Switch, nicht dem Rechner wohlgemerkt (abstürzen muss man den Rechner ja nicht). Damit kannst du von außen die Verbindung zum Netzwerk unterbrechen um selbst die IP zur Verfügung zu stellen, ohne dass es Konflikte gibt.
Zudem sind solche Schalter relativ günstig zu haben, so dass es auch nicht viel kostet.
|
|
|