Autor Beitrag
Peter2002
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103

Win XP, Win 7
Delphi 2007 / XE3
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 159



BeitragVerfasst: Mo 13.12.10 04:58 
user profile iconPeter2002 hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103

Win XP, Win 7
Delphi 2007 / XE3
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 13.12.10 12:04 
user profile iconPeter2002 hat folgendes geschrieben Zum zitierten Posting springen:
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:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103

Win XP, Win 7
Delphi 2007 / XE3
BeitragVerfasst: Mo 13.12.10 12:13 
user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103

Win XP, Win 7
Delphi 2007 / XE3
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103

Win XP, Win 7
Delphi 2007 / XE3
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Di 21.12.10 23:22 
user profile iconPeter2002 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103

Win XP, Win 7
Delphi 2007 / XE3
BeitragVerfasst: Mi 22.12.10 10:22 
user profile iconGerd Kayser hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Mi 22.12.10 10:42 
user profile iconPeter2002 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103

Win XP, Win 7
Delphi 2007 / XE3
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Mi 22.12.10 12:24 
user profile iconPeter2002 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103

Win XP, Win 7
Delphi 2007 / XE3
BeitragVerfasst: Mi 22.12.10 14:24 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
[...]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?


user profile iconGerd Kayser hat folgendes geschrieben Zum zitierten Posting springen:
[...]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.

user profile iconGerd Kayser hat folgendes geschrieben Zum zitierten Posting springen:

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 22.12.10 14:36 
user profile iconPeter2002 hat folgendes geschrieben Zum zitierten Posting springen:
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.