Re: "Heartbeats Implementierung"
From: Simon Steiner (anonymous_at_discussions.microsoft.com)
Date: 03/18/04
- Next message: Simon Steiner: "Re: C#-Anwendung soll DB erzeugen können"
- Previous message: Björn Marthen: "Ein Control/Object klonen/kopieren"
- In reply to: Manfred Gloiber: ""Heartbeats Implementierung""
- Messages sorted by: [ date ] [ thread ]
Date: Thu, 18 Mar 2004 10:24:05 +0100
hallo manfred
ich bin auch am verschiedenste server entwickeln welche voneinander wissen
sollten wer verfügbar ist, wer neue daten hat, wer nicht verfügbar ist, etc.
also ich habe eigentlich ähnliche probleme wie du da beschreibst.
ich habe verschiedenste techniken ausprobiert um die problematik zu lösen...
hier zwei (einigermassen brauchbare) davon:
- master-prinzip --> der erste rechner der aufstartet, oder einer nach
definition ist master. alle folgenden rechner senden diesem master (in
deinem fall ev. der sql-server) ein heartbeat per tcp/ip. der master muss
also zu allen rechner eine tcp/ip verbindung haben... problematisch wird
das, wenn der sql-server ausfallen würde... und du hast natürlich ziemlich
viel traffic, was aber keine rolle spielt wenn du z.b. in einem lan
arbeitest mit 100 oder 1000 mb
- udp-broadcast --> alle rechner senden ein udp-signal aus in einem per
zufall bestimmtem abstand. alle rechner empfangen es und speichern den
status des einzelnen rechners (oder auch nur der master -- sql-server) -- da
udp keine receive-control hat muss das signal bestimmt mehrmals gesendet
werden bis es "sicher" ankommt... und auch dann ist es noch nicht sicher
angekommen.
das was du beschreibst mit dem sql-server und den mehreren threads sollte ja
eigentlich schon möglich sein, oder nicht? du machst verschiedene threads
welche alle verschiedene clients pingen, oder heartbeats empfangen oder was
auch immer. entweder schreiben die threads eigens in die db (der sql-server
hat ja einen lock-manager und ein dead-lock-manager...) oder du schreibst
die daten welche in die db zu schreiben sind von allen threads in eine
statische klasse, memoryqueue oder was auch immer und verarbeitest es
zentral.
ich persönlich finde das mit dem sql-server immer ein wenig problematisch...
msSQL ist ziemlich langsam (im vergleich zu anderen techniken und anderen
db's...) und produziert auch einen ziemlichen overhead bei der verbindung.
ein einfaches heartbeat per tcp/ip finde ich die sauberste lösung und auch
die effizienteste...
gruss simon
"Manfred Gloiber" <no@thank.you> schrieb im Newsbeitrag
news:erah0KIDEHA.3280@TK2MSFTNGP09.phx.gbl...
> Hallo,
>
> Ich habe einen Dienst geschrieben, der innerhalb bestimmter "TimeFrames"
> (also zu bestimmten Zeiten und Zeitraeumen) einen anderen Dienst
> stoppt/startet/deaktiviert etc. Dieser Dienst soll nun auf ca. 2000
Rechnern
> (Windows 2000 Professional) installiert werden.
> Nun soll der Status saemtlicher Dienste abgefragt werden koennen, d. h.
> jemand moechte dann z. B. von allen Clients, auf denen der Dienst
> installiert ist, sehen, ob ein Dienst ausgefallen ist oder gerade den zu
> ueberwachenden Dienst gestoppt hat oder ob dieser gerade laeuft. Ich kann
> nun natuerlich schlecht alle 2000 Clients auf einmal abfragen (Traffic,
DSN
> Aufloesungen, Latenzzeiten etc.).
>
> Meine Frage ist nun:
> Wie implementiert man so etwas am Besten um moeglichst schnell aktuelle
und
> somit korrekte Ergebnisse liefern zu koennen?
>
> Ich hab mir dazu bisher 2 Dinge gedacht:
> 1. Alle Clients schreiben in bestimmten Intervallen in eine Tabelle in
einer
> SQL Datenbank (Datenbank wird ohnehin schon benoetigt) ihren aktuellen
> Status. Damit nicht alle gleichzeitig loslegen und das Netz belasten,
dachte
> ich daran, dass der Dienst an z. B. +-10 Minuten an dem festgelegten
> Zeitpunkt seinen Status in die DB schreibt (so macht das wenn ich mich
nicht
> irre auch Windows bei diversen Dingen wie Replikation usw.?). Dadurch habe
> ich allerdings je nach Zeitspanne eine recht grosse Differenz (in diesem
> Fall bis zu 20 Minuten) und somit Ungenauigkeit, weil die Daten eben
> veraltet sein koennen.
>
> 2. Ich schreibe einen weiteren Dienst, der zentral auf z. B. dem SQL
Server
> laeuft und in bestimmten Intervallen alle Daten aller Clients einsammelt.
> Dabei haette ich allerdings je nachdem das Problem, dass ein Client nicht
> erreichbar ist und ich erst pingen und auf einen Timeout warten muss. Wenn
> das bei zu vielen Clients passiert, dauert das je nachdem auch etwas lang.
> Vllt. hilft es hier, das in sagen wir 25 Threads ablaufen zu lassen? Krieg
> ich hierbei dann evtl. Probleme beim Locken der DB bei parallelen
Zugriffen?
> (gilt auch fuer Variante 1)
>
>
> Hat jemand mit so etwas vllt. schon Erfahrung oder kann mir einen
> zuverlaessigen und eben ressourcensparenden (und natuerlich auch
> performanten ;-) Weg nennen, wie man so etwas ueblicherweise angeht und
> loest?
>
>
> Vielen Dank Euch!
> - Manfred
>
>
- Next message: Simon Steiner: "Re: C#-Anwendung soll DB erzeugen können"
- Previous message: Björn Marthen: "Ein Control/Object klonen/kopieren"
- In reply to: Manfred Gloiber: ""Heartbeats Implementierung""
- Messages sorted by: [ date ] [ thread ]
Relevant Pages
|