06.11.2013 Aufrufe

Entwurf und Implementierung eines Überwachungsdienstes für ...

Entwurf und Implementierung eines Überwachungsdienstes für ...

Entwurf und Implementierung eines Überwachungsdienstes für ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

CARL<br />

VON<br />

OSSIETZKY<br />

DEPARTMENT FÜR INFORMATIK<br />

SYSTEMSOFTWARE UND VERTEILTE SYSTEME<br />

<strong>Entwurf</strong> <strong>und</strong> <strong>Implementierung</strong> <strong>eines</strong><br />

<strong>Überwachungsdienstes</strong> <strong>für</strong> das<br />

adaptiv-dynamische<br />

Replikationsrahmenwerk adGSV<br />

Individuelles Projekt<br />

12. November 2006<br />

Matthias Davidek<br />

Bloherfelder Str. 16<br />

26129 Oldenburg<br />

Erstprüfer<br />

Zweitprüfer<br />

Prof. Dr.-Ing. Oliver Theel<br />

Dipl.-Inform. Christian Storm


Erklärung zur Urheberschaft<br />

Hiermit versichere ich, dass ich diese Arbeit selbständig verfasst <strong>und</strong> keine anderen als<br />

die angegebenen Hilfsmittel <strong>und</strong> Quellen benutzt habe.<br />

Oldenburg, den 12. November 2006<br />

Matthias Davidek


Die Überwachung von Zuständen <strong>und</strong> Abläufen <strong>eines</strong> System ist die zentrale Aufgabe <strong>eines</strong><br />

<strong>Überwachungsdienstes</strong>. Bei Auffälligkeiten kann der Überwachungsdienst in den Ablauf<br />

<strong>eines</strong> Systems eingreifen <strong>und</strong> dieses steuern bzw. neu konfigurieren. Die Verwendung <strong>eines</strong><br />

<strong>Überwachungsdienstes</strong> bewirkt eine Automatisierung der Kontrollierung <strong>eines</strong> Systems. Der<br />

Benutzer muss nicht selber den reibungslosen Ablauf des Systems überprüfen. Ein Überwachungsdienst<br />

kann Fehler im System entdecken <strong>und</strong> darauf reagieren, um die Fehler schnell<br />

zu beheben. Der Überwachungsdienst besitzt verschiedene Komponenten, die <strong>für</strong> die diversen<br />

Aufgaben zuständig sind.<br />

Ein Überwachungsdienst <strong>für</strong> das Rahmenwerk des adaptable dynamic General Structure<br />

Voting-Verfahren soll entwickelt <strong>und</strong> implementiert werden. Dieser soll in das Rahmenwerk<br />

integriert werden, um zu testen, ob der Überwachungsdienst Fehler in den Abläufen des<br />

Rahmenwerks entdeckt <strong>und</strong> dementsprechend reagieren kann.<br />

Der Überwachungsdienst soll die Möglichkeit bieten das adGSV-Rahmenwerk durch Sensoren<br />

zu überwachen <strong>und</strong> bei Ereignissen durch Aktoren einzugreifen. Es sollen neue Sensoren<br />

<strong>und</strong> Aktoren implementiert <strong>und</strong> dem Überwachungsdienst zur Verfügung gestellt werden<br />

können. Mit Hilfe logischer Verknüpfungen soll die korrekte Zusammenarbeit der Sensoren<br />

<strong>und</strong> Aktoren gewährleistet werden. Zudem sollen die logischen Verknüpfungen zwischen<br />

den Sensoren <strong>und</strong> Aktoren angepasst <strong>und</strong> erweitert werden können. Messergebnisse <strong>und</strong><br />

Statusmeldungen sollen persistent gespeichert <strong>und</strong> somit protokolliert werden.


Inhaltsverzeichnis<br />

1 Einleitung 1<br />

2 Replikation 3<br />

2.1 Gr<strong>und</strong>lagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3<br />

2.2 Replikationsverfahren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5<br />

2.2.1 statische Replikationsverfahren . . . . . . . . . . . . . . . . . . . . . 5<br />

2.2.2 dynamische Replikationsverfahren . . . . . . . . . . . . . . . . . . . . 7<br />

2.3 adaptable dynamic General Structure Voting . . . . . . . . . . . . . . . . . . 8<br />

2.4 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9<br />

3 Konzeption des Monitordienstes 10<br />

3.1 Der Monitordienst . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />

3.2 Sensoren <strong>und</strong> Aktoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11<br />

3.2.1 Aufbau <strong>und</strong> Funktion von Sensoren . . . . . . . . . . . . . . . . . . . 11<br />

3.2.2 Aufbau <strong>und</strong> Funktion von Aktoren . . . . . . . . . . . . . . . . . . . 13<br />

3.2.3 Verwaltung von Sensoren <strong>und</strong> Aktoren . . . . . . . . . . . . . . . . . 14<br />

3.3 Logik-Strukturen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16<br />

3.3.1 Aufbau <strong>und</strong> Funktion von Logik-Strukturen . . . . . . . . . . . . . . 17<br />

3.3.2 Verwaltung von Logik-Strukturen . . . . . . . . . . . . . . . . . . . . 21<br />

3.4 Persistentes Speichern von Ergebnissen . . . . . . . . . . . . . . . . . . . . . 22<br />

3.4.1 Aufbau <strong>und</strong> Funktion des Storage-Handlers . . . . . . . . . . . . . . 22<br />

3.5 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24<br />

4 Architektur <strong>und</strong> Realisierung des Monitordienstes 25<br />

4.1 Technologien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25<br />

4.2 Konzept, <strong>Entwurf</strong> <strong>und</strong> Komponenten . . . . . . . . . . . . . . . . . . . . . . 26<br />

4.3 Erweiterungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32<br />

4.4 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32<br />

5 Zusammenfassung <strong>und</strong> Ausblick 33<br />

Literaturverzeichnis 34<br />

A Handbuch 36<br />

A.1 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36<br />

A.2 Erste Schritte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36<br />

A.2.1 adGSV-Rahmenwerk starten . . . . . . . . . . . . . . . . . . . . . . . 36<br />

A.2.2 Monitordienst starten . . . . . . . . . . . . . . . . . . . . . . . . . . . 37<br />

A.3 Sensoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37<br />

A.3.1 Erstellen <strong>eines</strong> neuen Sensors . . . . . . . . . . . . . . . . . . . . . . 37<br />

A.3.2 Hinzufügen <strong>eines</strong> neuen Sensors . . . . . . . . . . . . . . . . . . . . . 37


A.3.3 Entfernen <strong>eines</strong> registrierten Sensors . . . . . . . . . . . . . . . . . . 38<br />

A.3.4 Sensoren starten <strong>und</strong> stoppen . . . . . . . . . . . . . . . . . . . . . . 38<br />

A.4 Aktoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38<br />

A.4.1 Erstellen <strong>eines</strong> neuen Aktors . . . . . . . . . . . . . . . . . . . . . . . 38<br />

A.4.2 Hinzufügen <strong>eines</strong> neuen Aktors . . . . . . . . . . . . . . . . . . . . . 39<br />

A.4.3 Entfernen <strong>eines</strong> registrierten Aktors . . . . . . . . . . . . . . . . . . . 39<br />

A.5 Logik-Strukturen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39<br />

A.5.1 Erstellen einer neuen Logik-Struktur . . . . . . . . . . . . . . . . . . 39<br />

A.5.2 Hinzufügen einer neuen Logik-Struktur . . . . . . . . . . . . . . . . . 40<br />

A.5.3 Entfernen einer registrierten Logik-Struktur . . . . . . . . . . . . . . 40<br />

A.6 Funktionen des Storage-Handlers . . . . . . . . . . . . . . . . . . . . . . . . 40<br />

A.7 Anzeigen von Informationen . . . . . . . . . . . . . . . . . . . . . . . . . . . 42


Abbildungsverzeichnis<br />

2.1 Eine 4 × 3 Gitterstruktur <strong>für</strong> 12 Knoten . . . . . . . . . . . . . . . . . . . . 6<br />

3.1 Schema des Monitordienstes . . . . . . . . . . . . . . . . . . . . . . . . . . . 11<br />

3.2 Einzelne Sensoren werden von der abstrakten Basisklasse Sensor abgeleitet . 12<br />

3.3 Einzelne Aktoren werden von der abstrakten Basisklasse Aktor abgeleitet . . 14<br />

3.4 Das Register des Sensor Managers . . . . . . . . . . . . . . . . . . . . . . . . 15<br />

3.5 Das Register des Aktor Managers . . . . . . . . . . . . . . . . . . . . . . . . 15<br />

3.6 Logik-Struktur als Verknüpfung zwischen Sensoren <strong>und</strong> Aktoren . . . . . . . 17<br />

3.7 1:1-Beziehung zwischen einem Sensor <strong>und</strong> Aktor . . . . . . . . . . . . . . . . 18<br />

3.8 1:n-Beziehung zwischen einem Sensor <strong>und</strong> zwei Aktoren . . . . . . . . . . . . 18<br />

3.9 n:1-Beziehung zwischen zwei Sensoren <strong>und</strong> einem Aktor . . . . . . . . . . . . 19<br />

3.10 Syntax der gesamten Logik-Struktur . . . . . . . . . . . . . . . . . . . . . . 20<br />

3.11 Der resultierende Graph aus der Logik-Struktur . . . . . . . . . . . . . . . . 20<br />

3.12 Das Register des Dispatchers . . . . . . . . . . . . . . . . . . . . . . . . . . . 21<br />

4.1 Klassendiagramm des Monitordienstes . . . . . . . . . . . . . . . . . . . . . 27


1 Einleitung<br />

Replikationstechniken verfolgen das Ziel eine höhere Verfügbarkeit von Daten zu gewährleisten.<br />

Bei der Speicherung von Daten auf einem zentralen Rechner besteht das Problem,<br />

dass bei dem Ausfall des Rechners Zugriffe auf die Daten nicht mehr möglich sind (Single<br />

Point of Failure). Bei den Replikationstechniken werden verschiedene Kopien (Replikate)<br />

<strong>eines</strong> Datums auf verschiedenen Rechnern abgelegt. Wenn ein einzelner Rechner ausfällt,<br />

dann kann trotzdem auf das Datum auf einem anderen Rechner zugegriffen werden. Dabei<br />

stellen die Replikationsverfahren die gegenseitige Konsistenz der Replikate sicher, in dem<br />

verschiedene Strategien <strong>für</strong> Lese- <strong>und</strong> Schreiboperationen zur Verfügung gestellt werden.<br />

Die Replikationsverfahren lassen sich in zwei Gruppen einteilen. Es gibt statische <strong>und</strong> dynamische<br />

Replikationsverfahren. Bei den statischen Replikationsverfahren muss am Anfang<br />

die Anzahl der teilnehmenden Knoten definiert werden. Diese Anzahl ist fix <strong>und</strong> kann nicht<br />

verändert werden. Durch dieses Konzept kann es passieren, dass durch die vorgegebene<br />

Strategie, wenn eine bestimmte Anzahl an Knoten ausfällt, der Zugriff auf das Datum nicht<br />

mehr möglich ist. Um diesen Problem entgegen zu wirken, gibt es dynamische Replikationsverfahren,<br />

die auf Ausfälle oder das Hinzufügen von Knoten reagieren können. Bei den<br />

dynamischen Replikationsverfahren wird die Strategie nach dem Entfernen oder Hinzufügen<br />

<strong>eines</strong> Knotens angepasst. Die dynamischen Verfahren sind eine Erweiterung der statischen<br />

Verfahren, bei denen die Dynamikeigenschaften ergänzt wurden. Für die jeweiligen Verfahren<br />

wurde eine Vielzahl an Strategien entwickelt, die verschiedene Vor- <strong>und</strong> Nachteile je<br />

nach Anwendungszweck mit sich bringen.<br />

Das adaptable dynamic General Structure Voting-Verfahren (adGSV-Verfahren) basiert<br />

analog wie das dynamic General Structure Voting-Verfahren (dGSV-Verfahren) auf die<br />

Verwendung von Voting-Strukturen <strong>und</strong> Epochen. Es ermöglicht eine flexible Verwaltung<br />

von Replikaten, die zur Laufzeit in einer Voting-Struktur integriert oder aus einer Voting-<br />

Struktur entfernt werden. Des weiteren können inhomogene Strategien verwendet werden, in<br />

dem je nach Knotenanzahl eine andere Strategie verwendet wird. Zur Belegung der Durchführbarkeit<br />

des Konzepts hatte Dipl.-Inform. Christian Storm ein Rahmenwerk entwickelt<br />

<strong>und</strong> implementiert.<br />

Das Ziel dieser Arbeit ist die Entwicklung <strong>und</strong> <strong>Implementierung</strong> <strong>eines</strong> <strong>Überwachungsdienstes</strong><br />

<strong>für</strong> das adGSV-Rahmenwerk. Der Überwachungsdienst soll in das Rahmenwerk integrierbar<br />

sein <strong>und</strong> soll somit den Funktionsumfang des adGSV-Rahmenwerks erweitern. Die Aufgabe<br />

des <strong>Überwachungsdienstes</strong> ist Komponenten zur Verfügung zu stellen, mit denen die Überwachung<br />

bestimmter Bereiche <strong>und</strong> Funktionen des Rahmenwerks möglich ist. Des weiteren<br />

müssen Komponenten existieren, mit denen auf die Ergebnisse der Überwachung reagiert<br />

werden können. Es soll möglich sein bestimmte Aufgaben <strong>und</strong> Steuerungen des adGSV-<br />

Rahmenwerks automatisch durch den Überwachungsdienst vornehmen zu lassen.<br />

In dem folgenden Kapitel wird eine kurze Einführung in die Terminologie <strong>und</strong> Voraussetzun-<br />

1


1 Einleitung<br />

gen der Replikationstechniken gegeben. Es werden die verschiedenen Replikationsverfahren<br />

betrachtet <strong>und</strong> das adGSV-Verfahren wird vorgestellt. Das 3. Kapitel behandelt die Konzeption<br />

des Überwachungsdienst. Es werden Einblicke in die verschiedenen Komponenten <strong>für</strong><br />

die Funktion des <strong>Überwachungsdienstes</strong> gegeben. Die <strong>Implementierung</strong> des <strong>Überwachungsdienstes</strong>,<br />

sowie die verwendeten Technologien werden in Kapitel 4 beschrieben. Das Kapitel<br />

5 ist das abschließende Kapitel dieser Arbeit <strong>und</strong> bietet eine Zusammungfassung <strong>und</strong> einen<br />

Ausblick.<br />

2


2 Replikation<br />

Zum besseren Verständnis der Thematik wird in diesem Kapitel eine kleine Einführung<br />

in das Thema der Replikation gegeben. Zunächst werden die gr<strong>und</strong>legenden Begriffe <strong>und</strong><br />

Voraussetzungen <strong>für</strong> Repliaktionsverfahren erläutert. In Kapitel 2.2 werden die Replikationsverfahren,<br />

sowie deren Arbeitsweise <strong>und</strong> Unterschiede, betrachtet. Das in [Sto06] beschriebene<br />

adaptable dynamic General Structure Voting-Verfahren wird in dem Kapitel 2.3<br />

kurz vorgestellt.<br />

2.1 Gr<strong>und</strong>lagen<br />

Replikation bedeutet eine Vervielfältigung von Daten. Der Inhalt der replizierten Daten ist<br />

jeweils identisch. Die Daten befinden sich dabei auf verschiedenen Rechnern, die über ein<br />

Netzwerk verb<strong>und</strong>en sind, was einem verteilten System entspricht. Ein verteiltes System<br />

besitzt eine Menge von voneinander unabhängigen Rechnern, die mit Hilfe <strong>eines</strong> Netzwerks<br />

miteinander verb<strong>und</strong>en sind <strong>und</strong> kommunizieren. Die einzelnen Rechner werden als Knoten<br />

bezeichnet. In einem verteilten System kann ein Knoten entweder verfügbar oder nicht<br />

verfügbar sein, d.h. die Knoten verhalten sich Fail-Stop [SS83]. Die Knoten des verteilten<br />

System stellen die verschiedenen Standorte <strong>für</strong> die Kopien der Daten dar. Die Kopie <strong>eines</strong><br />

Datums wird auch als Replikat bezeichnet. Knoten, die ein Replikat <strong>eines</strong> Datums besitzen,<br />

nehmen an dem Replikationsverfahren <strong>für</strong> dieses Datum teil. Die Replikationsverfahren sorgen<br />

<strong>für</strong> die gegenseitige Konsistenz der Replikate. Ansätze des Korrektheitskriteriums <strong>für</strong> die<br />

Konsistenz der Replikate verwenden 1-Kopien-Serialisierbarkeit (1SR) [BHG87]. Dies besagt,<br />

dass Operationen auf einem replizierten Datum denselben Operationen auf einem nicht<br />

replizierten Datum gleichen. Für Lese- <strong>und</strong> Schreiboperationen auf den Knoten verwenden<br />

die Replikationsverfahren verschiedene konsistenzerhaltende Strategien. Die Anforderungen<br />

an die Replikationsverfahren unterscheiden sich in den Kosten <strong>und</strong> der Verfügbarkeit. Um<br />

geringe Leseoperationskosten zu erzielen, muss ein wahlfreier Zugriff innerhalb einer großen<br />

Anzahl an Replikaten ermöglicht werden. Eine kleine Anzahl an Replikaten, von denen<br />

möglichst wenige synchron aktualisiert werden müssen, erzielen geringe Schreiboperationskosten.<br />

Eine große Anzahl an Replikaten, die synchron aktualisiert werden, sorgen dagegen<br />

<strong>für</strong> die Erhaltung der Datenkonsistenz.<br />

Zur Konsistenzerhaltung verwenden die verschiedenen Strategien der Replikationsverfahren<br />

eine verschiedene Anzahl an Knoten <strong>für</strong> Lese- <strong>und</strong> Schreiboperationen. Die Menge der an<br />

dem Replikationsverfahren teilnehmenden Knoten, die <strong>für</strong> eine Operation gebraucht wird,<br />

wird als Quorum [AE92] bezeichnet. Für Leseoperationen gibt es Lesequoren <strong>und</strong> <strong>für</strong> Schreiboperationen<br />

gibt es Schreibquoren. Die einzelnen Quoren sind Teil einer Quorenmenge, die<br />

<strong>für</strong> die jeweilige Strategie des Replikationsverfahrens gebraucht wird. Es muss sichergestellt<br />

werden, dass ein Quorum aus einer nicht leeren Menge von dem am Replikationsverfahren<br />

teilnehmenden Knoten besteht. Des weiteren darf ein Quorum keine echte Teilmenge <strong>eines</strong><br />

anderen Quorums sein.<br />

3


2 Replikation<br />

Die Quoren der Quorenmenge müssen eine wichtige Eigenschaft erfüllen, damit die Konsistenz<br />

sicher gestellt werden kann. Jeweils zwei Schreibquoren oder ein Schreibquorum <strong>und</strong><br />

ein Lesequorum einer Quorenmenge müssen sich so überschneiden, dass sie mindestens einen<br />

gemeinsamen Knoten besitzen. Eine Coterie [GB85, MN92] bezeichnet eine Quorenmenge,<br />

bei der alle enthaltenden Quoren diese Überschneidungseigenschaft erfüllen. Um den gegenseitigen<br />

Ausschluss von Schreiboperationen zu gewährleisten, muss die Schreibquorenmenge<br />

eine Coterie sein. Der gegenseitige Ausschluss von Lese- <strong>und</strong> Schreiboperationen wird gewährleistet,<br />

indem jedes Quorum aus der Lesequorenmenge mit jedem Quorum aus der<br />

Schreibquorenmenge eine Coterie bildet. Zudem wird sichergestellt, dass jedes Lesequorum<br />

mindestens einen Knoten mit einem aktuellen Replikat beinhaltet. Jeweils zwei Lesequoren<br />

müssen sich nicht überschneiden, da Leseoperationen nicht modifizierend <strong>und</strong> somit konsistenzgefährdend<br />

sind.<br />

Jeder am Replikationsverfahren teilnehmende Knoten besitzt eine positive Ganzzahl als<br />

Stimme. Wenn eine Operation durchgeführt werden soll, kann der Knoten seine Stimme<br />

da<strong>für</strong> abgegeben. Hat der Knoten seine Stimme <strong>für</strong> eine Operation abgegeben, dann darf<br />

dieser seine Stimme bis zum Abschluss der Operation nicht erneut abgeben. Nach dem Abschluss<br />

der Operation darf der Knoten seine Stimme <strong>für</strong> neue Operationen wieder abgeben.<br />

Gibt ein Knoten seine Stimme <strong>für</strong> eine Operation nicht ab, dann wird die Durchführung<br />

dieser Operation verweigert.<br />

Beispiel Vier Knoten nehmen an einem Replikationsverfahren teil. Die Knoten werden<br />

als R1, R2, R3 <strong>und</strong> R4 bezeichnet. Für Lese- <strong>und</strong> Schreiboperationen muss die Mehrzahl<br />

der Knoten teilnehmen. Die Strategie des Replikationsverfahrens <strong>für</strong> Lese- <strong>und</strong> Schreiboperationen<br />

entspricht also dem Mehrheitsprinzip (Majority Consensus Voting [HHB96]). Die<br />

Lese- <strong>und</strong> Schreibquoren, die ebenfalls eine Coterie sind, sehen folgendermaßen aus:<br />

Q r w = {{R 1 , R 2 , R 3 }, {R 1 , R 2 , R 4 }, {R 1 , R 3 , R 4 }, {R 2 , R 3 , R 4 }}<br />

Lese- <strong>und</strong> Schreiboperationen auf einem Replikat werden als Transaktionen bezeichnet.<br />

Dabei muss beachtet werden, dass eine Transaktion ein Replikat von einem konsistenten<br />

Zustand in einen konsistenten Folgezustand überführt. Hier<strong>für</strong> arbeiten die Transaktionen<br />

nach dem ACID-Prinzip [HHB96] <strong>und</strong> es wird das 2 Phase Commit (2PC)-Protokoll [Ske81]<br />

oder das 3 Phase Commit (3PC)-Protokoll [Ske81] benutzt.<br />

Eine Transaktion wird entweder komplett oder gar nicht aus-<br />

Atomicity (Atomizität)<br />

geführt.<br />

Consistency (Konsistenz) Eine Transaktion muss einen konsistenten Zustand in einen<br />

konsistenten Folgezustand überführen.<br />

Isolation Transaktionen zur Änderung <strong>eines</strong> Datums dürfen nur seriell ausgeführt werden.<br />

Nur das Endergebnis einer fertigen Transaktion darf gelesen oder verändert werden.<br />

Durability (Persistenz) Eine durchgeführte Änderung einer Transaktion bleibt dauerhaft<br />

erhalten <strong>und</strong> kann nur durch weitere Transaktionen verändert werden.<br />

4


2.2 Replikationsverfahren<br />

2.2 Replikationsverfahren<br />

Alle Knoten <strong>eines</strong> verteilten Systems, die an dem Replikationsverfahren <strong>für</strong> ein Datum<br />

teilnehmen, besitzen ein Replikat dieses Datums. Zur Erhaltung der gegenseitigen Konsistenz<br />

des Datums verfolgen die Replikationsverfahren bestimmte Strategien. Dabei sind<br />

verschiedene Voraussetzungen zu beachten, wodurch sich die Replikationsverfahren in zwei<br />

Kategorien einteilen lassen. Die beiden Kategorien sind statische <strong>und</strong> dynamische Replikationsverfahren.<br />

In den beiden folgenden Kapiteln werden die statischen <strong>und</strong> dynamischen Replikationsverfahren<br />

erläutert.<br />

2.2.1 statische Replikationsverfahren<br />

Statische Replikationsverfahren setzen voraus, dass zu Beginn das verwendete Verfahren<br />

<strong>und</strong> die Anzahl der verwendeten Knoten fest definiert wird. Bei den statischen Replikationsverfahren<br />

wird also mit einer fixen Lese- <strong>und</strong> Schreibquorenmenge gearbeitet. Es ist<br />

nicht möglich während der Laufzeit das gewählte Verfahren <strong>und</strong> die Quorenmengen zu manipulieren.<br />

Die statischen Verfahren lassen sich in zwei Untergruppen unterteilen <strong>und</strong> zwar<br />

in unstrukturierte <strong>und</strong> strukturierte Verfahren.<br />

unstrukturierte Verfahren Bei den unstrukturierten Verfahren besteht die Anzahl der<br />

an dem Replikationsverfahren teilnehmenden Knoten in den Lese- <strong>und</strong> Schreibquoren aus<br />

der von der Strategie vorgegebenen Mindestanzahl an Knoten zur Durchführung einer Operation.<br />

Bei dem Weighted Voting-Verfahren [Gif79] werden die Knoten gewichtet, indem<br />

sie eine individuelle Stimmenzuordnung erhalten. Je nach Zuverlässigkeit der Knoten können<br />

diese durch eine hohe bzw. niedrige Stimmenanzahl entsprechend gewichtet werden.<br />

Es werden eine Vielzahl von Strategien bei den unstrukturierten Verfahren verwendet. Als<br />

Beispiel wird das Read One, Write All-Verfahren [HHB96] betrachtet. Die Beschreibung<br />

der anderen Strategien der unstrukturierten Verfahren ist [HHB96] zu finden.<br />

Read One, Write All-Verfahren<br />

Das Read One, Write All-Verfahren (ROWA) stellt die einfachste Strategie dar. Wie der<br />

Name bereits erkennen lässt, werden Schreiboperationen auf allen Knoten ausgeführt <strong>und</strong><br />

Leseoperationen können auf einem beliebigen Knoten ausgeführt werden. Dabei besteht<br />

die Schreibquorenmenge aus einem Quorum mit allen an dem Replikationsverfahren teilnehmenden<br />

Knoten. Die Lesequorenmenge beinhaltet Quoren mit jeweils einem Knoten.<br />

Leseoperationen können ausgeführt werden, solange mindestens ein Knoten zur Verfügung<br />

steht. Bei den Schreiboperationen führt bereits der Ausfall <strong>eines</strong> Knoten zu einer Blockade<br />

aller Schreiboperationen bis der Ausfall behoben wurde.<br />

Damit trotz ausgefallener Knoten Schreiboperationen ausgeführt werden können, kann das<br />

Read One, Write All Available-Verfahren (ROWAA) [HHB96] verwendet werden. Dieses<br />

Verfahren toleriert bei den Schreiboperationen den Ausfall einzelner Knoten. Gegenüber<br />

dem ROWA-Verfahren werden bei dem ROWAA-Verfahren die Schreiboperationen bei Ausfällen<br />

von Knoten nicht verzögert <strong>und</strong> die Replikate können auf allen verfügbaren Knoten<br />

5


2 Replikation<br />

aktualisiert werden. Das ROWAA-Verfahren toleriert den Ausfall von maximal n-1 Knoten.<br />

Nach der Reparatur <strong>eines</strong> ausgefallenen Knotens besteht die Gefahr, dass ein veraltetes<br />

Datum gelesen werden kann. Um dies zu verhindern, muss nach der Reparatur mit Hilfe<br />

<strong>eines</strong> speziellen Protokolls das Replikat aktualisiert werden.<br />

Des weiteren gibt es noch das Primary Copy ROWA- <strong>und</strong> das True Copy Token ROWA-<br />

Verfahren. Die beiden Varianten werden zum weiteren Verständnis des ROWA-Verfahrens<br />

nicht benötigt <strong>und</strong> werden nicht weiter betrachtet. Nähere Informationen sind in [HHB96]<br />

zu finden.<br />

strukturierte Verfahren Die an dem Replikationsverfahren teilnehmenden Knoten werden<br />

bei den strukturierten Verfahren in einer logischen Struktur angeordnet. Jeder Knoten<br />

ist an einer bestimmten Position der Struktur wiederzufinden. Anhand der Positionen<br />

werden die Lese- <strong>und</strong> Schreibquoren gebildet. Bei den strukturierten Verfahren werden verschiedene<br />

Strategien verwendet. Als Beispiel wird das Grid Protocol-Verfahren [AAC90] betrachtet.<br />

Die Beschreibung der anderen Strategien der strukturierten Verfahren ist [HHB96]<br />

zu finden.<br />

Grid Protocol-Verfahren<br />

Bei dem Grid Protocol-Verfahren (GP-Verfahren) werden die teilnehmenden Knoten logisch<br />

in einem Gitter angeordnet. Das Gitter besteht aus M Zeilen <strong>und</strong> N Spalten. Daraus ergibt<br />

sich ein M × N-Gitter. Alle Stellen des Gitters müssen durch einen Knoten besetzt werden.<br />

Dadurch ist das GP-Verfahren auf Knotenanzahlen beschränkt, die M ∗N entsprechen<br />

müssen. Jeder Knoten in dem Gitter ist mit jedem unmittelbaren Nachbarknoten verb<strong>und</strong>en.<br />

Ein Lesequorum muss jeweils einen Knoten aus jeder Spalte beinhalten (C-Cover).<br />

Eine andere Möglichkeit <strong>für</strong> ein Lesequorum ist alle Knoten aus einer Spalte (CC-Cover)<br />

zu beinhalten. Ein Schreibquorum besteht aus einem C-Cover <strong>und</strong> einem CC-Cover. Dies<br />

stellt sicher, dass sich die Knoten der Lese- <strong>und</strong> Schreibquoren überschneiden. In Abbildung<br />

2.1 wird eine Gitterstruktur mit 12 Knoten gezeigt.<br />

Abbildung 2.1: Eine 4 × 3 Gitterstruktur <strong>für</strong> 12 Knoten<br />

6


2.2 Replikationsverfahren<br />

2.2.2 dynamische Replikationsverfahren<br />

Dynamische Replikationsverfahren können auf das Ausfallen <strong>und</strong> Wiederherstellen von Knoten<br />

reagieren. Die Verfahren müssen an geänderte Knotenzahlen anpassbar sein <strong>und</strong> die<br />

verwendete Strategie auf die neue Knotenanzahl adaptieren können. Dadurch soll eine höhere<br />

Verfügbarkeit erzielt werden.<br />

Nach dem Ausfallen <strong>und</strong> Wiederherstellen von Knoten müssen die dynamische Verfahren<br />

darauf achtet, dass sie die Konsistenz der Daten erhalten. Das Problem besteht darin, dass<br />

nach dem Ausfall einiger Knoten das Verfahren <strong>für</strong> die Anzahl der funktionierenden Knoten<br />

angepasst wird. Bei dem neu angepassten Verfahren können weiterhin Schreiboperationen<br />

durchgeführt werden. Eine bestimmte Menge an ausgefallenen Knoten können nach der Wiederherstellung<br />

ein gültiges Lesequorum ergeben, das sich nicht mit einem Schreibquorum<br />

des angepassten Verfahrens überschneidet. Dadurch kann eine veraltete Version des Datums<br />

gelesen werden.<br />

Beispiel Es sei eine Voting-Struktur mit einem einfachen Mehrheitsverfahren mit sieben<br />

Knoten gegeben. Es fallen die Knoten R1, R2, R3 <strong>und</strong> R4 aus. Wenn die Strategie an die<br />

restlichen Knoten R5, R6 <strong>und</strong> R7 angepasst wird, dann können die Replikate auf diesen<br />

Knoten aktualisiert werden. Bei der Wiederherstellung der Knoten R1, R2, R3 <strong>und</strong> R4 ergeben<br />

diese Knoten ein gültiges Lesequorum <strong>für</strong> die Strategie mit sieben Knoten. Es besteht<br />

die Gefahr, dass dieses Lesequorum ein veraltetes Datum liest, da sich diese Knoten nicht<br />

mit den Knoten R5, R6 <strong>und</strong> R7 überschneiden.<br />

Die Verwendung von Epochen [LR93] vermeidet dieses Problem. Eine Submenge aller an<br />

dem Replikationsverfahren teilnehmender Knoten, die zu einer bestimmten Zeit verfügbar<br />

<strong>und</strong> verb<strong>und</strong>en sind, wird als Epoche bezeichnet. Zur Unterscheidung der Epochen existieren<br />

Epochennummer. Epochennummern sind positive Ganzzahlen, die mit null initialisiert<br />

werden. Wenn durch den Ausfall oder das Wiederherstellen <strong>eines</strong> Knotens das Verfahren angepasst<br />

werden muss, dann erfolgt ein Epochenwechsel, bei dem die Epoche um eins erhöht<br />

wird. Damit ein Epochenwechsel durchgeführt werden kann, wird die Zustimmung der Knoten<br />

<strong>eines</strong> Schreibquorums benötigt. Dieses Schreibquorum muss einem Schreibquorum der<br />

aktuellen <strong>und</strong> der neuen Epoche entsprechen. Die Vereinigungsmenge der beiden Schreibquoren<br />

erhalten dann die neue Strategie <strong>und</strong> Epochennummer. Lese- <strong>und</strong> Schreiboperationen<br />

dürfen nur auf Knoten ausgeführt werden, die die aktuelle Epochennummer besitzen<br />

<strong>und</strong> somit ein Teil der aktuellen Epoche sind. Existiert in einem Quorum ein Knoten, der<br />

eine niedrigere Epochennummer besitzt als die ermittelte aktuelle Epochennummer, dann<br />

wird die Operation gestoppt <strong>und</strong> der Knoten wird aktualisiert. Danach wird die Operation<br />

fortgesetzt.<br />

Die dynamischen Replikationsverfahren arbeiten identisch wie die in Kapitel 2.2.1 erläuterten<br />

statischen Replikationsverfahren. Es werden die statischen Replikationsverfahren durch<br />

die o.g. dynamischen Eigenschaften erweitert <strong>und</strong> werden so zu dynamischen Replikationsverfahren.<br />

7


2 Replikation<br />

2.3 adaptable dynamic General Structure Voting<br />

Das adaptable dynamic General Structure Voting-Verfahren (adGSV -Verfahren) [Sto06]<br />

basiert analog wie das dynamic General Structure Voting-Verfahren (dGSV -Verfahren)<br />

[TS98, TS99] auf Voting-Strukturen [The93] <strong>und</strong> Epochen. Es unterstützt die Verwaltung<br />

einer flexibler Anzahl von Replikaten, da zur Laufzeit neue Knoten zu dem Replikationsverfahren<br />

hinzugefügt werden können oder teilnehmende Knoten entfernt werden können.<br />

Es können Strategiewechsel durchgeführt werden <strong>und</strong> es besteht die Möglichkeit der Nutzung<br />

von inhomogenen Strategien, bei denen <strong>für</strong> jede Knotenanzahl eine andere Strategie<br />

verwendet wird.<br />

Die Voting-Strukturen <strong>und</strong> das Hinzufügen bzw. das Entfernen von Knoten sind zentrale<br />

Punkte des adGSV-Verfahrens. In den folgenden Abschnitten werden diese Punkte kurz<br />

erläutert. Nähere Informationen über das adGSV-Verfahren sind in [Sto06, ST06] zu finden.<br />

Voting-Strukturen Durch das Hinzufügen <strong>und</strong> Entfernen von Knoten ändert sich die<br />

Knotenanzahl. Dem Verfahren muss zu jeder Knotenanzahl eine Voting-Struktur bekannt<br />

sein. Das adGSV-Verfahren arbeitet mit Strukturgeneratoren, um diese Voraussetzung zu<br />

Erfüllen <strong>und</strong> um das Problem zu vermeiden, dass manuell potentiell unendlich viele Voting-<br />

Strukturen erstellt werden müssen. In den Strukturgeneratoren ist die Strategie des Verfahrens<br />

definiert. Für jede Strategie kann es einen Strukturgenerator geben, der vorher<br />

implementiert werden muss. Dieser erzeugt je nach Strategie <strong>für</strong> eine Knotenzahl die jeweilige<br />

Voting-Struktur. Es ist ebenfalls möglich manuell Voting-Strukturen zu erzeugen. Die<br />

Benutzung einer inhomogenen Strategie kann erreicht werden, indem <strong>für</strong> jede Knotenanzahl<br />

eine andere Strategie verwendet werden kann.<br />

Hinzufügen von Knoten Es ist möglich neue Knoten in das Replikationsverfahren zu<br />

integrieren. Hier<strong>für</strong> muss der Knoten zunächst die Replikats- <strong>und</strong> Verfahrensinformationen<br />

erhalten. Der neue Knoten wird in die Menge der am Replikationsverfahren teilnehmenden<br />

Knoten hinzugefügt. Ist die Menge der an dem Replikationsverfahren teilnehmenden Knoten<br />

leer, so wird der neue Knoten als initialer Knoten in die Menge aufgenommen. Ansonsten<br />

führt der neue Knoten eine Aktualisierungsoperation anhand <strong>eines</strong> am Replikationsverfahren<br />

teilnehmenden Knotens durch. Danach startet der neue Knoten einen Epochenwechsel,<br />

bei dem eine neue Voting-Struktur erzeugt wird. Die neu erzeugte Voting-Struktur beinhaltet<br />

den neuen Knoten.<br />

Entfernen von Knoten Zunächst sucht der zu entfernende Knoten aus der Voting-<br />

Struktur, die auf allen Knoten derselben Epoche dieselbe ist, eine Menge an anderen Knoten,<br />

die einem Schreibquorum entsprechen. Von diesen Knoten versucht der zu entfernende<br />

Knoten die Epochen- <strong>und</strong> Versionsnummern zu ermitteln. Wird keine Antwort gesendet,<br />

wird versucht alternative Schreibquoren zu ermitteln, um die Informationen zu erhalten.<br />

Bleiben alle Versuche erfolglos, so wird das Entfernen des Knotens abgebrochen. Bei Erfolg<br />

wird aus dem Schreibquorum die höchste Epochen- <strong>und</strong> Versionsnummer erfragt. Besitzt<br />

der zu entfernende Knoten eine niedrigere Epochen- <strong>und</strong> Versionsnummer, so kann dieser<br />

aus dem Replikationsverfahren entfernt werden. Besitzen Knoten aus dem Schreibquorum<br />

eine kleinere Epochen- <strong>und</strong> Versionsnummer als die ermittelte höchste Epochen- <strong>und</strong> Versionsnummer,<br />

so müssen diese erst anhand des zu entfernenden Knotens aktualisiert werden,<br />

8


2.4 Zusammenfassung<br />

bevor dieser gelöscht werden kann, da der zu entfernende Knoten ein aktuelleres Replikat<br />

besitzt. Zum Entfernen des gewünschten Knotens, initiiert dieser einen Epochenwechsel,<br />

bei dem der zu entfernende Knoten nicht mehr in der neu erzeugten Voting-Struktur vorhanden<br />

ist <strong>und</strong> löscht danach seine lokalen Daten. Wenn kein Epochenwechsel durchgeführt<br />

werden kann, dann wird das Entfernen des Knotens abgebrochen. Falls ein Abbruch statt<br />

gef<strong>und</strong>en hat, versucht der zu entfernende Knoten nach einer gewissen Zeitspanne erneut<br />

sich zu löschen. Dies wird solange probiert bis der Knoten erfolgreich entfernt wurde.<br />

Für das adGSV-Verfahren wurde von Dipl.-Inform. Christian Storm ein Rahmenwerk entwickelt,<br />

in dem die o.g. Konzepte des adGSV-Verfahren implementiert wurden. Es hat die<br />

Durchführbarkeit des Konzepts belegen <strong>und</strong> zu Testzwecken genutzt werden.<br />

2.4 Zusammenfassung<br />

Die Unterschiede zwischen statischen <strong>und</strong> dynamischen Replikationsverfahren liegen in der<br />

Verwaltung der teilnehmenden Knoten. Bei den statische Verfahren müssen am Anfang die<br />

teilnehmenden Knoten festgelegt werden. Die Anzahl der Knoten ist fix <strong>und</strong> kann nicht<br />

geändert werden. Bei Ausfällen von Knoten kann der Zugriff auf die Daten durch die vorgegebene<br />

Strategie nicht mehr gegeben werden. Mit Hilfe der Erweiterung von dynamischen<br />

Eigenschaften, die mit einer dynamischen Anzahl von Knoten arbeiten können, kann diese<br />

Beschränkung aufgehoben werden. Die dynamischen Replikationsverfahren verwenden die<br />

selben Strategien wie die statischen Replikationsverfahren, die durch die Dynamikeigenschaften<br />

erweitert wurden.<br />

Das adGSV-Verfahren als Erweiterung <strong>und</strong> Weiterführung des dSGV-Verfahrens bietet die<br />

Möglichkeit inhomogene Strategien zu verwenden. Replikate können zu dem Replikationsverfahren<br />

hinzugefügt werden oder aus dem Replikationsverfahren entfernt werden. Je nach<br />

Knotenanzahl kann eine andere Strategie verwendet werden. Voting-Strukturen können je<br />

nach Strategie manuell oder durch Strukturgeneratoren <strong>für</strong> die jeweilige Anzahl von Knoten<br />

erstellt werden.<br />

Das folgende Kapitel stellt die Konzeption <strong>eines</strong> Monitordienstes, der als Überwachungsdienst<br />

im adGSV-Rahmenwerk dienen soll, vor. Der Funktionsumfang des adGSV- Rahmenwerks<br />

soll durch den Einsatz des Monitordienstes erweitert werden. Es werden die<br />

Überwachungs- <strong>und</strong> Aktionskomponenten, sowie deren Zusammenarbeit, erläutert.<br />

9


3 Konzeption des Monitordienstes<br />

Der Monitordienst stellt eine Ergänzung des Funktionsumfangs des adGSV-Rahmenwerks<br />

dar. Mit Hilfe von Sensoren <strong>und</strong> Aktoren werden Komponenten zur Verfügung gestellt, die<br />

Aufgaben der Überwachung <strong>und</strong> des Eingreifens in das adGSV-Rahmenwerk übernehmen.<br />

Die dabei anfallendenden Messergebnisse <strong>und</strong> Änderungsmeldungen werden gespeichert <strong>und</strong><br />

protokolliert. Dem Benutzer des Monitordienstes wird die Möglichkeit geboten den Monitordienst<br />

je nach Aufgabenbereich anzupassen <strong>und</strong> zu erweitern. Es können neue Sensoren,<br />

Aktoren, Verknüpfungen <strong>und</strong> Storage-Handler zum persistenten speichern erstellt <strong>und</strong> dem<br />

Monitordienst zugänglich gemacht werden. In diesem Kapitel wird die Konzeption des Monitordienstes<br />

vorgestellt.<br />

Zunächst wird der generelle Aufbau <strong>und</strong> die Funktion des Monitordienst erläutert. Abschnitt<br />

3.2 behandelt die Sensoren <strong>und</strong> Aktoren, die als zentrale Komponenten zur Überwachung<br />

<strong>und</strong> zur Änderung der Konfiguration des adGSV-Rahmenwerks dienen. Der Aufbau, die<br />

Funktion <strong>und</strong> die Verwaltung der logischen Verknüpfung von Sensoren <strong>und</strong> Aktoren wird<br />

in Abschnitt 3.3 beschrieben. Zuletzt wird die Speicherung von Messergebnissen <strong>und</strong> Statusmeldungen<br />

im Monitordienst im Abschnitt 3.4 betrachtet.<br />

3.1 Der Monitordienst<br />

Als Monitordienst wird das gesamte System bezeichnet, das zur Überwachung von Ereignissen<br />

<strong>und</strong> Zuständen des adGSV-Rahmenwerks dient. Für ein solches System werden verschiedene<br />

Komponenten benötigt, die jeweils bestimmte Teilaufgaben bewältigen. Folgende<br />

Komponenten sind <strong>für</strong> den Monitordienst wichtig:<br />

ˆ Die Komponente zur Registrierung von Ereignissen <strong>und</strong> Zuständen (Sensor)<br />

ˆ Die Komponente zum Eingriff bzw. Steuerung auf Gr<strong>und</strong> bestimmter Ereignisse <strong>und</strong><br />

Zustände (Aktor)<br />

ˆ Die Komponente zum Speichern von Ergebnissen <strong>und</strong> Meldungen<br />

ˆ Die Komponenten zur Steuerung <strong>und</strong> Verwaltung des Monitordienstes<br />

Detailliertere Ausführungen zu den jeweiligen Komponenten des Monitordienstes sind in<br />

den nachfolgenden Kapiteln zu finden.<br />

Mit Hilfe der Sensoren überwacht der Monitordienst bestimmte Bereiche des adGSV- Rahmenwerks.<br />

Die Ergebnisse der Überwachung werden gespeichert. Schlägt ein Sensor Alarm,<br />

dann greifen die Aktoren ein. Die Änderungen, die die Aktoren vornehmen werden in Form<br />

einer Meldung gespeichert.<br />

10


3.2 Sensoren <strong>und</strong> Aktoren<br />

Abbildung 3.1: Schema des Monitordienstes<br />

Abbildung 3.1 zeigt eine schematische Darstellung des Monitordienstes. Eine detailliertere<br />

Abbildung des Monitordienstes ist in Form <strong>eines</strong> Klassendiagramms in Kapitel 4 Abbildung<br />

4.1 zu sehen. Der Monitordienst besitzt mehrere Sensoren <strong>und</strong> Aktoren zur Überwachung<br />

<strong>und</strong> zum Ändern bestimmter Bereiche des adGSV-Rahmenwerks. Hierzu kann der Monitordienst<br />

Informationen vom Rahmenwerk abfragen <strong>und</strong> Änderungen durchführen. Die dabei<br />

anfallenden Ergebnisse <strong>und</strong> Meldung werden gespeichert.<br />

Bei der Konzeption des Monitordienstes gibt es einige wichtige Aspekte, die der Monitordienst<br />

genügen soll. Die wichtigsten Aspekte, die verfolgt werden, sind folgende:<br />

ˆ Einfache Integration in den Funktionsumfang des adGSV-Rahmenwerks<br />

ˆ Konfigurierbarkeit<br />

ˆ Hinzufügen <strong>und</strong> Entfernen von Komponenten zur Laufzeit<br />

3.2 Sensoren <strong>und</strong> Aktoren<br />

Mit Hilfe von Sensoren <strong>und</strong> Aktoren soll dem Monitordienst die Möglichkeit gegeben werden<br />

bestimmte Ereignisse <strong>und</strong> Zustände im adGSV-Rahmenwerk zu registrieren <strong>und</strong> darauf zu<br />

reagieren. Durch den Einsatz verschiedener Sensoren <strong>und</strong> Aktoren ist die Überwachungsfunktion<br />

des Monitordienstes nicht nur auf einen bestimmten Teilbereich begrenzt.<br />

In den folgenden Abschnitten werden der Aufbau <strong>und</strong> die Funktion von den Sensoren <strong>und</strong><br />

Aktoren, sowie deren Verwaltung beschrieben.<br />

3.2.1 Aufbau <strong>und</strong> Funktion von Sensoren<br />

Das Prinzip <strong>eines</strong> Sensors im Monitordienst ist äquivalent zu einem Sensor aus der Messtechnik.<br />

In der Messtechnik erfassen Sensoren bestimmte chemische oder physikalische Eigenschaften<br />

entweder quantitativ oder qualitativ. Die Sensoren des Monitordienstes erfassen<br />

bestimmte Eigenschaften im adGSV-Rahmenwerk, wie z.B. den momentanen Status <strong>eines</strong><br />

11


3 Konzeption des Monitordienstes<br />

Knotens. Da die Sensoren des Monitordienstes bei einer Messung das Rahmenwerk ansprechen<br />

<strong>und</strong> nicht angesprochen werden, kann man die Sensoren als aktive Sensoren einstufen.<br />

Der funktionale Arbeitsablauf <strong>eines</strong> Sensors ist immer identisch. In bestimmten Zeitabständen<br />

misst der Sensor in dessen definierten Bereich des adGSV-Rahmenwerks <strong>und</strong> wertet die<br />

Messung aus. Das Messergebnis, sei es positiv oder negativ, wird gespeichert <strong>und</strong> protokolliert.<br />

Fällt ein Messung negativ aus, dann löst der Sensor, den ihm zugeordneten Aktor aus.<br />

Die Verknüpfung zwischen Sensoren <strong>und</strong> Aktoren wird in Kapitel 3.3 behandelt. Danach<br />

beginnt der Ablauf wieder von vorn.<br />

Der Aufbau <strong>eines</strong> Sensors ist immer gleich <strong>und</strong> lässt sich in folgende drei Bereiche aufteilen:<br />

ˆ Initialisierung<br />

ˆ Messen<br />

ˆ Speichern der Messergebnisse<br />

Abbildung 3.2: Einzelne Sensoren werden von der abstrakten Basisklasse Sensor abgeleitet<br />

1 def Measure ( ) :<br />

2 r e p l i c a s = ReplicaManager . G e t R e p l i c a s ( )<br />

3 f o r i t e r a t o r i n r e p l i c a s . v o t i n g s t r u c t u r e . nodes phys :<br />

4 t r y :<br />

5 N e t w o r k i n g C l i e n t . Ping ( n e t r e f e r e n c e = i t e r a t o r . n e t r e f e r e n c e )<br />

6 S a v e R e s u l t ( ”node ”+i t e r a t o r . name+” i s o n l i n e ”)<br />

7 except E x c e p t i o n s . ErrorNet , msg :<br />

8 S a v e R e s u l t ( ”node ”+i t e r a t o r . name+” f a i l e d ”)<br />

9 A c t u a t o r S i g n a l ( )<br />

10<br />

11 def S a v e R e s u l t ( msg ) :<br />

12 s t o r a g e . Write ( l o c a l t i m e ( ) , msg )<br />

Listing 3.1: Pseudocode <strong>für</strong> einen Sensor<br />

Aufgr<strong>und</strong> des identischen Aufbaus jedes Sensors wird eine abstrakte Basisklasse verwendet,<br />

die als Vorlage zur Erstellung konkreter Sensoren dient (siehe Abbildung 3.2). Der strukturelle<br />

Aufbau <strong>eines</strong> Sensors wird von der Basisklasse vorgegeben <strong>und</strong> spezielle Aufgaben<br />

werden in den abgeleiteten Sensoren definiert. Für die Bereiche Messen <strong>und</strong> Speichern von<br />

Messergebnissen der Sensoren existiert jeweils eine Methode. Die Methoden sind Measure()<br />

12


3.2 Sensoren <strong>und</strong> Aktoren<br />

<strong>und</strong> SaveResult(). In diesen beiden Methoden wird das Messen <strong>und</strong> das Speichern von Messergebnissen<br />

<strong>für</strong> den jeweiligen Sensor <strong>und</strong> dessen Aufgabenbereich definiert <strong>und</strong> spezialisiert.<br />

In Listing 3.1 sind die Methoden Measure() <strong>und</strong> SaveResult() <strong>eines</strong> Sensors in Form <strong>eines</strong><br />

Pseudocodes zu sehen. Es ist ein Beispiel <strong>für</strong> einen Sensor, der kontrolliert, ob alle Knoten<br />

einer Votingstruktur online sind. Die Syntax des Pseudocodes ist an Python 1 angelehnt.<br />

Sensoren werden in Form von Threads gestartet. Dies bietet den Vorteil nebenläufiger Abläufe<br />

von Sensoren. Um Fehler zu vermeiden, nutzen die Sensoren Synchronisationskonzepte<br />

(z.B.Locks Locks = Sperren), damit kritische Abschnitte im System geschützt werden. Des<br />

weiteren kann beim Start der Sensoren die Zeitabstände zwischen den einzelnen Messungen<br />

eingestellt werden, indem man die Wartezeit der Threads zwischen den Abläufen bestimmt.<br />

Das Konzept der Sensoren verfolgt eine offene Struktur, das dem Administrator des Monitordienstes<br />

erlaubt jegliche Arten von Messungen, Bedingungen usw. in den einzelnen<br />

Sensoren zu definieren. Somit ist die Überwachungsfunktion des Monitordienstes nicht auf<br />

bestimmte Bereiche oder Aufgaben begrenzt.<br />

3.2.2 Aufbau <strong>und</strong> Funktion von Aktoren<br />

Ursprünglich kommen Aktoren aus der Steuer- <strong>und</strong> Regelungstechnik <strong>und</strong> stellen das Gegenstück<br />

zu den Sensoren dar. Aktoren sind der ausführende Teil, wenn ein Signal von<br />

einem Sensor gesendet wird. Sie wandeln einen bestimmten Stimulus in eine Aktion um.<br />

Die Aktoren von dem Monitordienst dienen dazu bei einem Signal von einem Sensor in das<br />

adGSV-Rahmenwerk einzugreifen <strong>und</strong> es neu zu konfigurieren.<br />

Der funktionale Arbeitsablauf <strong>eines</strong> Aktors ist immer gleich. Wenn bei einer Messung <strong>eines</strong><br />

Sensors ein per Definition abweichendes Ergebnis festgestellt wird, wird der zugehörige<br />

Aktor durch ein Signal aktiviert. Die Verknüpfung zwischen Sensoren <strong>und</strong> Aktoren wird<br />

in Kapitel 3.3 behandelt. Der Aktor führt die definierten Änderung in dem Rahmenwerk<br />

durch <strong>und</strong> speichert danach eine Statusmeldung zur Protokollierung. Nach der Ausführung<br />

des Aktors wartet dieser auf das nächste Signal <strong>eines</strong> Sensors<br />

Der Aufbau <strong>eines</strong> Aktors ist immer identisch <strong>und</strong> lässt sich in folgende drei Bereiche aufteilen:<br />

ˆ Initialisierung<br />

ˆ Durchführung der Änderungen<br />

ˆ Speichern der Statusmeldung<br />

Genauso wie bei den Sensoren wird bei den Aktoren ebenfalls eine abstrakte Basisklasse als<br />

Vorlage zur Erstellung einzelner Aktoren verwendet (siehe Abbildung 3.3), da der Aufbau<br />

der Aktoren immer identisch ist. Die Basisklasse der Aktoren bestimmt den strukturellen<br />

Aufbau. Die jeweiligen Änderungen, die ein Aktor durchführt, werden in den abgeleiteten<br />

Aktoren definiert. Es existiert jeweils eine Methode <strong>für</strong> das Ausführen von Änderungen<br />

1 Python http://www.python.org[07.2006]<br />

13


3 Konzeption des Monitordienstes<br />

Abbildung 3.3: Einzelne Aktoren werden von der abstrakten Basisklasse Aktor abgeleitet<br />

<strong>und</strong> das Speichern von Statusmeldungen. Die Methoden sind Reconfigure() <strong>und</strong> SaveReport().<br />

In diesen beiden Methoden wird die durchzuführende Änderung <strong>und</strong> das Speichern<br />

der Statusmeldung <strong>für</strong> den jeweiligen Aktor definiert <strong>und</strong> spezialisiert. In Listing 3.2 sind<br />

die Methoden Reconfigure() <strong>und</strong> SaveReport() <strong>eines</strong> Aktors in Form <strong>eines</strong> Pseudocodes zu<br />

sehen. Das Beispiel zeigt einen Aktor, der einen Epochenwechsel einer Votingstruktur initialisiert.<br />

1 def R e c o n f i g u r e ( ) :<br />

2 r e p l i c a s = ReplicaManager . G e t R e p l i c a s ( )<br />

3 r e p l i c a s [ 0 ] . EpochChange ( )<br />

4 SaveReport ( ”epoch changed ”)<br />

5<br />

6 def SaveReport ( s e l f , msg ) :<br />

7 s t o r a g e . Write ( l o c a l t i m e ( ) , msg )<br />

Listing 3.2: Pseudocode <strong>für</strong> einen Aktor<br />

Das Konzept der Aktoren verfolgt ebenfalls, wie das Konzept der Sensoren, eine offene<br />

Struktur. So ist es dem Administrator des Monitordienstes möglich nötige Änderungen,<br />

die aufgr<strong>und</strong> <strong>eines</strong> Messergebnisses in dem Rahmenwerk vorgenommen werden müssen, in<br />

den einzelnen Aktoren zu definieren. Das Eingreifen <strong>und</strong> das Ändern der Konfiguration des<br />

Monitordienstes ist dadurch nicht auf bestimmte Bereiche oder Aufgaben begrenzt.<br />

3.2.3 Verwaltung von Sensoren <strong>und</strong> Aktoren<br />

Der Monitordienst bietet die Möglichkeit mit mehreren Sensoren <strong>und</strong> Aktoren zu arbeiten.<br />

Dadurch ist es nicht zwingend notwendig verschiedene Messbereiche <strong>und</strong> Änderungen in<br />

einem Sensor <strong>und</strong> Aktor zu definieren. Verschiedene Aufgabenbereiche können feingranular<br />

auf verschiedene Sensoren <strong>und</strong> Aktoren verteilt werden. Um die einzelnen Sensoren <strong>und</strong><br />

Aktoren verwalten zu können, wird eine zentrale Komponente benötigt, die diese Aufgabe<br />

übernimmt.<br />

Im Monitordienst existieren zwei zentrale Komponenten zur Verwaltung der Sensoren <strong>und</strong><br />

Aktoren. Der Sensor Manager <strong>und</strong> der Actuator Manager übernehmen jeweils Typ spezifisch<br />

die Verwaltung der einzelnen Sensoren <strong>und</strong> Aktoren. Hier<strong>für</strong> stellen die Manager<br />

verschiedene Methoden zur Verfügung. Die zentrale Struktur zur Verwaltung der Sensoren<br />

<strong>und</strong> Aktoren ist ein Sensor- <strong>und</strong> ein Aktorregister, in denen alle dem Monitordienst zur<br />

14


3.2 Sensoren <strong>und</strong> Aktoren<br />

Abbildung 3.4: Das Register des Sensor Managers<br />

Abbildung 3.5: Das Register des Aktor Managers<br />

15


3 Konzeption des Monitordienstes<br />

Verfügung stehenden Sensoren <strong>und</strong> Aktoren registriert sind (siehe Abbildung 3.4 <strong>und</strong> 3.5).<br />

Die Indizierung der jeweiligen Sensoren <strong>und</strong> Aktoren erfolgt über deren Namen <strong>und</strong> bietet<br />

so einen leichten Zugriff. Dabei wird darauf geachtet, dass zwei verschiedene Sensoren oder<br />

Aktoren nicht den selben Namen besitzen dürfen.<br />

Das Hinzufügen <strong>und</strong> das Entfernen von Sensoren <strong>und</strong> Aktoren funktioniert nach dem Plugin-<br />

Prinzip. Plugin bedeutet, dass Ergänzungs- bzw. Zusatzmodule dynamisch zur Laufzeit<br />

ohne besonderen Aufwand zu einer Software hinzugefügt werden können <strong>und</strong> somit den<br />

Funktionsumfang erweitern. Bei dem Monitordienst sind die von der Basisklasse abgeleiteten<br />

Sensoren <strong>und</strong> Aktoren die Zusatzmodule, die den Umfang der Überwachungs- <strong>und</strong><br />

Steuerungsfunktion ergänzen bzw. erweitern. Dadurch werden die verschiedenen Funktionen<br />

der Überwachung <strong>und</strong> Steuerung definiert <strong>und</strong> ermöglicht. Es ist möglich Sensoren <strong>und</strong><br />

Aktoren dynamisch zur Laufzeit in das Register des Sensor bzw. Aktor Managers zu laden<br />

oder zu entfernen. Hier<strong>für</strong> stehen drei Varianten zur Verfügung.<br />

Plugin-Verzeichnis Alle Sensoren <strong>und</strong> Aktoren werden in einem bestimmten Verzeichnis<br />

abgelegt. Der Sensor bzw. Aktor Manager erhält den Verzeichnispfad <strong>und</strong> lädt alle sich<br />

dort befindenden Plugins in das Sensor bzw. Aktorregister. Dies wird bei jedem Start des<br />

Monitordienstes einmal ausgeführt. Wenn ein weiterer Sensor oder Aktor im Verzeichnis<br />

abgelegt wurde, kann diese Methode jederzeit wiederholt werden <strong>und</strong> so wird das neue Plugin<br />

in das Sensor- oder Aktorregister geladen. Bereits registrierte Sensoren <strong>und</strong> Aktoren<br />

werden dabei nicht doppelt in das Register geladen.<br />

Manuelles Laden Es besteht die Möglichkeit gezielt einzelne Sensoren oder Aktoren<br />

manuell in das Sensor- oder Aktorregister zu laden. Hierbei ist es nicht zwingend notwendig,<br />

dass sich der neue Sensor oder Aktor im Plugin-Verzeichnis befindet. Der Sensor bzw.<br />

Aktor Manager erhält die Pfadangabe <strong>und</strong> den Namen des Plugins als Übergabeparameter<br />

<strong>und</strong> lädt dieses dann einzeln in das Sensor- bzw. Aktorregister.<br />

Manuelles Entfernen Es besteht die Möglichkeit einzelne Sensoren oder Aktoren manuell<br />

aus dem Sensor- oder Aktorregister zu entfernen. Hier<strong>für</strong> benötigt der Manager lediglich<br />

den Namen des Plugins, um dieses aus dem Register zu löschen. Hierbei wird das Plugin<br />

nur aus dem Register des Managers entfernt. Das Plugin wird nicht physikalisch auf der<br />

Festplatte gelöscht. Nach dem Löschen <strong>eines</strong> Sensors oder Aktors werden die Verknüpfungen<br />

aktualisiert, damit es zu keinem Fehler kommt. Weitere Dinge müssen bei dem Entfernen<br />

nicht beachtet werden.<br />

3.3 Logik-Strukturen<br />

In den vorherigen Kapiteln wurde die Funktion <strong>und</strong> der Aufbau von Sensoren <strong>und</strong> Aktoren<br />

erläutert. Damit die Sensoren <strong>und</strong> Aktoren sinnvoll zusammenarbeiten, ist ein Konstrukt<br />

nötig, das die einzelnen Sensoren <strong>und</strong> Aktoren miteinander verknüpft (siehe Abbildung 3.6).<br />

Die Verknüpfungen zwischen Sensoren <strong>und</strong> Aktoren werden als Logik-Strukturen bezeichnet.<br />

Diese Logik-Strukturen stellen die elementare Komponente <strong>für</strong> die Zusammenarbeit<br />

der Sensoren <strong>und</strong> der Aktoren des Monitordienstes dar.<br />

16


3.3 Logik-Strukturen<br />

Abbildung 3.6: Logik-Struktur als Verknüpfung zwischen Sensoren <strong>und</strong> Aktoren<br />

In den folgenden Abschnitten wird der Aufbau <strong>und</strong> die Funktion von Logik-Strukturen,<br />

sowie deren Verwaltung beschrieben.<br />

3.3.1 Aufbau <strong>und</strong> Funktion von Logik-Strukturen<br />

Logik-Strukturen ermöglichen gezielte Verknüpfungen zwischen Sensoren <strong>und</strong> Aktoren. Per<br />

Definition wird einem Sensor ein bzw. mehrere Aktoren zugewiesen, die der Sensor im Falle<br />

einer Messsituation ansteuern soll. Logik-Strukturen sind Graphen, in denen Wurzelknoten<br />

(Sensoren), Kanten <strong>und</strong> Blattknoten (Aktoren) definiert werden. In den folgenden Abschnitten<br />

werden die Basisübergänge, sowie deren formale Darstellung der Logik-Strukturen<br />

beschrieben.<br />

Gr<strong>und</strong>legendes Zunächst werden die Mengen der Sensoren <strong>und</strong> Aktoren definiert.<br />

Sensors = {S 1 , S 2 , . . . , S n } wobei n ∈ N \ {0}<br />

Actuators = {A 1 , A 2 , . . . , A n } wobei n ∈ N \ {0}<br />

Weiter bedeuten:<br />

↦→ : schaltet<br />

0 bedeutet bei Sensoren: Sensor gibt kein Signal<br />

0 bedeutet bei Aktoren: Aktor wird nicht ausgeführt<br />

1 bedeutet bei Sensoren: Sensor gibt ein Signal<br />

1 bedeutet bei Aktoren: Aktor wird ausgeführt<br />

1:1-Beziehung Die 1:1-Beziehung bedeutet, dass nur ein Sensor mit einem Aktor verknüpft<br />

ist. Dies ist die minimalste Beziehung, die zwischen Sensoren <strong>und</strong> Aktoren bestehen<br />

kann. Abbildung 3.7 zeigt eine 1:1-Beziehung zwischen dem Sensor S 1 <strong>und</strong> dem Aktor A 1 .<br />

Formal betrachtet, sieht eine 1:1-Beziehung folgendermaßen aus:<br />

S i ↦→ A j : i, j ∈ N \ {0} <strong>und</strong> S i ∈ Sensors <strong>und</strong> A j ∈ Actuators<br />

Folgende Tabelle zeigt das Verhalten der Sensoren <strong>und</strong> Aktoren bei einer 1:1 Beziehung:<br />

Ereignis Resultat<br />

S i = 0 A j = 0<br />

S i = 1 A j = 1<br />

17


3 Konzeption des Monitordienstes<br />

Abbildung 3.7: 1:1-Beziehung zwischen einem Sensor <strong>und</strong> Aktor<br />

1:n-Beziehung Die 1:n-Beziehung bedeutet, dass ein Sensor mit mehreren Aktoren verknüpft<br />

ist. Dabei löst der Sensor, wenn er ein Signal sendet, alle mit ihm verknüpften<br />

Aktoren aus. In Abbildung 3.8 ist eine 1:n-Beziehung zwischen dem Sensor S 1 <strong>und</strong> den<br />

Aktoren A 1 <strong>und</strong> A 2 zu sehen.<br />

Abbildung 3.8: 1:n-Beziehung zwischen einem Sensor <strong>und</strong> zwei Aktoren<br />

Formal betrachtet, sieht eine 1:n-Beziehung folgendermaßen aus:<br />

S i ↦→ A 1 ∧ · · · ∧ A k : i, j, k ∈ N \ {0} <strong>und</strong> S i ∈ Sensors <strong>und</strong> A 1 , . . . , A k ∈ Actuators<br />

Folgende Tabelle zeigt das Verhalten der Sensoren <strong>und</strong> Aktoren bei einer 1:n Beziehung:<br />

Ereignis Resultat<br />

S i = 0 A 1 , . . . , A k = 0<br />

S i = 1 A 1 , . . . , A k = 1<br />

n:1-Beziehung Die n:1-Beziehung bedeutet, dass mehrere Sensoren mit einem Aktor verknüpft<br />

sind. Dabei kann jeder einzelne Sensor diesen Aktor auslösen. Abbildung 3.9 zeigt<br />

eine n:1-Beziehung zwischen den Sensor S 1 <strong>und</strong> S 2 <strong>und</strong> dem Aktor A 1 .<br />

Formal betrachtet, sieht eine n:1-Beziehung folgendermaßen aus:<br />

S 1 ∨ · · · ∨ S j ↦→ A k : i, j, k ∈ N \ {0} <strong>und</strong> S 1 , . . . , S j ∈ Sensors <strong>und</strong> A j ∈ Actuators<br />

18


3.3 Logik-Strukturen<br />

Abbildung 3.9: n:1-Beziehung zwischen zwei Sensoren <strong>und</strong> einem Aktor<br />

Folgende Tabelle zeigt das Verhalten der Sensoren <strong>und</strong> Aktoren bei einer n:1 Beziehung:<br />

Ereignis<br />

Resultat<br />

S 1 , . . . , S j = 0 A k = 0<br />

∃S = 1 : S ∈ {S 1 , . . . , S j } A k = 1<br />

Übergänge zwischen Sensoren oder zwischen Aktoren werden nicht betrachtet, da die Strukturen<br />

ansonsten zu komplex <strong>und</strong> unübersichtlich werden. Die offene Struktur zur Definition<br />

von Sensoren <strong>und</strong> Aktoren bietet trotzdem die Möglichkeit Beschränkungen durch die Logik-<br />

Strukturen zu kompensieren.<br />

Beispiel Anstatt zwei Aktoren zu definieren, die nacheinander ausgeführt werden sollen,<br />

indem sie eine 1:1 -Beziehung zwischen Aktoren besitzen, kann ein komplexerer Aktor definiert<br />

werden, der die Aufgaben beider Aktoren übernimmt <strong>und</strong> nacheinander ausführt.<br />

In Abbildung 3.10 ist das Syntaxdiagramm <strong>für</strong> die formale Darstellung von Logik-Strukturen<br />

zu sehen. Es zeigt, welche Logik-Strukturen sich durch die Basisübergängen bilden lassen.<br />

Der Monitordienst bietet eine Komponente, in der die Logik-Strukturen erfasst werden.<br />

In dieser Komponente werden die erstellten Logik-Strukturen gespeichert <strong>und</strong> es werden<br />

die Verknüpfungen zwischen den Sensoren im Sensor Manager <strong>und</strong> den Aktoren im Actuator<br />

Manager hergestellt. Wenn ein Sensor ein per Definition abweichendes Messergebnis<br />

erfasst, sendet dieser ein Signal an den Logik-Struktur-Dispatcher, der die verschiedenen<br />

Logik-Strukturen verwaltet (siehe Kapitel 3.3.2). Die Logik-Struktur kennt die Verknüpfungen<br />

zwischen den signalisierenden Sensor <strong>und</strong> die Aktoren, die dieser Sensor auslösen<br />

möchte. Die passenden Aktoren werden dann von der Logik-Struktur aktiviert.<br />

Logik-Strukturen können entweder manuell eingegeben werden oder aus Konfigurationsdateien<br />

geladen werden. Für die Definition von Logik-Strukturen müssen jeweils die Wurzel<strong>und</strong><br />

Blattknoten der Struktur gesetzt werden. Als Beschreibungssprache zur Definition von<br />

Logik-Strukturen in einer Konfigurationsdatei bietet sich die Dot-Beschreibungssprache von<br />

GraphViz 2 an. In dieser Beschreibungssprache lassen sich einfach Graphen definieren, was<br />

die Erstellung von Logik-Strukturen vereinfacht. Das folgende Listing zeigt eine Konfigura-<br />

2 GraphViz http://www.graphviz.org[08.2006]<br />

19


3 Konzeption des Monitordienstes<br />

Abbildung 3.10: Syntax der gesamten Logik-Struktur<br />

tionsdatei im Dot-Format <strong>für</strong> eine Logik-Struktur mit drei Sensoren <strong>und</strong> zwei Aktoren.<br />

1 d i g r a p h ”L o g i c S t r u c t u r e ” {<br />

2<br />

3 S1−>A1 ;<br />

4 S1−>A2 ;<br />

5 S2−>A2 ;<br />

6 S3−>A2 ;<br />

7 }<br />

Listing 3.3: Definition einer Logik-Struktur<br />

Aus dem oben gezeigten Listing resultiert eine Logik-Struktur, dessen Graphen in Abbildung<br />

3.11 zu sehen ist.<br />

Abbildung 3.11: Der resultierende Graph aus der Logik-Struktur<br />

Der Sensor S1 besitzt eine 1:n-Beziehung zu den Aktoren A1 <strong>und</strong> A2. Die Sensoren S2<br />

<strong>und</strong> S3 besitzen jeweils eine 1:1 -Beziehung zu dem Aktor A2. Wenn der Sensor S1 ein per<br />

20


3.3 Logik-Strukturen<br />

Definition abweichendes Messergebnis erfasst, dann steuert dieser die Aktoren A1 <strong>und</strong> A2<br />

an.<br />

3.3.2 Verwaltung von Logik-Strukturen<br />

Logik-Strukturen können bei einer hohen Anzahl von Sensoren <strong>und</strong> Aktoren schnell zu<br />

komplex <strong>und</strong> unübersichtlich werden. Um diesem Problem entgegen zu wirken, besteht die<br />

Möglichkeit mehrere Logik-Strukturen zu definieren. So können z.B. die Verknüpfungen<br />

zwischen Sensoren <strong>und</strong> Aktoren in verschiedenen Logik-Strukturen gruppiert werden. Die<br />

verschiedene Logik-Strukturen werden im Monitordienst mit Hilfe einer zentralen Komponente<br />

(Dispatcher) verwaltet. Die hier<strong>für</strong> verwendete Struktur im Dispatcher ist ein ein<br />

Logik-Struktur-Register, in dem alle erstellten Logik-Strukturen vorliegen (siehe Abbildung<br />

3.11). Die einzelnen Logik-Strukturen werden in dem Logik-Struktur-Register mit ihren Name<br />

indiziert, was einen leichten Zugriff ermöglicht. Dabei wird darauf geachtet, dass zwei<br />

verschiedene Logik-Strukturen nicht den selben Namen besitzen dürfen.<br />

Abbildung 3.12: Das Register des Dispatchers<br />

Der Dispatcher deckt verschiedene Aufgabenbereiche zur Verwaltung der Logik-Strukturen<br />

ab. In den folgenden Abschnitten werden diese Aufgabenbereiche beschrieben.<br />

Hinzufügen von Logik-Strukturen Dem Benutzer des Monitordienstes wird die Möglichkeit<br />

gegeben Logik-Strukturen manuell zu erstellen <strong>und</strong> in das Logik-Struktur-Register<br />

abzulegen. Die komfortablere Lösung ist das Definieren von Logik-Strukturen per Konfigurationsdateien.<br />

Der Dispatcher benötigt lediglich die Pfadangabe zur Konfigurationsdatei<br />

<strong>und</strong> kann die sich darin befindende Logik-Struktur in das Logik-Struktur-Register laden.<br />

Es ähnelt dem in Kapitel 3.2.3 beschriebenden Plugin-Konzept.<br />

21


3 Konzeption des Monitordienstes<br />

Entfernen von Logik-Strukturen Registrierte Logik-Strukturen können auch wieder<br />

entfernt werden. Hier<strong>für</strong> benötigt der Dispatcher lediglich den Namen der Logik-Struktur,<br />

um diese aus dem Logik-Struktur-Register zu löschen. Hierbei muss jedoch vom Benutzer<br />

beachtet werden, dass alle Sensoren <strong>und</strong> Aktoren der zu entfernenden Logik-Struktur nicht<br />

mehr aktiv sein dürfen oder aus dem Monitordienst gelöscht wurden. Da durch das Löschen<br />

einer Logik-Struktur einzelne Verknüpfungen zwischen Sensoren <strong>und</strong> Aktoren nicht dem<br />

System nicht mehr bekannt sind, kann es zu Fehlern kommen.<br />

Aktualisieren der Logik-Strukturen Falls Sensoren aus dem Sensorregister des Sensor<br />

Managers oder Aktoren aus dem Aktorregister des Aktor Managers gelöscht wurden,<br />

müssen die Logik-Strukturen angepasst werden. Verknüpfungen zu gelöschten Sensoren <strong>und</strong><br />

Aktoren müssen entfernt werden, da es ansonsten zu Fehlern im Ablauf des Monitordienstes<br />

kommen kann, weil die gelöschten Sensoren <strong>und</strong> Aktoren nicht mehr aufgerufen werden<br />

können.<br />

Weiterleiten der Sensor-Signale Da der Monitordienst mit mehreren Logik-Strukturen<br />

arbeitet, die in dem Dispatcher verwaltet werden, können die Sensoren ihre Signale nicht<br />

direkt an die Logik-Struktur senden, sondern müssen den Dispatcher kontaktieren. Der Dispatcher<br />

empfängt die Signale der Sensoren <strong>und</strong> leitet sie an die jeweiligen Logik-Strukturen<br />

weiter. Hier<strong>für</strong> erfasst der Dispatcher in welchen Logik-Strukturen der signalisierende Sensor<br />

auftritt <strong>und</strong> leitet das Signal an diese Logik-Strukturen weiter.<br />

3.4 Persistentes Speichern von Ergebnissen<br />

Ein weiterer wichtiger Bereich des Monitordienstes ist das persistente Speichern von Messergebnissen<br />

<strong>und</strong> Statusmeldungen. Dies dient als Protokollierung des Überwachungsablaufs.<br />

Durch die gespeicherten Messergebnisse, die die Sensoren liefern, können Erfahrungswerte<br />

<strong>für</strong> das Debugging <strong>und</strong> die Optimierung des adGSV-Rahmenwerks gewonnen werden. Das<br />

Speichern der Statusmeldungen der Aktoren dient zur Nachvollziehbarkeit der vorgenommenen<br />

Änderungen im Rahmenwerk. Zum Speichern dieser Daten eignen sich verschiedene<br />

Speichermöglichkeiten wie z.B. Datenbanken oder Dateien. Im weiteren Verlauf werden als<br />

Speichermöglichkeit Datenbanken betrachtet, da der Monitordienst Datenbanken zum persistenten<br />

Speichern von Daten nutzt.<br />

Der folgende Abschnitt beschreibt den Aufbau <strong>und</strong> die Funktion der Komponente im Monitordienst,<br />

die <strong>für</strong> das persistente Speichern von Daten zuständig ist.<br />

3.4.1 Aufbau <strong>und</strong> Funktion des Storage-Handlers<br />

Der Storage-Handler stellt die Schnittstelle zwischen den Sensoren bzw. Aktoren <strong>und</strong> der<br />

Datenbank dar. Die Sensoren bzw. Aktoren haben Zugriff auf den Storage-Handler <strong>und</strong><br />

können so die Messergebnisse bzw. die Statusmeldungen in einer Datenbank speichern. Im<br />

Monitordienst wird die Möglichkeit geboten verschiedene Storage-Handler zu nutzen, um<br />

die Auswahl der Speichermöglichkeiten nicht zu beschränken.<br />

Es existiert eine abstrakte Basisklasse des Storage-Handlers, die als Vorlage <strong>für</strong> weitere<br />

Storage-Handler dienen soll. Die Basisklasse gibt den strukturellen Aufbau der Storage-<br />

22


3.4 Persistentes Speichern von Ergebnissen<br />

Handler vor. In den abgeleiteten Storage-Handlern kann der Zugriff auf verschiedene Speichermöglichkeiten<br />

definiert werden. Das folgende Listing zeigt den strukturellen Aufbau der<br />

Basisklasse des Storage-Handlers in Form <strong>eines</strong> Pseudocodes.<br />

1 c l a s s S t o r a g e H a n d l e r ( ) :<br />

2 def C r e a t e ( storagename , a r e a=None , i t e m s=None ) :<br />

3 pass<br />

4<br />

5 def D e l e t e ( storagename , a r e a=None , i t e m s=None ) :<br />

6 pass<br />

7<br />

8 def C l e a r ( storagename , a r e a=None ) :<br />

9 pass<br />

10<br />

11 def Read ( storagename , a r e a=None , item=None , c o n d i t i o n=None ) :<br />

12 pass<br />

13<br />

14 def Write ( storagename , v a l u e s , a r e a=None ) :<br />

15 pass<br />

Listing 3.4: Pseudocode der Storage-Handler Basisklasse<br />

In den folgenden Abschnitten wird der strukturelle Aufbau der abstrakten Basisklasse des<br />

Storage-Handlers beschrieben.<br />

Create Im Create Bereich können <strong>für</strong> die gewählte Möglichkeit zur Speicherung die spezifischen<br />

Abläufe zum Erstellen <strong>eines</strong> Objektes zur Speicherung definiert werden. Bei einer<br />

Datenbank muss im Create Bereich das Erstellen einer Tabelle definiert werden.<br />

Delete Im Delete Bereich können <strong>für</strong> die gewählte Möglichkeit zur Speicherung die spezifischen<br />

Abläufe zum Löschen <strong>eines</strong> Objektes zur Speicherung oder zum Löschen bestimmter<br />

Datensätze definiert werden. Bei einer Datenbank muss im Delete Bereich das Löschen einer<br />

Tabelle oder das Löschen <strong>eines</strong> bestimmten Datensatzes der Tabelle definiert werden.<br />

Clear Im Clear Bereich können <strong>für</strong> die gewählte Möglichkeit zur Speicherung die spezifischen<br />

Abläufe zum Löschen der Datensätze definiert werden. Bei einer Datenbank muss im<br />

Clear Bereich das Löschen aller Datensätze einer Tabelle definiert werden.<br />

Read Im Read Bereich können <strong>für</strong> die gewählte Möglichkeit zur Speicherung die spezifischen<br />

Abläufe zum Lesen der Datensätze definiert werden. Bei einer Datenbank muss im<br />

Read Bereich das Lesen der Datensätze aus einer Tabelle definiert werden.<br />

Write Im Write Bereich können <strong>für</strong> die gewählte Möglichkeit zur Speicherung die spezifischen<br />

Abläufe zum Schreiben von Datensätzen definiert werden. Bei einer Datenbank muss<br />

im Write Bereich das Schreiben von Datensätzen in eine Tabelle definiert werden.<br />

23


3 Konzeption des Monitordienstes<br />

3.5 Zusammenfassung<br />

Die Komponenten des Monitordienstes verfolgen eine offene Struktur, die es dem Benutzer<br />

ermöglicht den Monitordienst anzupassen <strong>und</strong> zu erweitern. Neue Sensoren <strong>und</strong> Aktoren<br />

können erstellt werden <strong>und</strong> in den Monitordienst geladen werden. Das Plugin-Prinzip erlaubt<br />

es das Hinzufügen <strong>und</strong> Entfernen von Sensoren <strong>und</strong> Aktoren dynamisch zur Laufzeit<br />

vorzunehmen. Mit Hilfe der Logik-Strukturen werden die Verknüpfungen zwischen den<br />

Sensoren <strong>und</strong> Aktoren definiert <strong>und</strong> sorgen da<strong>für</strong>, dass die Sensoren die richtigen Aktoren<br />

ansprechen <strong>und</strong> auslösen. Das Erstellen neuer Storage-Handler ermöglicht dem Benutzer<br />

eine freie Auswahl der Speicherobjekte, in denen die Messergebnisse <strong>und</strong> Statusmeldungen<br />

gespeichert werden sollen.<br />

Im folgenden Kapitel wird die <strong>Implementierung</strong>, sowie die verwendeten Technologien, des<br />

Monitordienstes vorgestellt.<br />

24


4 Architektur <strong>und</strong> Realisierung des Monitordienstes<br />

Die im vorigen Kapitel beschriebenen Ideen zum Aufbau <strong>und</strong> zur Funktion des Monitordienstes<br />

wurden implementiert, um den Monitordienst als Überwachungskomponente in das<br />

adGSV-Rahmenwerk zu integrieren.<br />

Im nächsten Abschnitt werden die verwendeten Technologien beschrieben <strong>und</strong> Entscheidung<br />

zu der jeweiligen Wahl der Technologien begründet. Die Konzeption <strong>und</strong> der <strong>Entwurf</strong> des<br />

Monitordienstes wird im Abschnitt 4.2 beschrieben. Abschnitt 4.3 befasst sich mit Erweiterungen<br />

des Monitordienstes, die aus zeitlichen Gründen nicht mehr vorgenommen werden<br />

konnten.<br />

4.1 Technologien<br />

Für die <strong>Implementierung</strong> des Monitordienstes fiel die Wahl der Programmiersprache auf<br />

Python. Die genutzte Version ist Python 2.4.1. Verschiedene Gründe sprachen <strong>für</strong> die Nutzung<br />

von Python. Der Monitordienst dient als Erweiterung des adGSV-Rahmenwerks, das<br />

ebenfalls in Python implementiert ist. Durch die Verwendung der selben Programmiersprache<br />

können unnötige Schnittstellen-Klassen zwischen zwei verschiedenen Programmiersprachen<br />

<strong>und</strong> Inkompatibilitäten vermieden werden. Des weiteren ist Python eine leicht zu<br />

erlernende Programmiersprache mit einer simplen Syntax. Viele Konstrukte, sowie Funktionen<br />

darauf, die in anderen Sprachen implementiert werden müssen, sind in Python bereits<br />

integriert. Der Funktionsumfang von Python ist leicht durch das Installieren weiterer Bibliotheken<br />

erweiterbar.<br />

Um Ergebnisse <strong>und</strong> Meldungen des Monitordienstes zu speichern, wird eine Datenbank<br />

verwendet. Die Vorteile einer Datenbank gegenüber einer Textdatei liegen in der persistenten<br />

<strong>und</strong> effizienten Verwaltung von Daten, sowie der einfache Zugriff auf die Daten.<br />

Als Datenbanksystem kommt SQLite 1 zum Einsatz. SQLite speichert die Datenbanken in<br />

Form von Dateien, sodass Server-Applikationen nicht notwendig sind. Für die Integration<br />

von SQLite in Python steht eine Schnittstelle in Form einer nachinstallierbaren Bibliothek<br />

zur Verfügung. Die verwendete Schnittstelle ist die von Gerhard Häring entwickelte PyS-<br />

QLite 2 -API in der Version 2.3.2. PySQLite entspricht weitestgehend den SQL-92 3 Standard.<br />

Der Monitordienst soll über ein Netzwerk entfernt administrierbar sein <strong>und</strong> mit den Knoten<br />

im adGSV-Rahmenwerk kommunizieren. Die Kommunikation der Knoten im Rahmenwerk<br />

wird mit der Kommunikationsbibliothek Common Object Request Broker Architecture<br />

(CORBA) realisiert. Der Monitordienst nutzt ebenfalls CORBA, um die Kommunikation zu<br />

gewährleisten. Die Object Management Group (OMG) 4 hat die Spezifikation von CORBA<br />

1 SQLite http://www.sqlite.org [08.2006]<br />

2 PySQLite http://initd.org/tracker/pysqlite [08.2006]<br />

3 SQL-92 Standard http://www.contrib.andrew.cmu.edu/ shadow/sql/sql1992.txt [09.2006]<br />

4 OMG http://www.omg.org [07.2006]<br />

25


4 Architektur <strong>und</strong> Realisierung des Monitordienstes<br />

definiert. Der Monitordienst verwendet, wie das adGSV Rahmenwerk, als CORBA-ORB<br />

omniORB 5 in der Version 4.0.6, sowie omniORBpy, als Python-Anbindung, in der Version<br />

2.6.<br />

4.2 Konzept, <strong>Entwurf</strong> <strong>und</strong> Komponenten<br />

Der Monitordienst soll folgenden Anforderungen entsprechen:<br />

ˆ modularer Aufbau <strong>und</strong> leichte Erweiterbarkeit<br />

ˆ Es soll die Möglichkeit bestehen, einfach neue Sensoren <strong>und</strong> Aktoren zu erstellen<br />

<strong>und</strong> dem Monitordienst hinzuzufügen.<br />

ˆ Das einfache Hinzufügen neuer Storage-Handler soll die Möglichkeit bieten Daten<br />

z.B. in Datenbanken, in Textdateien, etc. persistent abspeichern zu können.<br />

ˆ Rekonfiguration zur Laufzeit<br />

ˆ Sensoren sollen zur Laufzeit hinzugefügt oder entfernt werden können.<br />

ˆ Aktoren sollen hinzugefügt oder entfernt werden können.<br />

ˆ Logikstrukturen sollen dem Monitordienst hinzugefügt oder daraus entfernt werden<br />

können.<br />

Die Entwicklung der strukturierten Architektur des Monitordienstes wurde mit Hilfe der<br />

OMG Unified Modelling Language 6 <strong>und</strong> den von Erich Gamma, Richard Helm, Ralph Johnson<br />

<strong>und</strong> John Vlissides beschriebenen <strong>Entwurf</strong>smustern[GHJV94], sowie den Python <strong>Entwurf</strong>smustern<br />

[Sav97], vorgenommen. Die <strong>Entwurf</strong>smuster, die als Leitfaden zur Entwicklung<br />

von strukturierten Softwarearchitekturen dienen, sind in drei Bereiche aufgeteilt. In den<br />

Erzeugungsmustern werden verschiedene Arten der Erzeugung von Objekten beschrieben.<br />

Aus diesem Teilbereich der <strong>Entwurf</strong>smustern kommen <strong>für</strong> den Monitordienst die Singleton<strong>und</strong><br />

Abstract-Factory-<strong>Entwurf</strong>smustern zur Anwendung. Bei dem Singleton-<strong>Entwurf</strong>smuster<br />

wird sicher gestellt, dass nur eine Instanz von einer Klasse erstellt wird, auf die global zugegriffen<br />

werden kann. Das Factory-<strong>Entwurf</strong>smuster erzeugt Objekte <strong>eines</strong> bestimmten Typs,<br />

die eine spezialisierte Form dieses Typs darstellen. In dem zweiten Teilbereich der <strong>Entwurf</strong>smuster,<br />

den Strukturmustern, werden Vorschläge zur Komposition von Klassen gegeben. Das<br />

Facade-<strong>Entwurf</strong>smuster ist ein Teil der Strukturmuster <strong>und</strong> findet ebenfalls Anwendung im<br />

Monitordienst. Es dient zur Definition von einheitlichen <strong>und</strong> einfachen Schnittstellen zu<br />

den Schnittstellen <strong>eines</strong> Subsystems. Die Verhaltensmuster sind der letzte Bereich der <strong>Entwurf</strong>smuster<br />

<strong>und</strong> behandeln die Dynamik, Interaktion <strong>und</strong> Kommunikation der Objekte<br />

untereinander.<br />

Im Verlauf dieses Kapitels werden die Klassen des Monitordienstes vorgestellt. Dabei wird<br />

nur der konzeptionelle Aspekt betrachtet. Weiterführende Informationen <strong>und</strong> Details sind<br />

in der API-Dokumentation des Monitordienstes zu finden.<br />

5 omniORB http://omniORB.sourceforge.net [07.2006]<br />

6 OMG UMLhttp://www.uml.org[07.2006]<br />

26


4.2 Konzept, <strong>Entwurf</strong> <strong>und</strong> Komponenten<br />

Abbildung 4.1: Klassendiagramm des Monitordienstes<br />

27


4 Architektur <strong>und</strong> Realisierung des Monitordienstes<br />

Das Klassendiagramm in Abbildung 4.1 zeigt eine Übersicht über die Komponenten des<br />

Monitordienstes <strong>und</strong> deren Zusammenhang. Nur konzeptionell wichtige Methoden <strong>und</strong> Attribute<br />

werden dargestellt, um die Übersichtlichkeit des Klassendiagramms zu bewahren.<br />

MonitorController Die MonitorController-Klasse ist die zentrale Schnittstelle<br />

zur Verwaltung des Monitordienstes. Die Komponenten ActuatorManager, Sensor-<br />

Manager, StorageHandler <strong>und</strong> SensorActuatorLogicDispatcher können über<br />

den Monitor Controller angesteuert werden. Durch die StartSensoring()-Methode werden<br />

per Übergabeparameter ausgewählte Sensoren gestartet. Des weiteren besteht die Möglichkeit<br />

alle im SensorManager registrierten Sensoren zu starten. Analog zu der StartSensoring()-Methode<br />

werden bei der StopSensoring()-Methode per Übergabeparameter entweder<br />

bestimmte oder alle laufende Sensoren angehalten.<br />

1 def Measure ( s e l f ) :<br />

2 t r y :<br />

3 s e l f . g l o b a l l o c k . a c q u i r e ( )<br />

4 s e l f . l o c a l t i m e = l o c a l t i m e ( )<br />

5 s e l f . t i m e = s t r f t i m e ( ”%c ” , s e l f . l o c a l t i m e )<br />

6 f a i l e d n o d e s = [ ]<br />

7 f a i l e d g r o u p = [ ]<br />

8 f a i l e d r e p l i c a s = [ ]<br />

9 i n f o = [ ]<br />

10 groups = s e l f . rpm . GetGroups ( )<br />

11 f o r group i n groups :<br />

12 r e p l i c a s = s e l f . rpm . G e t R e p l i c a s ( group )<br />

13 f o r i t e r a t o r i n r e p l i c a s [ 0 ] . v s d i s p a t c h e r . v o t i n g s t r u c t u r e .<br />

nodes phys :<br />

14 t r y :<br />

15 N e t w o r k i n g C l i e n t . Ping ( n e t r e f e r e n c e=i t e r a t o r . n e t r e f e r e n c e )<br />

16 s e l f . S a v e R e s u l t ( ”node ”+i t e r a t o r . name+” i s o n l i n e ”)<br />

17 except E x c e p t i o n s . ErrorNet , msg :<br />

18 f a i l e d n o d e s += [ i t e r a t o r ]<br />

19 f a i l e d r e p l i c a s +=[ i t e r a t o r . name ]<br />

20 i t e r a t o r . f a i l e d = True<br />

21 i f not group i n i n f o :<br />

22 f a i l e d g r o u p . append ( group )<br />

23 s e l f . S a v e R e s u l t ( ”node ”+i t e r a t o r . name+” f a i l e d ”)<br />

24 i n f o = [ f a i l e d g r o u p , f a i l e d r e p l i c a s ]<br />

25 i f l e n ( f a i l e d n o d e s ) > 0 :<br />

26 t r y :<br />

27 s e l f . l o g d i s p . PushMessage ( s e l f . name , i n f o )<br />

28 s e l f . l o g d i s p . S e n s o r S i g n a l ( s e l f . name )<br />

29 except ( E x c e p t i o n s . ErrorBusy , E x c e p t i o n s . ErrorNoQuorum ,<br />

E x c e p t i o n s . E r r o r I m p o s s i b l e ) :<br />

30 s y s . e x i t ( 1 )<br />

31 f i n a l l y :<br />

32 s e l f . g l o b a l l o c k . r e l e a s e ( )<br />

33<br />

34 def S a v e R e s u l t ( s e l f , msg ) :<br />

35 s e l f . s t o r a g e . Write ( ”/home/ monitor . db ” , ” ’ ”+s e l f . t i m e+” ’ , ’ ”+msg+” ’ ” ,<br />

”SensorEPOCH ”)<br />

Listing 4.1: Sensor <strong>für</strong> den Epochenwechsel<br />

28


4.2 Konzept, <strong>Entwurf</strong> <strong>und</strong> Komponenten<br />

Sensor Die abstrakte Basisklasse Sensor dient als Vorlage zur <strong>Implementierung</strong> von<br />

Sensoren. Um einen neuen Sensor zu definieren, müssen die Methoden Measure() <strong>und</strong> SaveResult()<br />

von der abgeleiteten Klasse implementiert werden. In der Methode Measure()<br />

müssen <strong>für</strong> die jeweilige Aufgabe des Sensors die Messbereiche, Zeitfaktoren usw. definiert<br />

<strong>und</strong> implementiert werden. Um die Messergebnisse zu speichern, muss in der SaveResult()-<br />

Methode der gewünschte Storage-Handler angesprochen werden.<br />

Das Listing 4.1 zeigt die Methoden Measure() <strong>und</strong> SaveResult() der SensorEPOCH-<br />

Klasse. Die Measure()-Methode des Sensors testet, ob die Knoten der Voting Strukturen<br />

online sind oder nicht. Die SaveResult()-Methode speichert das Ergebnis in der Datenbank.<br />

Zunächst werden alle registrierten Voting Strukturen mit der Methode GetGroups() in Zeile<br />

10 ermittelt. In den Zeilen 12 <strong>und</strong> 13 werden alle zu den Voting Strukturen gehörenden<br />

Replikate, sowie deren Knoten ermittelt. Mit der Methode Ping() in Zeile 15 wird getestet,<br />

ob die Knoten online oder offline sind. Die fehlgeschlagene Knoten werden in den Zeilen<br />

18 bis 22 registriert. Falls fehlgeschlagene Knoten registriert wurden, wird der zum SensorEPOCH<br />

zugehörige Aktor durch ein Signal mit der Methode SensorSignal() in Zeile<br />

28 aktiviert. Die Funktion SaveResult() in den Zeilen 34 <strong>und</strong> 35 speichert das übergebene<br />

Messergebnis in der Datenbank.<br />

1 def R e c o n f i g u r e ( s e l f ) :<br />

2 t r y :<br />

3 s e l f . g l o b a l l o c k . a c q u i r e ( )<br />

4 s e l f . t i m e = s t r f t i m e ( ”%c ” , l o c a l t i m e ( ) )<br />

5 i n f o = s e l f . l o g d i s p . PullMessage ( ”EPOCH”)<br />

6 f a i l e d g r o u p s = i n f o [ 0 ]<br />

7 f a i l e d n o d e s = i n f o [ 1 ]<br />

8 s e e k i n d e x = True<br />

9 i n d e x = 0<br />

10 f o r group i n f a i l e d g r o u p s :<br />

11 r e p l i c a s = s e l f . rpm . G e t R e p l i c a s ( group )<br />

12 while s e e k i n d e x == True :<br />

13 i f i n d e x == l e n ( r e p l i c a s ) :<br />

14 r a i s e E x c e p t i o n s . E r r o r I m p o s s i b l e , ” a l l nodes i n group ’% s ’<br />

a r e f a i l e d n o d e s . can ’ t do epoch change . ” % group<br />

15 i f r e p l i c a s [ i n d e x ] . name i n f a i l e d n o d e s : i n d e x += 1<br />

16 e l s e : s e e k i n d e x = F a l s e<br />

17 t r y :<br />

18 r e p l i c a s [ i n d e x ] . EpochChange ( )<br />

19 s e l f . SaveReport ( ”group ”+group+”: epoch changed ”)<br />

20 except ( E x c e p t i o n s . ErrorBusy , E x c e p t i o n s . ErrorNoQuorum ,<br />

E x c e p t i o n s . E r r o r I m p o s s i b l e ) :<br />

21 s e l f . SaveReport ( ”group ”+group+”: epoch change f a i l e d ”)<br />

22 s y s . e x i t ( 1 )<br />

23 f i n a l l y :<br />

24 s e l f . g l o b a l l o c k . r e l e a s e ( )<br />

25 def SaveReport ( s e l f , msg ) :<br />

26 s e l f . s t o r a g e . Write ( ”/home/ monitor . db ” , ” ’ ”+s e l f . t i m e+” ’ , ’ ”+<br />

msg+” ’ ” , ”ActuatorEPOCH ”)<br />

Listing 4.2: Aktor <strong>für</strong> den Epochenwechsel<br />

29


4 Architektur <strong>und</strong> Realisierung des Monitordienstes<br />

Actuator Die abstrakte Basisklasse Actuator dient als Vorlage zur <strong>Implementierung</strong><br />

von Aktoren. Um einen neuen Aktor zu definieren, müssen die Methoden Reconfigure() <strong>und</strong><br />

SaveReport() von der abgeleiteten Klasse implementiert werden. In der Methode Reconfigure()<br />

müssen <strong>für</strong> die jeweilige Aufgabe des Aktors die Änderungen, die der Aktor durchführen<br />

soll, definiert <strong>und</strong> implementiert werden. Um die Statusmeldungen zu speichern, muss in<br />

der SaveReport()-Methode der gewünschte Storage-Handler angesprochen werden.<br />

Das Listing 4.2 zeigt die Methoden Reconfigure() <strong>und</strong> SaveReport() der ActuatorE-<br />

POCH-Klasse, die, falls der zugehörige Sensor fehlgeschlagene Knoten registriert hat, einen<br />

Epochenwechsel initialisiert. Die Reconfigure()-Methode des Aktors führt alle da<strong>für</strong> notwendigen<br />

Operationen durch. Die SaveReport()-Methode speichert eine Meldung in der Datenbank,<br />

ob der Epochenwechsel erfolgreich war oder nicht.<br />

Als erstes werden die Informationen zu den fehlgeschlagenen Knoten geholt (Zeile 6 bis 8).<br />

Danach werden die Knoten einer betroffenden Voting Struktur mit der Methode GetReplicas()<br />

ermittelt. Es wird ein Abgleich gemacht, welches Replikat zum Initialisieren <strong>eines</strong><br />

Epochenwechsels geeignet ist (Zeile 13 bis 17). Die Methode EpochChange() in Zeile 19 initialisiert<br />

den Epochenwechsel. Die Funktion SaveReport() in den Zeilen 27 <strong>und</strong> 28 speichert<br />

die übergebene Statusmeldung in der Datenbank.<br />

SensorManager <strong>und</strong> ActuatorManager Die Sensor- <strong>und</strong> Actuator-Instanzen werden<br />

in der SensorManager- <strong>und</strong> ActuatorManager-Klasse verwaltet. Das Hinzufügen<br />

neuer Sensoren <strong>und</strong> Aktoren bzw. das Entfernen registrierter Sensoren <strong>und</strong> Aktoren<br />

wird in Form <strong>eines</strong> Plugin-Mechanismus realisiert. Zur Laufzeit können mittels der Load()-<br />

Methode neue Sensoren <strong>und</strong> Aktoren bei dem jeweiligen Manager registriert werden <strong>und</strong><br />

mittels der Unload()-Methode können geladene Sensoren <strong>und</strong> Aktoren entfernt werden. Die<br />

SensorManager- <strong>und</strong> ActuatorManager-Klasse besitzen jeweils ein Sensor- <strong>und</strong> ein<br />

Aktorregister, in dem die zur Verfügung stehenden Sensoren bzw. Aktoren aufgelistet sind.<br />

SensorActuatorLogic Die Klasse SensorActuatorLogic repräsentiert die Beziehungen<br />

zwischen Sensoren <strong>und</strong> Aktoren. Hier<strong>für</strong> werden die Namen der Sensoren <strong>und</strong> der<br />

Aktoren, die zu einer Logikstruktur gehören, sowie deren Verknüpfungen zueinander, in der<br />

SensorActuatorLogic gespeichert. Mit der AddEdge()-Methode wird eine neue Verknüpfung<br />

zwischen einem Sensor <strong>und</strong> einem Aktor zu der Logik-Struktur in der SensorActuatorLogic<br />

hinzugefügt. Die Signal()-Methode ermittelt zu dem per Übergabeparameter<br />

gegebenen Sensor die passenden Aktoren in der Logik-Struktur.<br />

SensorActuatorLogicDispatcher Zur Verwaltung der Logikstrukturen wird die SensorActuatorLogicDispatcher-Klasse<br />

verwendet. Diese Klasse besitzt ein Logikstruktur-<br />

Register, in dem alle SensorActuatorLogic-Instanzen aufgelistet sind. Wenn ein Sensor<br />

einen Aktor triggern will, dann muss der Sensor die SensorSignal()-Methode aufrufen. Der<br />

Dispatcher ermittelt daraufhin, ob es zu dem Sensor eine Logikstruktur gibt.<br />

Die Load()-Methode ermöglicht das Laden von Logikstrukturen. Hier<strong>für</strong> wird eine SensorActuatorLogic-Instanz<br />

erzeugt, in der die zu Logikstruktur gehörenden Sensoren<br />

<strong>und</strong> Aktoren, sowie deren Verknüpfungen zueinander, gespeichert werden. Die neu erstellte<br />

SensorActuatorLogic-Instanz wird danach in dem Logikstruktur-Register von der<br />

30


4.2 Konzept, <strong>Entwurf</strong> <strong>und</strong> Komponenten<br />

SensorActuatorLogicDispatcher-Instanz registriert. Das eigentliche Laden der Logikstrukturen<br />

wird von der Load()-Methode an spezielle, <strong>für</strong> ein bestimmtes Datenformat<br />

angelegte Methoden weitergeleitet. Im Monitordienst wurde exemplarisch die Unterstützung<br />

der DOT -Beschreibungssprache implementiert. Es können weitere Format spezifische<br />

Load-Methoden implementiert werden, um diverse Dateiformate zu unterstützen. Alle unterstützen<br />

Formate müssen in types definiert werden.<br />

Das folgende Listing zeigt die Definition <strong>und</strong> Syntax einer Logikstruktur mit vier Sensoren<br />

<strong>und</strong> drei Aktoren.<br />

1 d i g r a p h ”L o g i c S t r u c t u r e 1 ” {<br />

2<br />

3 UPTIME−>CHANGE;<br />

4 PING−>CHANGE;<br />

5 FAILURE−>CHANGE;<br />

6 FAILURE−>NEWSTRUCTURE;<br />

7 EPOCH−>EPOCH;<br />

8 }<br />

Listing 4.3: Definition einer Logikstruktur<br />

In der Zeile 1 ist das Schlüsselwort digraph <strong>und</strong> der Name der Logikstruktur zu finden.<br />

Danach folgt eine öffnende geschweifte Klammer, die den Definitionsteil einleitet. Um eine<br />

Relation zwischen einem Sensor <strong>und</strong> einem Aktor zu definieren, muss auf der linken Seite<br />

des Pfeils der Name des Sensors <strong>und</strong> auf der rechte Seite des Pfeils der Name des Aktors,<br />

der von dem Sensor ausgelöst werden soll, notiert werden. In den Zeilen 3 bis 7 sind mehrere<br />

Relationen zwischen Sensoren <strong>und</strong> Aktoren zu sehen. Die schließende geschweifte Klammer<br />

in Zeile 8 schließt den Definitionsteil ab.<br />

In der LogicStructure1 werden die Verknüpfungen zwischen den Sensoren UPTIME, PING,<br />

FAILURE, EPOCH <strong>und</strong> den Aktoren CHANGE, NEWSTRUCTURE, EPOCH definiert.<br />

Es repräsentiert einen Graphen mit den Sensoren als Wurzelknoten, den Pfeilen als Übergänge<br />

<strong>und</strong> den Aktoren als Blattknoten. Zeile 3 in dem Listing 4.3 definiert, dass der Sensor<br />

UPTIME den Aktor CHANGE auslösen soll. In den Zeilen 4 bis 7 des Listings werden analog<br />

die weiteren Übergänge zwischen den Sensoren <strong>und</strong> Aktoren definiert. Die Sensoren<br />

UPTIME, PING, FAILURE <strong>und</strong> der Aktor CHANGE bilden eine n:1 -Beziehung. Die Verknüpfungen<br />

in Zeile 6 <strong>und</strong> 7 sind jeweils 1:1 -Beziehungen.<br />

StorageHandler <strong>und</strong> StorageSQL Die StorageHandler-Klasse ist eine abstrakte<br />

Basisklasse, die die Vorlage <strong>für</strong> verschiedene Storage-Handler definiert. Von der StorageHandler<br />

abgeleitete Klassen müssen die Methoden Create(), Delete(), Read(), Write()<br />

<strong>und</strong> Clear() <strong>für</strong> den jeweiligen Speichertyp implementieren. Diese Methoden dienen zum Erzeugen<br />

<strong>und</strong> Löschen der Dateien zur Speicherung, sowie zum Lesen, Schreiben <strong>und</strong> Löschen<br />

von Daten. Die Klasse StorageSQL ist von der StorageHandler-Klasse abgeleitet <strong>und</strong><br />

implementiert die Verwendung einer Datenbank zum persistenten Speichern von Messergebnissen<br />

<strong>und</strong> Statusmeldungen. Die verwendete Datenbankabfragesprache ist SQLite, die bei<br />

dem Monitordienst im Zusammenhang mit Python mit Hilfe der PySQLite-API benutzt<br />

wird.<br />

31


4 Architektur <strong>und</strong> Realisierung des Monitordienstes<br />

NetworkingClient <strong>und</strong> NetworkingServer NetworkingClient <strong>und</strong> NetworkingServer<br />

sind Klassen zur Kapselung der CORBA-Anbindung des adGSV- Rahmenwerks.<br />

Für die Kommunikation zwischen dem Monitordienst <strong>und</strong> dem adGSV-Rahmenwerk<br />

werden Methoden benutzt, die in beiden Klassen implementiert sind. Des weiteren sind in<br />

NetworkingClient <strong>und</strong> NetworkingServer Methoden implementiert, um den Monitordienst<br />

in einem Netzwerk entfernt zu administrieren.<br />

4.3 Erweiterungen<br />

In den nachfolgenden Abschnitten werden Erweiterungen des Monitordienstes vorgestellt,<br />

die im zeitlichen Rahmen dieser Arbeit nicht mehr realisiert wurden.<br />

Asynchrones Triggern von Logikstrukturen Zur Zeit arbeitet der SensorActuatorLogicDispatcher<br />

Signale von Sensoren synchron ab. Es werden nacheinander alle<br />

registrierten Logik-Strukturen nach dem Sensor, der ein Signal gesendet hat, durchsucht.<br />

Bei einem Suchtreffer wird das Signal an die ermittelte Logik-Struktur weitergeleitet. Erst<br />

wenn die Logik-Struktur das Signal verarbeitet hat, kann der SensorActuatorLogic-<br />

Dispatcher nach weiteren Strukturen suchen. Durch das Ändern der Arbeitsweise des<br />

SensorActuatorLogicDispatchers, indem z.B. die Logikstrukturen als Threads implementiert<br />

werden, könnte eventuell eine Performance-Verbesserung erreicht werden.<br />

Auswertung von Messergebnissen Auf Basis gegebener Informationen zu Replikationsverfahren<br />

(z.B. in einer Datenbank) könnten die Messergebnisse der Sensoren automatisch<br />

ausgewertet werden <strong>und</strong> in Form einer Hilfestellung zur Konfiguration dem Benutzer<br />

des adGSV-Rahmenwerks zur Verfügung gestellt werden. So könnte der Benutzer anhand<br />

der aus den Messergebnissen erstellten Konfigurationsvorschlägen das adGSV-Rahmenwerk<br />

schnell <strong>und</strong> einfach neu konfigurieren. Die mühsame Auswertung der protokollierten Messergebnisse<br />

müsste nicht vom Benutzer selber durchgeführt werden.<br />

4.4 Zusammenfassung<br />

Um eine einfache Integration <strong>und</strong> hohe Kompatibilität des Monitordienstes zum adGSV-<br />

Rahmenwerk zu gewährleisten, mussten einige konzeptionelle Vorgaben des Rahmenwerks<br />

beachtet werden. Der Monitordienst entspricht den geforderten Aspekten <strong>und</strong> somit wurde<br />

das Ziel, den Monitordienst als Überwachungskomponente in das adGSV-Rahmenwerk<br />

zu integrieren, erreicht. Die Konzeption als modulare Architektur sorgt <strong>für</strong> eine einfache<br />

Erweiterbarkeit, Wartung <strong>und</strong> Austausch des Monitordienstes.<br />

32


5 Zusammenfassung <strong>und</strong> Ausblick<br />

Replikationstechniken verfolgen das Ziel eine höhere Verfügbarkeit von Daten zu gewährleisten.<br />

Um dieses Ziel zu erreichen werden verschiedene Replikationsstrategien verwendet. Es<br />

wird zwischen zwei verschiedenen Arten von Replikationsverfahren unterschieden. Es gibt<br />

statische <strong>und</strong> dynamische Replikationsverfahren. Bei den statischen Replikationsverfahren<br />

muss am Anfang die Anzahl der teilnehmenden Knoten definiert werden. Diese Anzahl ist fix<br />

<strong>und</strong> darf nicht verändert werden. Statische Verfahren können nicht auf Veränderungen der<br />

Knotenanzahl reagieren <strong>und</strong> so kann es passieren, dass der Zugriff auf das Datum nicht mehr<br />

gewährleistet werden kann. Dynamische Replikationsverfahren erweitern die statischen Verfahren<br />

durch Dynamikeigenschaften. Auf Ausfälle oder das Hinzufügen von Knoten können<br />

die dynamischen Verfahren reagieren <strong>und</strong> passen die Strategie des Replikationsverfahrens<br />

an.<br />

Ein weiteres Verfahren, was mehr Flexibilität bietet, ist das von Dipl.-Inform. Christian<br />

Storm entwickelte adaptable dynamic General Structure Voting-Verfahren. Das adGSV-<br />

Verfahren basiert wie das dGSV-Verfahren auf die Verwendung von Voting-Strukturen <strong>und</strong><br />

Epochen. Durch die Möglichkeit zur Laufzeit Replikate in eine Voting-Struktur zu integrieren<br />

oder aus einer Voting-Struktur zu entfernen, bietet das adGSV-Verfahren eine flexible<br />

Verwaltung von Replikaten. Des weiteren können inhomogene Strategien verwendet werden,<br />

in dem je nach Knotenanzahl eine andere Strategie verwendet wird.<br />

Der in dieser Arbeit vorgestellte Monitordienst bietet die Möglichkeit das adGSV- Rahmenwerk<br />

durch Sensoren zu überwachen <strong>und</strong> bei Ereignissen durch Aktoren einzugreifen.<br />

Es können neue Sensoren <strong>und</strong> Aktoren implementiert <strong>und</strong> dem Monitordienst zur Verfügung<br />

gestellt werden. Die offene Struktur dieser Komponenten bietet dabei dem Benutzer<br />

jegliche Form von Überwachungs- <strong>und</strong> Steuerungsaufgaben in den Sensoren <strong>und</strong> Aktoren<br />

zu definieren. Zudem können auch die logischen Verknüpfungen zwischen den Sensoren <strong>und</strong><br />

Aktoren angepasst <strong>und</strong> erweitert werden. Messergebnisse <strong>und</strong> Statusmeldungen lassen sich<br />

in der Datenbank persistent abspeichern <strong>und</strong> werden somit protokolliert.<br />

Die Optimierung der Performance, sowie das Auswerten der Messergebnisse, konnte nicht<br />

mehr realisiert werden <strong>und</strong> bleibt Gegenstand weiterer Arbeiten.<br />

33


Literaturverzeichnis<br />

[AAC90] Ammar, Mostafa H. ; Ahamad, Mustaque ; Cheung, Shun Y.: The Grid Protocol:<br />

A High Performance Scheme for Maintaining Replicated Data. In: Proceedings<br />

of the 16th Very Large Data Bases Conference (VLDB’90), 1990, S. 243–254<br />

[AE92] Agrawal, D. ; El Abbadi, A.: The Generalized Tree Quorum Protocol: An Efficient<br />

Approach for Managing Replicated Data. In: ACM Transactions on Database<br />

Systems 17, 1992, S. 689–717<br />

[BHG87] Bernstein, Philip A. ; Hadzilacos, Vassos ; Goodman, Nathan: Concurrency<br />

Control and Recovery in Database Systems. Addison-Wesley, 1987<br />

[GB85] Garcia-Molina, Hector ; Barbara, Daniel: How to Assign Votes in a Distributed<br />

System. In: Journal of the ACM 32, 1985, S. 841–860<br />

[GHJV94] Gamma, Erich ; Helm, Richard ; Johnson, Ralph ; Vlissides, John: Design<br />

Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, 1994<br />

[Gif79] Gifford, D. K.: Weighted Voting for Replicated Data. In: Proceedings of the 7th<br />

Symposium on Operating Systems Principles (SOSP’79) Bd. 13, 1979, S. 150–161<br />

[HHB96] Helal, Abdelsalam A. ; Heddaya, Abdelsalam A. ; Bhargava, Bharat B.:<br />

Replication Techniques in Distributed Systems. Kluwer Academic Press, 1996<br />

[Lae91] Laeuchli, P.: Algorithmische Graphentheorie. Birkhaeuser, 1991<br />

[LR93] Lazowska, Edward D. ; Rabinovich, Michael: Asynchronous Epoch Management<br />

in Replicated Databases. In: Proceedings of the International Workshop on<br />

Distributed Algorithms (WDAG’93), 1993, S. 115–128<br />

[Lun01] L<strong>und</strong>h, Fredrik: Python Standard Library. O’Reilly & Associates, Inc., 2001<br />

[Mar03] Martelli, A.: Python in a Nutshell. O’Reilly & Associates, Inc., 2003<br />

[MN92] Mizuno, Masaaki ; Neilsen, Mitchell L.:<br />

Quorum Structures. 1992<br />

Measures of Node Importance for<br />

[NS96] Naegler, G. ; Stopp, F.: Graphen <strong>und</strong> Anwendungen. Teubner, 1996<br />

[Sav97] Savikko, Vespe: Design Patters in Python. In: Proceedings of the 6th International<br />

Python Conference, 1997<br />

[Sch01] Schöning, Uwe: Theoretische Informatik — kurzgefaßt. Spektrum Akademischer<br />

Verlag GmbH, 2001<br />

[Ske81] Skeen, Dale: Non-Blocking Commit Protocols. In: Proceedings of the ACM SIG-<br />

MOD Conference, 1981<br />

34


Literaturverzeichnis<br />

[SS83] Schlichting, R. D. ; Schneider, F. B.: Fail-Stop Processors: An Approach to<br />

Designing Fault-Tolerant Computer Systems. 1983. – 222–238 S.<br />

[ST06] Storm, Christian ; Theel, Oliver: Highly Adaptable Dynamic Quorum Schemes<br />

for Managing Replicated Data. In: Proceedings of the 1st International Conference<br />

on Availability, Reliability and Security (ARES’06) IEEE Computer Society, IEEE<br />

Computer Society Press, April 2006, S. 245–253<br />

[Sto06] Storm, Christian: Konzeption <strong>und</strong> <strong>Implementierung</strong> <strong>eines</strong> Rahmenwerkes <strong>für</strong><br />

adaptiv-dynamische Replikationsstrategien. Carl von Ossietzky Universität Oldenburg,<br />

Department <strong>für</strong> Informatik / Systemsoftware <strong>und</strong> Verteilte Systeme, Diplomarbeit,<br />

2006. – Diplomarbeit<br />

[The93] Theel, Oliver: General Structured Voting: A Flexible Framework for Modelling<br />

Cooperations. In: Proceedings of the 13th International Conference on Distributed<br />

Computing Systems (ICDCS’93) IEEE Computer Society, 1993, S. 227–236<br />

[TS98] Theel, Oliver ; Strauss, Thomas: Automatic Generation of Dynamic Coteriebased<br />

Replication Schemes. University of Darmstadt, Department of Computer<br />

Science, Institute for System Architecture, Diplomarbeit, 1998. – Forschungsbericht<br />

[TS99] Theel, Oliver ; Strauss, Thomas: An Excursion to the Zoo of Dynamic Coteriebased<br />

Replication Schemes. In: Proceedings of the 28th International Conference<br />

on Parallel Processing (ICPP’99), 1999, S. 344–352<br />

35


A Handbuch<br />

Das Handbuch dient als Hilfestellung zur Benutzung des Monitordienstes. Es bietet eine<br />

kurze Beschreibung der Funktionen des Monitordienstes. Detailliertere Informationen können<br />

in der API-Dokumentation des Monitordienstes nachgeschlagen werden.<br />

In dem folgenden Kapitel wird erklärt, wie der Monitordienst installiert werden kann. Danach<br />

werden in Kapitel A.2 die ersten Schritte, wie das Starten des Systems, gezeigt. Die<br />

Kapitel A.3, A.4 <strong>und</strong> A.5 erläutern alle wichtigen Funktionen, wie das Erstellen, Hinzufügen<br />

<strong>und</strong> Entfernen, von Sensoren, Aktoren <strong>und</strong> Logik-Strukturen. Der Funktionsumfang<br />

des Storage-Handlers wird in Kapitel A.6 beschrieben. Zuletzt wird in Kapitel A.7 erklärt<br />

wie man bestimmte Informationen von dem Monitordienst abfragen kann.<br />

A.1 Installation<br />

Die Anweisungen der Installation beziehen sich auf Linux. Um den Monitordienst nutzen<br />

zu können, muss zunächst das adGSV-Rahmenwerk installiert werden. Informationen zu<br />

der Installation des Rahmenwerks sind den Installationsanweisungen der Dokumentation<br />

des Rahmenwerks zu entnehmen. Der Monitordienst basiert auf den selben Systemvoraussetzung<br />

wie das adGSV-Rahmenwerk. Es muss zusätzlich nur noch die Python Bibliothek<br />

PySQLite 1 in der Version 2.3.2 installiert werden. Der Monitordienst kann in einem beliebigen<br />

Verzeichnis abgelegt werden. Am besten jedoch ist es den Monitordienst im adGSV-<br />

Rahmenwerk Verzeichnis abzulegen.<br />

$RIPLEYDIR/monitor<br />

Danach muss der Monitordienst nur noch zu der Umgebungsvariable PYTHONPATH hinzugefügt<br />

werden <strong>und</strong> dann ist die Installation abgeschlossen.<br />

export PYTHONPATH=$PYTHONPATH:$MONITORPATH<br />

A.2 Erste Schritte<br />

Dieses Kapitel beschreibt die ersten Schritte, die getätigt werden müssen, um das adGSV-<br />

Rahmenwerk <strong>und</strong> danach den Monitordienst zu starten.<br />

A.2.1 adGSV-Rahmenwerk starten<br />

Damit das adGSV-Rahmenwerk gestartet werden kann, muss zunächst omniORB 2 , was<br />

als CORBA-ORB dient, gestartet werden. Der da<strong>für</strong> zuständige Befehl lautet omniNames<br />

1 PySQLite http://initd.org/tracker/pysqlite [08.2006]<br />

2 omniORB http://omniORB.sourceforge.net [07.2006]<br />

36


A.3 Sensoren<br />

-start. Danach kann mit dem Befehl python Ripley.py das adGSV-Rahmenwerk gestartet<br />

werden <strong>und</strong> man gelangt in den Konsolenmodus.<br />

A.2.2 Monitordienst starten<br />

Wenn man sich auf der Konsole des adGSV-Rahmenwerk befindet, kann man den Monitordienst<br />

starten. Als erstes muss die Server-Seite des Monitordienst mit dem Befehl<br />

start monitor server gestartet werden. Wenn dies geschehen ist, kann man auf einem beliebigen<br />

Rechner im Netzwerk die Client-Seite des Monitordienstes starten. Dies wird mit<br />

dem Befehl start monitor client getan. Nun kann man den Monitordienst vom Client aus<br />

Steuern.<br />

A.3 Sensoren<br />

Sensoren sind die Komponenten des Monitordienstes, die zur Überwachung des adGSV-<br />

Rahmenwerks dienen. Die folgenden Kapitel beschreiben wie neue Sensoren erstellt <strong>und</strong><br />

dem Monitordienst hinzugefügt werden können. Des weiteren wird erläutert wie im Monitordienst<br />

registrierte Sensoren entfernt werden können <strong>und</strong> wie Sensoren gestartet <strong>und</strong><br />

gestoppt werden.<br />

A.3.1 Erstellen <strong>eines</strong> neuen Sensors<br />

Für die Erstellung <strong>eines</strong> neuen Sensors muss von der abstrakten Basisklasse eine weitere<br />

Klasse abgeleitet werden. Danach kann die abgeleitete Klasse je nach Aufgabenbereich<br />

angepasst werden. Im Init-Bereich können benötigte Variablen <strong>und</strong> Attribute initialisiert<br />

werden. Sobald dies getan wurde, kommt der wichtigste Punkt der Anpassung des neuen<br />

Sensors. In der Methode Measure() müssen alle notwendigen Funktionen implementiert <strong>und</strong><br />

aufgerufen werden, die <strong>für</strong> den Aufgabenbereich benötigt werden. Das adGSV-Rahmenwerk<br />

stellt bereits eine Vielzahl von Funktionen zur Verfügung. Weitere Informationen hierzu<br />

sind aus der API-Dokumentation des Rahmenwerks zu entnehmen. Nachdem die Measure()-Methode<br />

implementiert wurde, kann die SaveResult()-Methode angepasst werden. Hier<br />

kann ein gewünschter Storage Handler angesteuert werden, um die Messergebnisse des Sensors<br />

zu speichern.<br />

A.3.2 Hinzufügen <strong>eines</strong> neuen Sensors<br />

Neu erstellte Sensoren müssen, damit sie benutzt werden können, zu dem Monitordienst<br />

hinzugefügt werden. Hier<strong>für</strong> muss in der Konsole der Befehl load sensor -p PFAD -n NA-<br />

ME eingegeben werden. Bei der Option -p muss der Pfad des Sensors übergeben werden.<br />

Die Option -n gibt den Namen der Sensordatei an. Bei dem Namen ist zu beachten, dass die<br />

Endung der Datei weggelassen wird. Folgendes Beispiel zeigt, wie man einen neuen Sensor<br />

dem Monitordienst hinzufügt:<br />

load sensor -p /home/user -n SensorPING<br />

37


A Handbuch<br />

A.3.3 Entfernen <strong>eines</strong> registrierten Sensors<br />

Registrierte Sensoren können aus dem Monitordienst entfernt werden. Hier ist zu beachten,<br />

dass der Sensor nur aus dem Register der Sensor Manager gelöscht wird <strong>und</strong> so dem<br />

Monitordienst nicht mehr zur Verfügung steht. Die Sensordatei bleibt auf dem Datenträger<br />

erhalten. Um einen Sensor zu entfernen, muss in der Konsole der Befehl unload sensor -n<br />

NAME eingegeben werden. Bei der Option -n muss der registrierte Name des Sensors <strong>und</strong><br />

nicht der Dateiname angegeben werden. Das folgende Beispiel zeigt, wie man einen registrierten<br />

Sensor aus dem Monitordienst entfernt:<br />

unload sensor -n PING<br />

A.3.4 Sensoren starten <strong>und</strong> stoppen<br />

Damit ein Sensor seine Arbeit aufnimmt, muss dieser erst gestartet werden. Um einen Sensor<br />

zu starten, muss in der Konsole der Befehl start sensoring -n NAME eingegeben werden.<br />

Bei der Option -n muss der registrierte Name des Sensors <strong>und</strong> nicht der Dateiname angegeben<br />

werden. Wenn man die Option -n ALL wählt, dann werden alle im Sensor Manager<br />

registrierten Sensoren gestartet. Das folgende Beispiel zeigt, wie man einen Sensor startet:<br />

start sensoring -n PING<br />

Laufende Sensoren können mit dem Befehl stop sensoring -n NAME gestoppt werden. Bei<br />

der Option -n muss der registrierte Name des Sensors <strong>und</strong> nicht der Dateiname angegeben<br />

werden. Wenn man die Option -n ALL wählt, dann werden alle laufenden Sensoren<br />

gestoppt. Das folgende Beispiel zeigt, wie man einen Sensor stoppt:<br />

stop sensoring -n PING<br />

A.4 Aktoren<br />

Aktoren sind die Komponenten des Monitordienstes, die zur Ansteuerung des adGSV-<br />

Rahmenwerks dienen. Die folgenden Kapitel beschreiben wie neue Aktoren erstellt <strong>und</strong><br />

dem Monitordienst hinzugefügt werden können. Des weiteren wird erläutert wie im Monitordienst<br />

registrierte Aktoren entfernt werden können.<br />

A.4.1 Erstellen <strong>eines</strong> neuen Aktors<br />

Für die Erstellung <strong>eines</strong> neuen Aktors muss von der abstrakten Basisklasse eine weitere Klasse<br />

abgeleitet werden. Danach kann die abgeleitete Klasse je nach Aufgabenbereich angepasst<br />

werden. Im Init-Bereich können benötigte Variablen <strong>und</strong> Attribute initialisiert werden. Sobald<br />

dies getan wurde, kommt der wichtigste Punkt der Anpassung des neuen Aktors. In der<br />

Methode Reconfigure() müssen alle notwendigen Funktionen implementiert <strong>und</strong> aufgerufen<br />

werden, die <strong>für</strong> den Aufgabenbereich benötigt werden. Das adGSV-Rahmenwerk stellt bereits<br />

eine Vielzahl von Funktionen zur Verfügung. Weitere Informationen hierzu sind aus der<br />

API-Dokumentation des Rahmenwerks zu entnehmen. Nachdem die Reconfigure()-Methode<br />

38


A.5 Logik-Strukturen<br />

implementiert wurde, kann die SaveReport()-Methode angepasst werden. Hier kann ein gewünschter<br />

Storage-Handler angesteuert werden, um die definierten Meldungen des Aktors<br />

zu speichern.<br />

A.4.2 Hinzufügen <strong>eines</strong> neuen Aktors<br />

Neu erstellte Aktoren müssen, damit sie benutzt werden können, zu dem Monitordienst hinzugefügt<br />

werden. Hier<strong>für</strong> muss in der Konsole der Befehl load actuator -p PFAD -n NAME<br />

eingegeben werden. Bei der Option -p muss der Pfad des Aktors übergeben werden. Die<br />

Option -n gibt den Namen der Aktordatei an. Bei dem Namen ist zu beachten, dass die<br />

Endung der Datei weggelassen wird. Folgendes Beispiel zeigt, wie man einen neuen Aktor<br />

dem Monitordienst hinzufügt:<br />

load actuator -p /home/user -n ActuatorCHANGE<br />

A.4.3 Entfernen <strong>eines</strong> registrierten Aktors<br />

Registrierte Aktoren können aus dem Monitordienst entfernt werden. Hier ist zu beachten,<br />

dass der Aktor nur aus dem Register der Actuator Manager gelöscht wird <strong>und</strong> so dem<br />

Monitordienst nicht mehr zur Verfügung steht. Die Aktordatei bleibt auf dem Datenträger<br />

erhalten. Um einen Aktor zu entfernen, muss in der Konsole der Befehl unload actuator<br />

-n NAME eingegeben werden. Bei der Option -n muss der registrierte Name des Aktors<br />

<strong>und</strong> nicht der Dateiname angegeben werden. Das folgende Beispiel zeigt, wie man einen<br />

registrierten Aktor aus dem Monitordienst entfernt:<br />

unload actuator -n CHANGE<br />

A.5 Logik-Strukturen<br />

Logik-Strukturen beinhalten die logischen Verknüpfungen zwischen den Sensoren <strong>und</strong> Aktoren.<br />

Die folgenden Kapitel beschreiben wie neue Logik-Strukturen erstellt <strong>und</strong> dem Monitordienst<br />

hinzugefügt werden können. Des weiteren wird erläutert wie im Monitordienst<br />

registrierte Logik-Strukturen entfernt werden können.<br />

A.5.1 Erstellen einer neuen Logik-Struktur<br />

Logik-Strukturen müssen in Konfigurationsdateien mit Hilfe einer bestimmten Beschreibungssprache<br />

definiert werden. Zur Zeit unterstützt der Monitordienst lediglich die DOT -<br />

Beschreibungssprache von GraphViz 3 . Es besteht die Möglichkeit weitere Beschreibungssprachen<br />

zu nutzen. Hier<strong>für</strong> müssen neue Loader implementiert werden, die die neuen Beschreibungssprachen<br />

unterstützen. Die neuen Beschreibungssprachen müssen in dem Attribut<br />

types definiert werden. Im folgenden wird das Erstellen einer neuen Logik-Struktur mit<br />

Hilfe der DOT-Beschreibungssprache erläutert.<br />

3 GraphVizhttp://www.graphviz.org[08.2006]<br />

39


A Handbuch<br />

Das folgende Listing zeigt die Definition <strong>und</strong> Syntax einer Logikstruktur mit vier Sensoren<br />

<strong>und</strong> drei Aktoren.<br />

1 d i g r a p h ”L o g i c S t r u c t u r e 1 ” {<br />

2<br />

3 UPTIME−>CHANGE;<br />

4 PING−>CHANGE;<br />

5 FAILURE−>CHANGE;<br />

6 FAILURE−>NEWSTRUCTURE;<br />

7 EPOCH−>EPOCH;<br />

8 }<br />

Listing A.1: Definition einer Logikstruktur<br />

In der Zeile 1 ist das Schlüsselwort digraph <strong>und</strong> der Name der Logikstruktur zu finden.<br />

Danach folgt eine öffnende geschweifte Klammer, die den Definitionsteil einleitet. Um eine<br />

Relation zwischen einem Sensor <strong>und</strong> einem Aktor zu definieren, muss auf der linken Seite<br />

des Pfeils der Name des Sensors <strong>und</strong> auf der rechte Seite des Pfeils der Name des Aktors,<br />

der von dem Sensor ausgelöst werden soll, notiert werden. In den Zeilen 3 bis 7 sind mehrere<br />

Relationen zwischen Sensoren <strong>und</strong> Aktoren zu sehen. Die schließende geschweifte Klammer<br />

in Zeile 8 schließt den Definitionsteil ab.<br />

A.5.2 Hinzufügen einer neuen Logik-Struktur<br />

Neu erstellte Logik-Strukturen müssen, damit sie benutzt werden können, zu dem Monitordienst<br />

hinzugefügt werden. Hier<strong>für</strong> muss in der Konsole der Befehl load structure -p PFAD<br />

-n NAME eingegeben werden. Bei der Option -p muss der Pfad der Logik-Struktur übergeben<br />

werden. Die Option -n gibt den Namen der Konfigurationsdatei an. Folgendes Beispiel<br />

zeigt, wie man eine neue Logik-Struktur dem Monitordienst hinzufügt:<br />

load structure -p /home/user -n LogicStructure1.dot<br />

A.5.3 Entfernen einer registrierten Logik-Struktur<br />

Registrierte Logik-Strukturen können aus dem Monitordienst entfernt werden. Hier ist zu<br />

beachten, dass die Logik-Struktur nur aus dem Register der Sensor Actuator Logic Dispatcher<br />

gelöscht wird <strong>und</strong> so dem Monitordienst nicht mehr zur Verfügung steht. Die Konfigurationsdatei<br />

bleibt auf dem Datenträger erhalten. Um eine Logik-Struktur zu entfernen,<br />

muss in der Konsole der Befehl unload structure -n NAME eingegeben werden. Bei der<br />

Option -n muss der registrierte Name der Logik-Struktur <strong>und</strong> nicht der Dateiname angegeben<br />

werden. Das folgende Beispiel zeigt, wie man eine registrierte Logik-Struktur aus dem<br />

Monitordienst entfernt:<br />

unload structure -n LogicStructure1<br />

A.6 Funktionen des Storage-Handlers<br />

In der Konsole stehen folgende Operationen des Storage-Handlers zur Verfügung:<br />

40


A.6 Funktionen des Storage-Handlers<br />

ˆ Anlegen einer Datenbank<br />

ˆ Löschen <strong>eines</strong> Datenbank<br />

ˆ Löschen aller Datensätze einer Datenbank<br />

ˆ Lesen einer Datenbank<br />

Die folgenden Abschnitte beschreiben die Funktionen der o.g. Operationen des Storage-<br />

Handlers. Da zur Zeit nur ein Storage-Handler <strong>für</strong> die Verwaltung von Datenbanken im<br />

Monitordienst existiert, basieren die Beispiele auf einer Datenbank.<br />

Anlegen einer Datenbank Zum Anlegen einer Datenbank muss in der Konsole der<br />

Befehl create storage eingegeben werden. Dieser Befehl besitzt mehrere Optionen, mit denen<br />

weitere Informationen <strong>für</strong> die Erstellung übergeben werden können. Mit der Option<br />

-l SPEICHERORT wird der Pfad <strong>und</strong> der Name der Datenbank definiert. Die Option -a<br />

BEREICH übergibt den Namen <strong>eines</strong> Bereichs. Bei einer Datenbank wird bei dieser Option<br />

der Name einer Tabelle übergeben. Mit der Option -t TRUE TAGS können weitere<br />

Unterteilungen des Bereichs vorgenommen werden. Bei einer Datenbank werden hier die<br />

Namen <strong>und</strong> der Inhaltstyp der Spalten übergeben. Das folgende Beispiel zeigt den Befehl<br />

zur Erstellung einer Datenbankdatei mit einer Tabelle, die zwei Spalten besitzt:<br />

create storage -l /Test.db -a Table1 -t TRUE Sensor=TEXT Messergebnis=TEXT<br />

Löschen einer Datenbank Beim Löschen stehen drei Varianten zur Verfügung. Es kann<br />

die gesamte Datenbank mit dem Befehl delete storage -l OBJEKT gelöscht werden. Bei der<br />

Option -l muss der Pfad <strong>und</strong> der Name der Datenbank übergeben werden. Soll ein Bereich<br />

in der Datenbank gelöscht werden, muss zusätzlich zur -l Option mit -a BEREICH der zu<br />

löschende Bereich angegeben werden. Fügt man zu den Optionen -l <strong>und</strong> -a noch die Option<br />

-t TRUE BEDINGUNG hinzu, können einzelne Datensätze, die der Bedingung entsprechen<br />

gelöscht werden. Folgende Beispiele zeigen die verschiedenen Lösch-Varianten bei einer Datenbank:<br />

delete storage -l /Test.db : löscht die Datei ”<br />

Test.db“<br />

delete storage -l /Test.db -a Table1 : löscht die Tabelle ”<br />

Table1“ in der Datei ”<br />

Test.db“<br />

delete storage -l /Test.db -a Table1 -t TRUE Sensor=’Sensor1’ : löscht alle Datensätze<br />

in der Tabelle Table1“ in der Datei Test.db“, die in der Spalte Sensor“ Sensor1“<br />

” ” ” ”<br />

beinhalten<br />

Löschen aller Datensätze einer Datenbank Zum Löschen aller Datensätze einer Datenbank<br />

muss in der Konsole der Befehl clear storage -l OBJEKT eingegeben werden. Mit<br />

der Option -l wird der Pfad <strong>und</strong> der Name der Datenbank übergeben. Benutzt man zusätzlich<br />

die Option -a BEREICH werden alle Datensätze des übergebenen Bereichs gelöscht.<br />

Folgendes Beispiel zeigt das Löschen aller Datensätze einer Tabelle in einer Datenbank:<br />

41


A Handbuch<br />

clear storage -l /Test.db -a Table1<br />

Lesen einer Datenbank Beim Lesen einer Datenbank stehen vier Varianten zur Verfügung.<br />

Um die gesamte Datenbank zu lesen, muss der Befehl read storage -l OBJEKT in der<br />

Konsole eingegeben werden. Bei der Option -l muss der Pfad <strong>und</strong> der Name der Datenbank<br />

übergeben werden. Sollen die Datensätze <strong>eines</strong> Bereichs gelesen werden, muss zusätzlich<br />

die Option -a BEREICH angegeben werden. Fügt man zu den Optionen -l <strong>und</strong> -a noch<br />

die Option -i DATENSATZ hinzu, können einzelne Datensätze <strong>eines</strong> Bereichs aus der Datenbank<br />

gelesen werden. Sollen einzelne Datensätze gelesen werden, die einer bestimmten<br />

Bedingung entsprechen, muss zusätzlich die Option -c TRUE BEDINGUNG hinzufügen.<br />

Das folgende Beispiel zeigt den Befehl zum Lesen einzelner Datensätze mit einer Bedingung<br />

aus einer Datenbank:<br />

read storage -l /Test.db -a Table1 -i Messergebnis -c TRUE Sensor=’Sensor1’ : liest<br />

alle Datensätze der Spalte Messergebnis“ aus der Tabelle Table1“ der Datei Test.db“, die<br />

” ” ”<br />

von dem Sensor Sensor1“ stammen.<br />

”<br />

A.7 Anzeigen von Informationen<br />

Es besteht die Möglichkeit Informationen über den laufenden Monitordienst zu erhalten.<br />

Es lassen sich Informationen über folgende Komponenten des Monitordienstes abfragen:<br />

ˆ Sensor Manager<br />

ˆ Actuator Manager<br />

ˆ Sensor Actuator Logic Dispatcher<br />

Hier<strong>für</strong> muss in der Konsole der Befehl monitor info mit der Option -c KOMPONEN-<br />

TE eingegeben werden. Um die Informationen einer gewünschten Komponente zu erhalten,<br />

kann als Komponente SENSORS <strong>für</strong> den Sensor Manager, ACTUATORS <strong>für</strong> den Actuator<br />

Manager <strong>und</strong> LOGICS <strong>für</strong> den Sensor Actuator Logic Dispatcher eingegeben werden. Die<br />

Option -c ALL bewirkt, dass die Informationen aller Komponenten angezeigt werden.<br />

Die Informationen des Sensor Manager beinhalten eine Auflistung aller registrierten Sensor,<br />

sowie deren Status, ob sie gerade Laufen oder Ruhen. Die Informationen des Actuator Managers<br />

beinhalten eine Auflistung aller registrierten Aktoren. Die Informationen des Sensor<br />

Actuator Logic Dispatcher beinhalten eine Auflistung aller registrierten Logik-Strukturen,<br />

sowie der Verknüpfungen zwischen Sensoren <strong>und</strong> Aktoren.<br />

42

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!