ORDIXnews - ORDIX AG

Werbung
www.ordix.de
ORDIX news
01
2008
€ 2,20
Das IT-Magazin der ORDIX AG
Alles virtuell mit OpenVZ und Virtuozzo
Nagios 3.0
Vererbungslehre für Administratoren
IT-Projektmanagement
S. 14
IBM Informix Dynamic Server 11
S. 32
Professionelle Projektinitialisierung und hilfreiche
Checklisten für die effiziente Planung
S. 38
Dynamisches Ressourcen Tuning
Performante JEE-Anwendungen
S. 44
Mit Lasttests im Kundenprojekt auf dem Weg zur
robusten, performanten Anwendung
S. 22
Veranstaltungen 2008
• „Informix Bestandsaufnahme
und Erwartungshaltung“
12.02.2008 IBM in München
• „Informix aus Betreiber-Sicht“
18.06.2008 IBM in Hamburg
• „Informix Anwendung und
Entwicklungswerkzeuge“
12.11.2008 Mathematikmuseum
in Gießen
Informationen zu unseren Veranstaltungen finden Sie auf unserer Homepage. Wenn Sie einen
Vortrag zu einem der Themen halten wollen, melden Sie sich bitte bei uns.
Am Abend vor den Workshops trifft sich die IUG-Gemeinschaft zum Stammtisch. In angenehmer
Atmosphäre haben Sie dort die Möglichkeit, Erfahrungen auszutauschen und Kontakte zu knüpfen.
Als IUG-Mitglied ist die Teilnahme an unseren Workshops und Stammtischen kostenlos.
Seit 15 Jahren sind wir ein eingetragener, unabhängiger Verein, dessen Aufgabe es ist, InformixAnwender und -Interessenten zusammenzubringen.
Experten-Vorträge
-
Kontakt- und Netzwerkbildung
www.iug.de
-
Hohe Besucherzahlen
Für weitere Informationen melden Sie sich bitte bei: [email protected]
Editorial
Pimp your E-Mail
Paderborn, März 2008
1985 begann für mich zaghaft das E-Mail-Zeitalter. Bekam oder schrieb man am Tag mehr als fünf
bis sechs Mails, so war das schon viel. Als ich 1987 zu Nixdorf ging, musste ich in der Beziehung
einen Rückschritt machen. IBM-orientiert, wie das Unternehmen war, waren TCP/IP-Netzwerke
ebenso verpönt, wie Mails zu schreiben. Lediglich innerhalb der Entwicklung wurde ein internes
Netz (NERVE) dafür genutzt. Da gab es viel Aufklärungsarbeit zu leisten.
ORDIX hatte deshalb sehr schnell seine Domain und Mail-Adressen. Mich erreicht man deshalb
auch schon fast 18 Jahre über die gleiche Mail-Adresse. Leider sind es inzwischen aber zu viele:
Nachdem Ende der 90er Jahre das Marketing E-Mails als Medium für sich entdeckte, wuchs nicht
nur der Umfang einer E-Mail um ein Vielfaches, sondern auch die Anzahl an Mails stieg ins Unermessliche. 1000 Mails pro Tag sind leider nichts Außergewöhnliches.
SPAM lässt sich zwar inzwischen sehr leicht filtern, große Mails aber leider nicht. Liebend gerne
werden Megabyte große Powerpoint Präsentationen verschickt, obwohl der Empfängerkreis viel
zu groß ist und der tatsächliche Inhalt auch gut und gerne in eine 500 Byte große Mail gepasst
hätte. Überflüssige Bilder, Formatierungen, die niemand braucht - je weniger Inhalt eine Mail hat,
desto mehr wird sie durch Schnickschnack, Anhänge etc. aufgebläht.
Und dann empfangen Sie mal so einen Unfug im Urlaub oder unterwegs bei einer zwischen UMTS
und GPRS wechselnden Verbindung oder einer schmalbrüstigen WLAN-Internetanbindung. Da
kam früher bei einem Akustikkoppler mit 120 Baud mehr über die Leitung - zumindest in Bezug auf
echte Information. Je größer die Firmen und je nichtssagender die Nachricht, desto aufgemotzter
die E-Mail. „Pimp your E-Mail“ fällt mir dazu ein.
Aber vielleicht werde ich langsam zu alt. Auslaufmodell muss man mich nennen, der ich die Meinung verfechte, dass ein Datenbankserver, wenn er vernünftig eingestellt ist, nicht mehr als 1 GB
Hauptspeicher braucht, um 100 - 150 Anwender schnell genug zu bedienen. Wo doch heute schon
Notebooks mit 2 GB nicht ausreichen, damit Java- oder .NET-Entwickler simple Programme schreiben können. Und das nur, weil man niemandem mehr den VI zumuten möchte und Anwendungen
nicht mehr durch analytisches Denken, sondern durch pures Zusammenklicken entwickelt werden.
Besser werden sie dadurch definitiv nicht. Alles soll „automatisch“ gehen. Über nichts mehr nachzudenken ist „in“. Und wenn es dann doch schief läuft, wundern sich alle.
Ich stelle mir das Jahr 2108 vor: Keiner diskutiert mehr das Nichtrauchergesetz. Es wird vielmehr
darüber gestritten, warum NRW das europaweit geforderte MAG (Mausabschaffgesetz) nicht umsetzen möchte. Obwohl erwiesenermaßen Rückenbeschwerden, verstärktes Rheuma und Haltungsschäden bei Personen unter 19 darauf zurückzuführen sind. Von Lese- und Schreibschwächen ganz zu schweigen.
Bis dahin ist es aber noch weit. Und Sie merken, ich werde alt. Ich habe das vor ein paar Wochen
ebenfalls mit Erschrecken festgestellt. Da teilte mir mein Bankbetreuer mit, dass er in diesem Jahr
in Altersteilzeit geht. Mit ihm habe ich schon Anfang der 80er Telefonbanking betrieben, als noch
keiner wusste, was Telefonbanking ist.
Bevor ich in Altersteilzeit gehe , werde ich Sie aber noch einige Male auf Inhalte der ORDIX
News hinweisen: Dieses Mal gibt es viel zum Thema Virtualisierung (vielleicht werden auch irgend­
wann Mäuse virtualisiert ), wichtige Automatismen bei Datenbanken (Oracle, Informix und DB2,
s. o.) und Interessantes zu Java Frameworks und APIs fehlt natürlich auch nicht.
Jetzt rufe ich erst mal meine Mails ab und verschicke dieses Editorial - im Urlaub versteht sich. Viel
Spaß beim Lesen wünscht Ihnen
Wolfgang Kögler
PS: Dieses Mal nichts Politisches, aber bei einem Wahlkampf à la Koch fällt selbst mir nichts mehr
ein ...
ORDIX News 1/2008
Inhalt
Aktuell
34.....Larry Ratlos: Verflixte PHP 5 Arrays
Standards
03.....Editorial
04.....Inhalt
Betriebssysteme
35.....I/O-Multipathing mit Linux-Bordmitteln:
Viele Wege führen zur LUN
Implementierung des I/O-Multipathing auf Basis des
Device-Mappers im Linux Kernel 2.6.
37.....Impressum
Training
26.....Seminarübersicht: März bis Oktober 2008
09.....Seminar: Entwicklung mit Spring
Open Source
14.....Alternative Virtualisierungslösungen:
Alles virtuell mit OpenVZ und Virtuozzo
Virtualisierungslösungen im Internetsektor: Die Open
Source Virtualisierungslösung OpenVZ kommt vor
allem beim Webhosting zum Einsatz. Das kommerzielle
Produkt Virtuozzo baut darauf auf.
48.....Neue Features in OpenLDAP 2.3 (Teil II):
Serverkonfiguration zur Laufzeit
Dieser Artikel berichtet über die neue Möglichkeit der
LDAP-Serverkonfiguration zur Laufzeit. Zudem wird
am Beispiel der sudo-Konfiguration aufgezeigt, wie
vielfältig sich OpenLDAP nutzen lässt.
Java/JEE
05.....Spring Web Flow
Kurze Einführung in die Ablaufsteuerung von Anwendungsfällen innerhalb von Java-basierten Web-Anwendungen mit dem Spring Web Flow Framework.
22.....Mit Lasttests zur performanten JEE-Anwendung
Vorstellung der Erfahrungen mit Lasttests aus einem
Kundenprojekt – insbesondere zur zeitlichen Einbettung von Lasttests in Projektplänen und zur Definition
und Ermittlung von aussagekräftigen Antwortzeiten.
28.....JExcelAPI und Jakarta POI – David gegen Goliath?
Vergleich des Jakarta-Projekts POI mit der JExcelAPI,
insbesondere im Hinblick auf den Funktionsumfang
und die Handhabung der Tools. Für einen schnellen
Vergleich gibt es den Expertencheck.
Projektmanagement
38.....IT-Projektmanagement: Aller Anfang ist schwer
Über die Notwendigkeit einer durchdachten und präzisen Initialisierung von IT-Projekten mit Checklisten
als Hilfestellung.
ORDIX News 1/2008
51.....Seminar: OpenLDAP - Praxiseinsatz im
Netzwerk
Systemmanagement
32.....Nagios 3.0:
Vererbungslehre für Administratoren
Überblick über die Neuheiten der Version
3.0 der System Monitoring Software Nagios:
Vorstellung der Möglichkeit, mehr als eine
Vorlage in eine Objektdefinition einzubinden
und somit komplexe Anforderungen besser
umsetzen zu können.
Datenbanken
10.....Oracle Database 11g Release 1 (Teil II):
ADR - Automatic Diagnostic Repository
Fehleranalysen unter Oracle mit dem neuen
Advisory Framework Automatic Diagnostic
Repository.
18.....IBM DB2 UDB 9.1 „Viper“ (Teil V):
Automatisierung durch „dynamischen
Speicher“
Vorstellung der neuen Automatisierungsfunktion „Automatic Storage“ der IBM DB2
Datenbank Version 9.1.
41.....Oracle Objekttypen von A - Z (Teil VI):
Jobs und Libraries
Diesmal stellen wir Ihnen die Objekttypen
Job, Job Class, Programm, Schedule und
Library vor.
44.....IBM IDS 11 (Teil II):
Dynamisches Ressourcen Tuning
Vorstellung der neuen Möglichkeiten im Bereich „Dynamisches Ressourcen Tuning mit
der Informix Version 11“ und Erläuterung der
hierfür wichtigsten Begriffe und Parameter.
Java/JEE
Ablaufsteuerung von Anwendungsfällen innerhalb von Java-basierten Web-Anwendungen
Spring Web Flow
Mit dem Spring Web Flow Framework sollen Probleme, die bei der Entwicklung von
Java-basierten Web-Anwendungen auftreten können, wie z. B. fehlende Unterstützung
der Browser-Funktionalitäten, der Vergangenheit angehören. Im folgenden Artikel wird
Dieser Artikel richtet sich an
Java-Entwickler und Architekten
im Bereich Web-Anwendungen.
eine kurze Einführung in das Framework gegeben und aufgezeigt, ob Spring Web Flow
diesem ehrgeizigen Ziel gerecht wird.
Was ist Spring Web Flow?
Spring Web Flow ist ein Framework für die Ablaufsteuerung von Anwendungsfällen innerhalb
von Web-Anwendungen. Ein erklärtes Ziel ist
die Unterstützung der Browser-Navigation, die
in der Web-Entwicklung immer wieder zu Problemen führt. Das Framework übernimmt dabei die Navigation zwischen den einzelnen
Views und stellt darüber hinaus einen zusätzlichen Scope Container zur Verfügung.
Spring Web Flow kann in den gängigsten WebFrameworks, wie Struts, JSF, Portlet MVC oder
Spring MVC, integriert werden.
Spring Web Flow implementiert im Kern einen
finiten Zustandsautomaten, der auf definierte
Anfangs- und Endzustände angewiesen ist.
Der Einsatz von Spring Web Flow bietet sich
daher für Anwendungsfälle an, in denen feste
Abläufe existieren. Es sollte nicht in Bereichen
eingesetzt werden, in denen der Benutzer frei
navigieren kann. In diesem Fall sollte die Standardnavigation des überlagerten Web-Frame­
works eingesetzt werden.
Spring Web Flow ersetzt somit nicht die vorhandene Navigation, sondern erweitert diese,
indem es sich als zusätzlicher Controller in
die bestehende Infrastruktur eingliedert.
ORDIX News 1/2008
Java/JEE
Um zu verhindern, dass ein Request durch
einen Reload erneut gesendet wird, setzt
Spring Web Flow das Post+Redirect+Get
Pattern ein. Ein Redirect ist eine Weiterleitung
auf eine andere Webseite, wobei der eigentliche Request/Response-Zyklus zweigeteilt
wird. Nach dem POST Request wird durch
den Redirect ein erneuter Browser Request
via GET angestoßen. Somit erhält der Client
eine stabile URL, die keinen erneuten Datenversand im Falle eines Reload durch den
Browser ausführt.
Flow
Der Ablauf der logisch zusammenhängenden
Views wird in einem so genannten Flow definiert. Ein Flow kann als XML-Datei oder wahlweise mittels der Java-API realisiert werden.
Ein Flow besteht in der Regel aus mehreren
Zuständen (innerhalb von Web Flow als States
bezeichnet), die nacheinander und in Abhängigkeit von der jeweiligen Benutzerinteraktion
durchlaufen werden. Ein Beispiel eines per
XML definierten Flows ist in der Abbildung 1
genauer aufgezeigt.
Innerhalb eines Flows stehen verschiedene
States zur Verfügung. Zunächst muss jeder
<flow xmlns="http://www.springframework.org/schema/webflow" .../>
<start-state idref="startingState"/>
<view-state id="startingState" view="/xyz.xhtml">
<transition on="submit" to="actionState"/>
</view-state>
<action-state id="actionState">
<bean-action bean="beanName" method="methodName">
<method-arguments>
<argument expression="flowScope.expression"/>
</method-arguments>
</bean-action>
<transition on="failure" to="startingState"/>
<transition on="success" to="decisionState"/>
</action-state>
<decision-state id="decisionState">
<if test="${flowScope.bean.property}"
then="endState"
else="startingState"/>
</decision-state>
<end-state id="endState" view="/abc.xhtml" />
</flow>
Abb. 1: Definition eines Flows per XML.
ORDIX News 1/2008
Flow einen Start State und einen End State
besitzen. Der Start State definiert den Einstiegspunkt und aktiviert den jeweiligen Flow.
Dieser bleibt so lange aktiv, bis ein End State
erreicht wird. Die Angabe eines End States
ist zwar nicht zwingend erforderlich, ist aber
dringend zu empfehlen, da die sonst entstehenden Endlos-Flows unnötig Hauptspeicher
binden.
Web Flow kennt 5 verschiedene Arten von
States:
•
•
•
•
•
View State
Action State
Decision State
Subflow State
End State
Ein View State definiert den Einstiegspunkt
für den Benutzer und repräsentiert die eigent­
lichen JSP- bzw. XHTML-Dateien. Nur innerhalb eines View States wird der Flow angehalten und dabei auf ein Event vom Benutzer
gewartet.
Alle anderen States werden automatisch
durchlaufen, wie z. B. die Action States, die
für den Aufruf der Geschäftslogik zuständig
sind. Auf die zugehörigen Action-Klassen gehen wir im späteren Verlauf noch ein.
Auch Kontrollstrukturen können innerhalb eines Flows durch einen so genannten Decision
State definiert werden. Dabei wird eine Vari­
able auf einen beliebigen Zustand abgefragt
und entsprechend reagiert, d. h. auf den zugehörigen State verwiesen (siehe Abbildung 1).
Durch einen Subflow besteht die Möglichkeit,
andere Flow-Definitionen innerhalb des aktuellen Flows aufzurufen. Auf Subflows wird im
Folgenden noch genauer eingegangen.
Beim Erreichen des End States wird der aktive
Flow beendet und alle zugehörigen Beans werden automatisch aus dem Speicher entfernt.
Transition
Der Übergang zwischen den einzelnen States
wird durch so genannte Transitions realisiert.
Eine Transition fängt den Event eines Views
oder eines Action States ab und leitet auf den
State weiter, der in dem to-Attribut angegeben wurde. Existiert innerhalb eines States
keine passende Transition zu einem Event, so
wird eine globale Transition gesucht und ausgeführt. Abbildung 1 stellt die Funktionsweise
Java/JEE
von Transitions schematisch dar. Hierbei fängt
das Framework Events, die z. B. innerhalb
eines Views oder Action States erzeugt wurden, ab und leitet durch die Transition auf den
nächsten State weiter.
Action
Für die Implementierung von Action-Klassen,
die u. a. dem Aufruf der Geschäftslogik die­
nen, stehen dem Entwickler bereits einige
Klassen (z. B. FormAction, MultiAction usw.)
zur Verfügung, von denen die eigentliche
Action-Klasse abgeleitet werden kann. Alle
diese Klassen implementieren das Interface
org.springframework.webflow.execution.Action.
Die Methoden liefern innerhalb einer Action
ein Objekt vom Typ Event zurück. Dieses wird
vom Framework abgefangen und eine passende Transition wird für dieses Event gesucht. Anschließend wird durch die Transition
der nächste State ausgewählt.
Nicht nur innerhalb eines Action States können
Actions ausgeführt werden. Sie lassen sich
auch als Entry oder End Action innerhalb eines
beliebigen States oder z. B. als Render Action
innerhalb eines View States einsetzen.
Scope
Wie bereits erwähnt, stellt Spring Web Flow einen eigenen Scope-Container zur Verfügung.
Dieser erweitert die Web-Anwendung um die
folgenden Scopes:
•
Flash: Gültig, solange der Flow aktiv ist, jedoch werden Flash Scope Beans nach jedem View State geleert und dienen somit
dazu, zwischen zwei User Events Daten zu
transferieren.
•
Flow: Steht über die gesamte Laufzeit des
Flows zur Verfügung.
•
Conversation: Die Lebensdauer ist mit
dem Flow Scope identisch, nur stehen Conversation Scope Beans auch in den zugehörigen Subflows zur Verfügung.
Es besteht die Möglichkeit, auch weiterhin die
bekannten Scopes einer Web-Anwendung,
wie beispielsweise Request und Session, zu
verwenden. Der Request Scope sollte aber
mit Bedacht eingesetzt werden, da der Lebenszyklus der zugehörigen Beans für eine
<subflow-state id="subflowState" flow="subflowID" >
<attribute-mapper>
<output-mapper>
<output-attribute name="parameter1" scope="flow"/>
<output-attribute name="parameter2" scope="flash"/>
</output-mapper>
</attribute-mapper>
<transition on="success" to="stateX"/>
</subflow-state>
Abb. 2: Aufruf eines Subflows innerhalb eines anderen Flows.
fehlerfreie Unterstützung der Browser-Navigation zu kurz ist.
Der große Vorteil der neuen Scopes ist, dass
diese nach Beendigung eines Flows automatisch gelöscht werden und nicht länger in der
Session liegen.
Subflows
Auch die Modularisierung von Flows in kleine Einheiten ist durch so genannte Subflows
bzw. Inline-Flows ohne Weiteres möglich. Ein
Subflow wird zunächst wie jede andere FlowDefinition erstellt. Der Unterschied zu einem
normalen Flow liegt lediglich darin, dass der
Subflow innerhalb eines Subflow States (siehe Abbildung 2) aufgerufen wird. Eine FlowDefinition kann beliebig viele Subflows enthalten, welche wiederum weitere Subflows
aufrufen können.
Inline Flows werden im Gegensatz zu Subflows nicht in einer eigenen XML-Datei gekapselt, sondern direkt in dem Flow definiert, in
dem sie aufgerufen werden. Dadurch ist dieser nur innerhalb des konkreten Flows sichtbar
und wird nur dann eingesetzt, wenn der Flow
zwingend zu dem Flow gehört, aus dem er aufgerufen wird, und nicht in einem anderen Flow
verwendet werden darf.
Für den Datenaustausch zwischen Flow und
Subflow gibt es Input- und Output-Mapper.
Parameter können durch einen Input-Mapper
an den Subflow übergeben und durch einen
Output-Mapper auch wieder zurückgegeben
werden.
Repository
Wie bereits erwähnt, setzt sich Spring Web
Flow das Ziel, die Browser-Funktionalitäten zu
unterstützen. Um diese Funktionalität zu ge-
ORDIX News 1/2008
Java/JEE
währleisten, muss die Möglichkeit bestehen,
den Zustand einer View zu speichern und wieder abzurufen. Hierfür steht ein so genanntes
Repository zur Verfügung, welches die Zustände der einzelnen Views innerhalb eines Flows
zwischenspeichert. Dadurch kann man den
Zustand jeder View innerhalb eines Flows zu
einem beliebigen Zeitpunkt reproduzieren. Nur
durch so ein Repository ist es für Spring Web
Flow möglich, die Browser-Navigation zu unterstützen. Spring Web Flow beinhaltet grundsätzlich die folgenden Reposi­tories:
•
•
•
Continuation
Client
Simple/Single-Key
Die Repositories Continuation und Client enthalten die identische Funktionalität, nur mit
dem Unterschied, dass bei einem Client Repository alle Informationen auf dem jeweiligen
Client und nicht auf dem Server gehalten werden.
Die Repositories Simple und Single-Key benötigen zwar weit weniger Ressourcen als
die vorherigen, besitzen aber dadurch keinen
Support der Browser Buttons mehr.
Erst nach Erreichen des End States werden
die zugehörigen Daten des Flows aus dem
Repository wieder gelöscht. Demnach kann
anschließend der Zustand einer View innerhalb des bereits beendeten Flows nicht mehr
rekonstruiert werden.
public class MeineTestKlasse extends AbstractXmlFlowExecutionTests {
protected FlowDefinitionResource getFlowDefinitionResource(){
return createFlowDefinitionResource("/.../testflow-flow.xml");
}
public void testStartFlow(){
ApplicationView view = applicationView(startFlow());
assertActiveFlowEquals("testflow-flow");
assertCurrentStateEquals("startingState");
assertModelAttributeNotNull("attributeName", view);
assertViewNameEquals("/test.xhtml", view);
}
public void testStateX(){
testStartFlow();
assertCurrentStateEquals("testStateX");
MockParameterMap param = new MockParameterMap ();
ApplicationView view=applicationView(signalEvent("submit", param));
assertFlowExecutionEnded();
}
}
Abb. 3: JUnit-Klasse zum Testen der Flow-Definition.
ORDIX News 1/2008
Testen von Flows
Auch das unter Entwicklern nicht sehr beliebte
Testen der eigenen Anwendung wird innerhalb
von Spring Web Flow durch die Integration von
JUnit unterstützt. Als Beispiel wird ein JUnitTest in Abbildung 3 genauer aufgezeigt.
Die JUnit-Tests werden dabei von der Klasse
AbstractXmlFlowExecutionTests abge­
leitet. Innerhalb der abgeleiteten Testklasse
stehen nun diverse Methoden zum Testen
des Flows zur Verfügung. Mit der Methode
assertCurrentStateEquals kann z. B.
kontrol­liert werden, ob sich der Flow gerade
in dem korrekten State befindet. Mit der Methode signalEvent wird ein User Event an
den zu testenden Flow gesendet.
Bei der Erstellung eines JUnit-Tests muss die
Methode
getFlowDefinitionResource
über­schrieben werden. Innerhalb dieser Methode wird beispielsweise die konkrete FlowDefinition angegeben und es werden mögliche
Subflows innerhalb des Tests registriert.
Exception Handling
Um Exceptions innerhalb eines Flows abzufangen, kann ein individueller Exception Handler
entwickelt werden, der zwingend das Interface
FlowExecutionExceptionHandler implementieren muss. Das Interface beinhaltet zwei
Methoden, die vom Exception Handler imple­
men­tiert werden müssen. Ob die übergebene
Exception vom Handler verarbeitet werden
kann, liefert die Methode handles zurück. Die
Methode handle bearbeitet die Exception
und liefert gegebenenfalls ein entsprechendes
ViewSelection-Objekt zurück, welches den
Namen der anzuzeigenden Fehlerseite enthält.
Dieser Exception Handler kann wahlweise direkt an ein View oder Action State gehängt oder
global innerhalb eines Flows definiert werden.
Er kann aber nur Exceptions behandeln, die innerhalb eines aktiven Flows aufgetreten sind.
Alle anderen Exceptions werden durch Spring
Web Flow an das darüber liegende MVCFrame­­work weitergeleitet.
Zusammenspiel mit JSF
Gerade bei der immer größer werdenden Beliebtheit von JSF ist der Einsatz von Spring
Web Flow mit dieser Technologie interessant.
Generell funktioniert die Zusammenarbeit
wie bei den anderen MVC-Frameworks relativ einfach. Nur gibt es leider gerade in der
Java/JEE
Kombination mit JSF noch ein paar Schönheitsfehler.
Wie zuvor erwähnt werden alle Exceptions, die
nicht durch einen Exception Handler bearbeitet
werden können, an das übergeordnete Framework weitergeleitet. Bei JSF besteht das Problem, dass es keine Möglichkeit gibt, solche
Exceptions abzufangen. Daher werden diese
Exceptions direkt auf der Oberfläche ausgegeben. Das ist gerade bei der häufig auftretenden
NoSuchConversationException sehr störend. Sie tritt auf, wenn ein Event innerhalb eines bereits beendeten Flows ausgelöst wird.
Glossar
MVC
JSF
JSF Phase Listener
JUnit
Scope
In diesem Fall könnte das Faces Servlet von
JSF bei Bedarf erweitert werden. Inner­halb
der Methode service könnte die Excep­tion
abgefangen und entsprechend behandelt
werden.
Ein weiteres Problem ist, dass die Faces Messages durch die durchgeführten Redirects verloren gehen. Erst durch die Implementierung
eines eigenen JSF-Phase-Listeners, der die
Messages temporär in der Session zwischenspeichert, werden die Messages auf den jeweiligen Views wieder ausgegeben.
Ausblick
Mit Spring Web Flow 2.0, das im März 2008
veröffentlicht wird, werden einige neue Funktionalitäten den Weg ins Framework finden
und einige bekannte „Macken“ ausgemerzt.
Gerade die Integration in JSF soll durch das
SpringFaces Projekt stark verbessert werden.
Es soll unter anderem ein besseres Exception
Handling besitzen. Auch das Vererben und Ableiten von Flow-Definitionen soll, genauso wie
die Definition von Flows, in der neuen Version
durch Annotations möglich sein.
Fazit
Der Einsatz von Spring Web Flow lohnt sich
vornehmlich bei Web-Anwendungen mit logisch zusammenhängenden Dialogen, um eine
Ablaufsteuerung der eigenen Anwendungsfälle zu erstellen. Für diesen Zweck stellt Spring
dem Entwickler ein mächtiges Framework zur
Seite, das sich sehr gut in die gängigsten WebFrameworks integrieren lässt.
Nur in Kombination mit JSF sollte man ggf. auf
das neue Release warten, da dieses höchstwahrscheinlich die Workarounds, die beim
Exception Handling und den Faces Messages
nötig sind, erspart.
Model View Controller. MVC ist ein Paradigma für Benutzeroberflächen, das die getrennte Behandlung von Daten,
deren Darstellung und die darauf wirkenden Benutzeraktivitäten propagiert.
JavaServer Faces. JSF ist ein standardisiertes Framework
zur Entwicklung von Web-Anwendungen.
Ein Phase Listener klinkt sich in den JSF-Lebenszyklus ein
und kann vor und nach jeder Phase innerhalb des Lebenszyklusses Logik ausführen.
Ein Open Source Framework zur Durchführung von automatisierten Tests von Java-Programmen.
Der Scope einer Bean definiert ihre Lebensdauer, d. h. wie
lange die Bean im Speicher gehalten wird, bevor sie zur
Garbage Collection freigegeben wird.
Seminarempfehlung:
Entwickeln mit dem Spring-Framework
► Internet: http://training.ordix.de/seminar.php?nr=643
Dieses Seminar stellt eine Einführung in das Spring-Framework dar. Spring ist ein
weitverbreitetes Open-Source-Framework, das sowohl in Java Standard wie auch in
Java Enterprise Projekten häufig zum Einsatz kommt. Es stellt Lösungen für die Infrastruktur der Software zur Verfügung. Spring-Anwendungen lassen sich unabhängig
von der Zielarchitektur (J2SE, Web-Container, EJB-Container) entwickeln.
Seminarinhalte:
•
•
•
•
•
•
•
Spring - ein Überblick
Inversion of Control Container
• Beans erzeugen: Bean Factories
• Beans zur Verfügung stellen: Dependency Injection
• Ressourcen verwalten: Application Context
Möglichkeiten der aspektorientierten Programmierung
• Was sind Aspekte?
• Grundlegende Möglichkeiten
Transaktionsmanagement
Aufbau der Persistenzschicht
Einbettung von Spring-Anwendungen in EJB Container
Übungen
Termine:
19.05.- 21.05.2008in Wiesbaden
25.08. - 27.08.2008 in Wiesbaden
27.10. - 29.10.2008 in Wiesbaden
08.12. - 10.12.2008 in Wiesbaden
Seminar-ID: P-JEE-06
Dauer: 3 Tage
Preis pro Teilnehmer:
1.090,00 € (zzgl. MwSt.)
Christian Wiesing ([email protected]).
ORDIX News 1/2008
Datenbanken
Oracle Database 11g Release 1 (Teil II):
ADR - Automatic Diagnostic Repository
Diese Artikelreihe richtet sich
an Datenbankadministratoren
und -entwickler, die sich einen
ersten Überblick über die
wichtigsten neuen Funktionali­
täten der Version 11g Release 1
verschaffen möchten.
Der erste Teil dieser Reihe hat einen Überblick über die wichtigsten Neuerungen in der
Oracle Version 11g gegeben. Nun befassen wir uns mit dem neuen Advisory Frame­
work zur Fehlerdiagnose, dem Automatic Diagnostic Repository (ADR). In diesem Beitrag stellen wir die wichtigsten Bereiche dieses Tools vor.
Überblick
Mit Oracle 11g wird das Automatic Diagnostic
Repository (ADR) neu eingeführt. Unter ADR
ist ein zentrales, auf XML-Dateien basieren­
des Repository zu verstehen. Es liegt außer­
halb der Datenbank und setzt sich aus dia­gnostischen Daten zusammen. Diese Informa­
tionen musste der Administrator bisher aus
vielen einzelnen Dateien zusammentragen.
Zu solchen zählten zum Beispiel das Alert.log,
Core Dumps, Dumps der Hintergrundprozes­se
und User Trace Files.
Durch das Zusammenfassen der Diagnoseinformationen, auch von mehreren Instanzen,
wird dieses in Zukunft wesentlich einfacher
werden. Nun können der Administrator sowie
der Oracle Support leichter auf zusammenhängende Fehlerprotokolle zugreifen.
Automatic Storage Management (ASM),
Cluster Ready Service und andere Oracle
Produkte und Komponenten speichern ihre
Diagnoseinformationen ebenfalls im ADR.
Jede Instanz erhält dafür ein eigenes ADRHomeverzeichnis. Alle Initialisierungsparameter, die mit „_DUMP_DEST“ enden, werden ab jetzt ignoriert. Durch den Parameter
DIAGNOSTIC_DEST wird das ADR_BASEVerzeichnis gesetzt. Die­ses Verzeichnis ist
das Wurzelverzeichnis des ADR. Unterhalb
dieses Wurzelverzeichnisses erhält jede Instanz ein eigenes ADR-Homeverzeichnis, in
dem sich dann die Verzeichnisse für Alert.log,
Incident Reports, Problems usw. befinden
(siehe Abbildung 1).
10
ORDIX News 1/2008
Das Alert.log
Jeder, der zum ersten mal mit Oracle 11g zu
tun hat, stolpert zwangsläufig über die Frage:
„Wo ist das Alert.log?“ Bisher konnten wir das
Alert.log in dem durch den Initialisierungsparameter BACKGROUND_DUMP_DEST festgelegten Verzeichnis finden. Dort suchen wir
nun allerdings vergeblich.
In Oracle 11g werden nun zwei Versionen des
Alert.logs gepflegt. Zum einen existiert auch
weiterhin eine in ASCI geschriebene Version.
Zum anderen wird das Alert.log nun auch in
der XML-Version geschrieben.
Im Verzeichnis $ADR_HOME/alert finden wir
nun die XML-Version des Alert.log, im Verzeichnis $ADR_HOME/trace wird es in der alten Version abgelegt. Das Alert.log in der XMLVersion kann nun bequem über den Enterprise
Manager gelesen werden.
Zudem gibt es die Möglichkeit, das Alert.log
über den Command Interpreter des ADR
(ADRCI) zu betrachten. Außerdem kann man
das Alert.log auch in der alten Version wie gewohnt mit einem Texteditor der eigenen Wahl
lesen.
Die View V$DIAG_INFO
Mit der View V$DIAG_INFO lassen sich in der
Datenbank die Pfade zu den einzelnen Dateien abfragen (siehe Abbildung 2).
Datenbanken
•
ADR_BASE: Pfad zum ADR-Wurzelverzeichnis
•
ADR_HOME: Pfad zum Homeverzeichnis
der aktuellen Instanz
•
DIAG_Trace: Pfad zum textbasierten
Alert.log File und den Trace-Dateien
(foreground/background)
•
Diag Alert: Pfad zum XML Alert.log File
•
Default Trace File: Pfad zum trace File
der aktuellen Session
ADR
base
diag
rdbms
database name
alert
ADRCI
Über das neue Kommandozeilenwerkzeug
ADRCI werden die Diagnosedaten ausgelesen. Mit diesem sehr mächtigen Tool lassen
sich außerdem viele diagnostische Aufgaben
erledigen. Es können Diagnoseinformationen
gelesen, ausgewertet oder zu einem Paket
zusammengeschnürt werden. Diese Pakete
können dann leicht an den Oracle Support
weitergeleitet werden. Das ADRCI kann interaktiv aber auch in Skripten verwendet werden. Wie mächtig das Tool ist, möchten wir mit
dem folgenden Beispiel verdeutlichen.
Auswertung des Alert.logs im ADRCI
Mit dem Tool ADRCI kann das Alert.log gelesen und geprüft werden. Vor dem Aufruf des
ADRCI sollte geprüft werden, ob die Umgebungsvariablen richtig gesetzt sind.
Mit HELP sehen Sie zunächst alle möglichen
Befehle. Mit SHOW HOMES können alle ADRHomeverzeichnisse angezeigt werden. Mit
SET HOMEPATH <PATH> kann das aktuelle
ADR-Homeverzeichnis gesetzt werden. Mit
SHOW ALERT wird das Alert.log angezeigt.
Um die Anzeige auf die letzten Einträge zu beschränken, kann man mit der Option -tail
arbeiten. Diese verhält sich genauso wie auch
das tail unter Unix.
Mit dem Schalter -f kann das „following“ eingeschaltet werden und das Alert.log live mitverfolgt werden. Mit dem Kommando SHOW
ALERT –P MESSAGE_TEXT LIKE '%ORA-%'
kann mit Hilfe des ADRCI nach bestimmten
Begriffen gefiltert werden. In diesem Beispiel
werden alle Einträge ausgegeben, die „ORA-“
beinhalten, also Fehlermeldungen. Die Ausgabe kann dann per Spool in eine Datei geschrieben werden (siehe Abbildung 3).
SID
ADR
home
cdump
incident
trace
(andere)
Abb. 1: ADR Verzeichnisstruktur.
Problems und Incidents
Durch den ADR werden zwei neue Konzepte
eingeführt: Problems und Incidents.
Problem
Als Problem wird ein kritischer Fehler in einer
Datenbankinstanz bezeichnet. Jedes Problem
bekommt einen Problem Key, der das Problem
beschreibt. Dieser beinhaltet den Fehlercode
und manchmal einen oder mehrere Fehlerparameter. Mögliche Fehler in Oracle zeigt Abbildung 4.
Incident
Ein Incident ist das einmalige Auftreten eines
Problems. Jeder Incident bekommt eine eindeutige, numerische Incident-ID. Sobald ein
Incident auftritt, passiert Folgendes:
Die Datenbank
•
schreibt einen Eintrag ins Alert.log
•
sendet einen alert an den Enterprise
Manager
•
sammelt Diagnoseinformationen in Form
eines Dumps
•
hängt dem Incident eine Dump-ID an
•
speichert den Incident in einem extra dafür angelegten Verzeichnis unterhalb des
ADR
ORDIX News 1/2008
11
Datenbanken
Im ADR werden somit automatisch Incidents
geschrieben. Wie lange ein Incident gespeichert werden soll, kann durch das Setzen einer Reten­tion Policy im ADRCI konfiguriert
werden. Hierfür gibt es zwei Parameter, die
getrennt voneinander gesetzt werden können:
•
•
Der Status eines Incidents gibt seinen Zustand wieder. Ein Incident kann in einem der
folgenden Stati sein:
Die Metadata Retention Policy gibt an, wie
lange Metadaten gespeichert werden. Diese wird per Default auf ein Jahr gesetzt.
Die Files und Dumps Retention Policy
gibt an, wie lange generierte Dump Files
gespeichert werden. Hier ist der DefaultWert ein Monat.
Incident Stati
SQL> select name, value from v$diag_info;
NAME VALUE
-----------------------------------------------------------------------------------Diag EnabledTRUE
ADR Base /oracle/11G
ADR Home /oracle/11G/diag/rdbms/ora11g/ora11g
Diag Trace /oracle/11G/diag/rdbms/ora11g/ora11g/trace
Diag Alert /oracle/11G/diag/rdbms/ora11g/ora11g/alert
Diag Incident /oracle/11G/diag/rdbms/ora11g/ora11g/incident
Diag Cdump /tmp
Health Monitor /oracle/11G/diag/rdbms/ora11g/ora11g/hm
Default Trace File /oracle/11G/diag/rdbms/ora11g/ora11g/trace/ora11g_ora_3317.trc
Active Problem Count 0
Active Incident Count0
Abb. 2: select * from v$DIAG_INFO.
adrci> show alert -tail
Completed: ALTER DATABASE OPEN
2007-10-27 21:32:54.417000 +02:00
Starting background process CJQ0
CJQ0 started with pid=29, OS id=3301
2007-10-27 21:32:59.125000 +02:00
Setting Resource Manager plan SCHEDULER[0x2C0E]:DEFAULT_MAINTENANCE_PLAN via scheduler window
Setting Resource Manager plan DEFAULT_MAINTENANCE_PLAN via parameter
2007-10-27 21:33:41.629000 +02:00
Begin automatic SQL Tuning Advisor run for special tuning task "SYS_AUTO_SQL_TUNING_TASK"
Sat Oct 27 21:33:42 2007
Logminer Bld: Lockdown Complete. DB_TXN_SCN is
UnwindToSCN (LockdownSCN) is 951511
2007-10-27 21:34:14.682000 +02:00
End automatic SQL Tuning Advisor run for special tuning task "SYS_AUTO_SQL_TUNING_TASK"
adrci> show alert -P "message_text like '%ORA-%'"
ADR Home = /oracle/11G/diag/rdbms/ora11g/ora11g:
*************************************************************************
Output the results to file: /tmp/alert_3474_30564_ora11g_1.ado
adrci>
Abb. 3: Alert.log im ADRCI.
12
ORDIX News 1/2008
Datenbanken
•
Collecting: Der Incident wurde soeben
erzeugt und sammelt noch die Diagnoseinformationen. In diesem Zustand ist der
Incident unvollständig und sollte nicht gepackt werden.
•
Ready: Das Sammeln der Diagnoseinformationen ist abgeschlossen und kann nun
genutzt werden, um das Problem zu analysieren oder um ein Paket für den Oracle
Support zu schnüren.
•
Tracking: Dieser Status zeigt an, dass ein
Datenbankadministrator an diesem Problem arbeitet. Dieser Status muss manuell gesetzt werden.
•
Closed: Dieser Incident gilt als erledigt und
kann vom ADR zum Löschen ausgewählt
werden, sobald die Retention Policy greift.
•
Data Purged: Die betroffenen Dateien
wurden vom Incident gelöscht. In den meisten Fällen können die Dateien auch nicht
mehr genutzt werden, selbst wenn sie sich
noch im File-System befinden.
Fehler
ORA-60X
SEGV, SIGBUS
Ora-4020
ORA-8103
ORA-1410
ORA-1578
ORA-29740
ORA-255
ORA-376
ORA-4030
ORA-4031
ORA-355
ORA356
ORA-353
ORA-7445
Beschreibung
alle Internal Errors
alle System Access Violations
Deadlock on library object
Object no longer exists
invalid ROWID
Data block corrupted
Node eviction
Database is not mounted
File cannot be read at this time
Out of memory
Unable to allocate more bytes of shared memory
The change numbers are out of order
Inconsistent lengths in change description
Log corruption
Operating System exception
Abb. 4: Übersicht möglicher Oracle Fehler.
Glossar
Der Status eines Incident kann direkt mit dem
ADRCI geprüft werden:
ADRCI>show incident –mode detail
Incident Packaging Service (IPS)
Mit IPS können Diagnoseinformationen sehr
einfach und automatisch zu einem ZIP-File zusammengeschnürt werden. Dieses Paket kann
dann an den Oracle Support übertragen werden.
Da die Diagnoseinformationen, die zu einem
kritischen Fehler gehören, mit einer ID getracked werden, müssen die Daten nicht mühsam von Hand zusammengesucht werden.
Der IPS identifiziert anhand der ID die entsprechenden Informationen selbstständig und
fügt diese zu einem Paket zusammen.
XML
Repository
Core-Dump
ASM
CRS
Extensible Markup Language. XML ist eine so genannte Metasprache zur Beschreibung von Dokumenten. Ein Vorteil von
XML ist der vereinfachte Austausch von Daten, da XML-Formate in einer strengen Grammatik definiert werden können
und so die Implementierung von zuverlässigen Schnittstellen
erlauben.
Datenbank zur Aufnahme von Metadaten über die Zielsysteme.
Vorgang, bei dem nach einem ernsten Fehler der aktuelle Programmspeicher in eine Datei geschrieben wird.
Automatic Storage Management. ASM ist ein im Oracle Kernel
integrierter Volume Manager. Er ist ab Oracle 10g verfügbar
und arbeitet nach dem SAME-Prinzip (stripe and mirror every­
thing). ASM kann als zentraler Speicher für RAC-Systeme verwendet werden.
Cluster Ready Service. Eigenständige Oracle Cluster Ware,
die seit Oracle 10g mitausgeliefert wird. Die Oracle Cluster
Ware ist Voraussetzung für den Einsatz von Oracle RAC. Sie
übernimmt die Verwaltung und die Überwachung aller beteilig­
ten Cluster-Knoten. Ab Oracle 10g wurde die CRS in Oracle
Clusterware umbenannt. Seit Oracle 10gR2 ist CRS nur noch
eine Teilkomponente der Oracle Clusterware.
Fazit
Mit ADR hat Oracle ein sehr sinnvolles Werkzeug zur Fehlersuche und -diagnose eingeführt. Viele Aufgaben, die bisher mühsam von
Hand gelöst werden mussten, können nun mit
geringem Aufwand ausgeführt werden.
Selbst der Einsatz in vollautomatischen Skripten kann die Arbeit der Datenbankadministratoren wesentlich vereinfachen.
Frank Späth ([email protected]).
ORDIX News 1/2008
13
Open Source
Alternative Virtualisierungslösungen:
Alles virtuell mit OpenVZ und Virtuozzo
Der Artikel richtet sich an
System­administratoren,
Anwender und Entscheider,
die sich mit Virtualisierung
beschäftigen und für neue
Techniken/Alternativen
interessieren.
In vergangenen ORDIX News Artikeln haben wir schon des Öfteren über Themen aus
den Bereichen der Virtualisierung berichtet. Hierbei wurden vor allem VMware und
XEN, die wohl bekanntesten Virtualisierungslösungen, behandelt. In dieser Ausgabe
berichten wir über OpenVZ und Virtuozzo, zwei Virtualisierungslösungen, die vor allem
im Internetsektor inzwischen sehr stark verbreitet sind.
OpenVZ, das Freie
OpenVZ, die Open Source Virtualisierungslösung (siehe Abbildung 1), erstellt mehrere voneinander isolierte und sichere, virtuelle Umgebungen auf einem einzigen, physikalischen
Linux-Server, die sich „Virtual Environment“
oder „Virtual Private Server“ (VPS) nennen.
OpenVZ sorgt für eine bessere Ausnutzung
der Hardware und stellt dabei sicher, dass
ausgeführte Anwendungen nicht miteinander
in Konflikt geraten. Jedes Virtual Environment
arbeitet und verhält sich genau wie ein eigenständiger Server. Virtual Environments können unabhängig voneinander neu gestartet
werden, haben einen eigenen root-Account
14
ORDIX News 1/2008
sowie eigene Benutzer, IP-Adressen, Speicher, Prozesse, Dateien, Programme, Systembibliotheken und Konfigurationsdateien.
Die Prozesse eines Virtual Environments sind
als Prozesse unter dem Hostsystem sichtbar und alle Prozessoren des Hostsystems
können voll genutzt werden. Das Dateisystem eines Virtual Environments ist ein Unterverzeichnis auf dem Hostsystem, in dem ein
komplettes Linux-Betriebssystem installiert
ist. Beim Starten eines Virtual Environments
wird mit dem Befehl chroot in das entsprechende Unterverzeichnis gewechselt und dort
der normale init-Vorgang gestartet. Da das
Hostbetriebssystem Zugriff auf alle Dateien
Das Netzwerk wird durch OpenVZ weitestgehend virtualisiert. Jedes Virtual Environment
kann mit einer oder mehreren IP-Adressen
konfiguriert werden. Dabei sind die Virtual
Environments voneinander und vom physikalischen Netzwerk isoliert. Dadurch entsteht
Sicherheit, denn es ist z. B. nicht möglich,
den Netzwerkverkehr eines anderen Environments oder des Hosts mit Sniffern mitzuhören. Innerhalb eines Virtual Environments ist
es möglich, Routing, NAT und Firewall-Regeln einzurichten.
OpenVZ unterstützt bis zu 8 CPUs mit 32
oder 64 Bit, 64 GB RAM und ein Maximum
von 100 gleichzeitigen VPS-Instanzen. Dazu
nutzt OpenVZ eine einzige Version des da­
runter liegenden Linux-Kernels für jede seiner VPS-Instanzen, wobei unterschiedliche
Linux-Distributionen zeitgleich laufen können.
Aus diesen Gründen ist OpenVZ ideal für Experimentierfreudige, IT-Integratoren und für
kleinere IT-Unternehmen, in denen die Hardware möglichst gut ausgelastet sein soll und
die ihre Server mit unterschiedlichen Distributionen betreiben möchten. OpenVZ ist unter
der GPL Version 2 lizenziert. Das OpenVZ
Softwarepaket besteht aus einem angepassten Kernel und Tools zur Verwaltung virtueller
Maschinen.
Ressourcenverwaltung
Da alle Virtual Environments denselben Kernel
nutzen, spielt die Ressourcenverwaltung eine
wichtige Rolle. Jedes Virtual Environment darf
nur im Rahmen seiner zugewiesenen Ressourcengrenzen bleiben und die anderen Environments nicht beeinflussen.
Die Ressourcenverwaltung von OpenVZ besteht aus drei Teilsystemen:
•
•
•
Festplattenquota
CPU-Scheduler
User Beancounters
Jede dieser Ressourcen lässt sich im laufenden Betrieb verändern. Es ist hierfür kein
Neustart des Virtual Environments notwendig.
Soll einem Virtual Environment beispielsweise mehr Arbeitsspeicher zugewiesen werden,
root
user
user
Application Software
Virtual Private Server
Virtual Private Server
des Virtual Environments hat, ist der Austausch von Dateien zwischen Host und Gast
leicht durchführbar. Der Austausch von Dateien zwischen den Virtual Environments wird
ganz normal mit Netzwerkdiensten wie NFS,
FTP, SCP etc. durchgeführt.
Physical Server (Hardware Node) #1
Open Source
root
user
user
Application Software
OpenVZ Templates
OpenVZ Layer
Host Operating System
Hardware
Network
Abb. 1: Aufbau von Host und Virtual Environments.
können die entsprechenden Parameter „on
the fly“ geändert werden.
Festplattenquota
Da die Dateien des Virtual Environments unter dem Hostbetriebsystem komplett sichtbar sind, gibt es zwei Ebenen, auf denen der
Festplattenplatz des Environments eingeschränkt werden kann. Die erste Ebene ist
ein Festplattenquota pro Virtual Environment,
welches auf dem Hostbetriebsystem definiert
wird. Die zweite Ebene ist die standardmäßi­ge
Unix-Festplattenquota pro Benutzer und pro
Gruppe innerhalb eines Virtual Environments.
Durch Vergrößern der entsprechenden Festplattenquota kann einem Virtual Environment,
einem Benutzer oder einer Gruppe mehr Festplattenplatz zur Verfügung gestellt werden.
CPU-Scheduler
Auch der CPU-Scheduler in OpenVZ besitzt
eine auf zwei Ebenen aufgeteilte Strategie.
Auf der ersten Ebene entscheidet der Scheduler, welches Virtual Environment den CPUTakt erhält. Der Administrator kann mit dem
Befehl vzctl --cpuunits unterschiedliche CPU-Scheduler Prioritäten an die Virtual
Environments vergeben. Auf der zweiten Ebene entscheidet der standardmäßige LinuxScheduler, welcher Prozess im ausgewählten
Virtual Environment den CPU-Takt bekommen
soll. Dabei werden die Standard Linux Prioritäten (nice-Wert) von Prozessen benutzt.
User Beancounters
Die User Beancounters sind ein Satz von Ressourcenzählern, Limits und Garantien, die pro
Virtual Environment definiert werden können.
Es gibt circa 20 unterschiedliche Parameter,
die vom Administrator sorgfältig ausgewählt
ORDIX News 1/2008
15
Open Source
werden müssen, um alle Aspekte der Virtual
Environment Funktionalität zu berücksichti­
gen. Abbildung 2 zeigt eine Übersicht über
mögliche User Beancounters. Zu den kontrollierten Ressourcen gehören der Arbeitsspeicher und verschiedene Kernel-Objekte, wie
IPC Shared Memory Segments, NetzwerkBuffer etc. Die eingestellten Werte können unter /proc/user_beancounters innerhalb
des Virtual Environments eingesehen werden.
Das Feld uid in Abbildung 2 gibt die numeri­
sche Zuordnung des Virtual Environments an.
uid resource
held maxheld barrier
limit failcnt
123:kmemsize
836919 1005343 2752512
2936012
0
lockedpages
0
0
32
32
0
privvmpages
4587
7289
49152
53575
0
shmpages
39
39
8192
8192
0
dummy
0
0
0
0
0
numproc
20
26
65
65
0
physpages
2267
2399
0 2147493647
0
vmguarpages
0
0
6144 2147493647
0
oomguarpages
2267
2399
6144 2147493647
0
numtcpsock
3
3
80
80
0
numflock
3
4
100
110
0
numpty
1
1
16
16
0
numsiginfo
0
1
256
256
0
tcpsndbuf
0
0 319488
524288
0
tcprcvbuf
0
0 319488
524288
0
othersockbuf
6684
7888 132096
336896
0
dgramrcvbuf
0
8372 132096
132096
0
numothersock
8
10
80
80
0
dcachesize
87672
92168 1048576
1097728
0
numfile
238
306
2048
2048
0
dummy
0
0
0
0
0
dummy
0
0
0
0
0
dummy
0
0
0
0
0
numiptent
10
16
128
128
0
Abb. 2: Übersicht über verfügbare User Beancounters.
Weiterhin werden immer 5 Werte für jeden
einzelnen Parameter angezeigt:
•
held: Wert der aktuellen Auslastung.
•
maxheld: Maximalwert der Auslastung, der
während der Laufzeit des Environments erreicht wurde.
•
barrier: Soft-Limit. Wert für die garantiert
zugesicherten Ressourcen.
•
limit: Hard-Limit. Ressourcenbeschränkung, die nicht überschritten werden darf.
•
failcnt: Der Fehlerzähler zeigt an, wie oft
das Limit schon überschritten worden wäre, aber aufgrund der Beschränkung nicht
überschritten werden konnte. Hier würde
man sehen, ob gegebenenfalls das Limit
zu gering gesetzt wurde.
Die Bedeutungen von Soft-Limit und Hard-Limit unterscheiden sich von Parameter zu Parameter. Generell gilt: Wenn irgendeine Ressource das Soft-Limit überschreitet, wird der
entsprechende Fehlerzähler erhöht. Wird das
Hard-Limit erreicht, kann von der entsprechen­
den Ressource nicht mehr reserviert werden.
Live-Migration
Die Live-Migration ist eine Funktionalität von
OpenVZ, die es ermöglicht, ein Virtual Environment von einem physikalischen Server
auf einen anderen zu migrieren, ohne dabei
das Virtual Environment komplett beenden zu
müssen. Das Virtual Environment wird stattdessen eingefroren und alle Prozesse werden
in einer Datei gespeichert. Dieser Vorgang
des Einfrierens wird Checkpointing genannt.
Anschließend wird die gespeicherte Datei auf
eine andere Maschine übertragen und alle
Prozesse werden wiederhergestellt.
Die Übertragung des Virtual Environments auf
ein anderes Hostsystem nimmt nur einige Sekunden in Anspruch, was vor allem vom gemeinsam genutzten Medium (SAN, NAS etc.)
abhängig ist. Für den Benutzer äußert sich die
Migration nur mit einer kleinen Verzögerung,
verursacht aber keine Downtime. Die Tatsache, dass dabei der komplette Status des
Virtual Environments gespeichert wird, wie
zum Beispiel geöffnete Netzwerkverbindun­
gen, macht den ganzen Migrationsprozess
für den Benutzer völlig transparent.
Abb. 3: Administrationsmenü von Virtuozzo.
16
ORDIX News 1/2008
Einsatzgebiete der Live-Migration wären z. B.
Software-Wartungsarbeiten oder ein Upgrade
Open Source
eines Servers, ohne alle Environments komplett beenden zu müssen. Wenn eine Datenbank oder eine andere Applikation in einem
Virtual Environment mehr Arbeitsspeicher
oder CPU-Ressourcen benötigt, das aktuelle
Hostsystem aber keine Ressourcen mehr frei
hat, kann das Virtual Environment auf ein leistungsstärkeres System „Live“ migriert werden.
Dort können die entsprechenden Limits vergrößert werden.
Virtuozzo, das Kommerzielle
Virtuozzo ist das kommerzielle Produkt aus
dem Hause SWsoft Inc., das auf Basis von
OpenVZ entwickelt und weiterentwickelt wurde. Das Projekt OpenVZ wird von SWsoft
unterstützt und vorangetrieben. Dabei nutzt
SWsoft das Open Source Produkt als exzellente Testmöglichkeit für künftige Entwicklungen der kommerziellen, umfangreicheren
Produktlinie. Die ur­sprünglichen Hauptziele
bei der Entwicklung von Virtuozzo waren
Leistungsfähigkeit, möglichst wenig Serverlast zu erzeugen und eine möglichst einfache
Verwaltung der Gastsysteme.
Im Gegensatz zu OpenVZ adressiert Virtuozzo
(siehe Abbildung 3) produktive IT-Umgebungen
und bietet eine höhere Skalierbarkeit, Performance sowie eine größere Vielfalt an Administrationswerkzeugen. Insgesamt gewähr­leistet
Virtuozzo ein einfacheres Management und
eine bessere Ausnutzung vorhandener Hardware. Außerdem läuft Virtuozzo auf Linux und
auch auf Windows Servern.
Auch die Einsatzszenarien sind bei Virtuozzo
etwas breiter. Es werden bis zu 32 Prozesso­
ren unterstützt, die auf 32-Bit oder 64-Bit-Architektur laufen und Zigtausende an virtuellen
Umgebungen erlauben. Während bei OpenVZ
Administra­tion, Monitoring und Inbetriebnahme über die Kommandozeile gesteuert werden, beinhaltet Virtuozzo zusätzlich GUI- und
Browser-basierte Managementwerkzeuge.
Vergleich mit anderen Techniken
Im Vergleich zu den Virtualisierungslösungen
von VMware oder XEN bietet OpenVZ weniger Flexibilität bezüglich der Auswahl von
Gast-Betriebssystemen. Sowohl als Gast- als
auch als Host-Betriebssystem kann nur ein
Linux-Derivat zum Einsatz kommen. Andererseits bietet die Technologie von OpenVZ
bessere Leistungsfähigkeit, Skalierbarkeit,
höhere Dichte, dynamische Ressourcenverwaltung und einfachere Administration. Laut
Glossar
Virtual Environment oder
Virtual Private Server (VPS)
Quota
Bezeichnung der Gastsysteme unter OpenVZ, welche auf derselben Hardware ausgeführt werden.
Mit Festplattenquotas kann bestimmt werden, wie
viel Speicherplatz ein Benutzer oder eine Gruppe im
Dateisystem belegen darf.
den OpenVZ-Entwicklern verliert das System
durch die Virtualisierung nur 1 - 3 Prozent der
Leistung gegenüber einem System, das allein
auf einer physikalischen Hardware läuft.
Basierend auf seiner Architektur haben OpenVZ und Virtuozzo einen anderen Ansatz, Server zu virtualisieren als Konkurrenzprodukte,
die auf Hardwareebene virtualisieren oder
emulieren. Bei OpenVZ/Virtuozzo wird ein Betriebssystem gestartet, indem einfach nur weitere Prozesse gestartet werden. Das macht
sich vor allem bei der Geschwindigkeit positiv
bemerkbar, hat aber den Nachteil, dass Hostund Gastsystem gleich sein müssen.
Manch andere Virtualisierungslösung hat hingegen den Nachteil, dass sie die einzelnen Instanzen noch zu wenig trennen kann, während
die Technik von Virtuozzo ausschließt, dass
durch den Absturz eines einzelnen Environments die anderen Instanzen beeinträchtigt
werden.
Fazit
OpenVZ und Virtuozzo sind somit für Entwickler weniger geeignet, da diese meist Testumgebungen mit verschiedenen Betriebssystemen im Einsatz haben.
Kommt man jedoch mit nur einem Betriebssystem aus, wie es häufig im Bereich Webhosting der Fall ist, ist man mit beiden Produkten gut beraten. Seit 2001 läuft Virtuozzo
z. B. bei verschiedenen Providern mit hunderten von Virtual Environments. Dieser Erfolg spricht für sich. Ob man sich aber der
Meinung von SWsoft anschließen möchte,
die einfache Verwaltung und hohe Leistung
insbesondere von Virtuozzo hebe die Einschränkung „nur ein Betriebssystem zu virtualisieren“ auf, da die meisten virtuellen Server
sowieso unter dem gleichen Betriebssystem
laufen, wie der Host selbst, bleibt natürlich jedem selbst überlassen.
Christian Fertsch ([email protected]).
ORDIX News 1/2008
17
Datenbanken
IBM DB2 UDB 9.1 „Viper“ (Teil V):
Automatisierung durch
„dynamischen Speicher“
Dieser Artikel richtet sich an
Datenbank- und Systemadministratoren, die sich mit den neuen
Funktionen der DB2-Datenbank
vertraut machen wollen.
Wie in der letzten Ausgabe angekündigt, schauen wir uns in dieser ORDIX News die
„dynamische Speicherung“ aus dem Bereich der automatischen Datenbankverwaltung
an. Was in der deutschen Übersetzung oft als „dynamischer Speicher“ bezeichnet wird,
ist in der DB2-Originaldokumentation als „Automatic Storage“ wiederzufinden. Diese
Bezeichnung findet sich auch in der Syntax der verschiedenen DB2-Kommandos wieder. Wir verwenden im Folgenden den Begriff „dynamischer Speicher“.
Rückblick Tablespaces
Beim Anlegen einer Datenbank werden immer drei Default Tablespaces angelegt: SYSCATSPACE, TEMPSPACE und USERSPACE.
Für alle weiteren Tablespaces, die nachträglich von Hand erstellt werden, müssen explizit Container mit der Klausel MANAGED BY
SYS­TEM (SMS) oder MANAGED BY DATA­
BASE (DMS) des Kommandos CREATE
TABLESPACE benannt werden.
DMS
DMS steht für „Database Managed Space“ und
wird bei der Container-Definition durch die Klausel MANAGED BY DATABASE angegeben.
Der Speicherplatz eines DMS-Bereichs wird
vom Datenbankmanager verwaltet und sofort
nach Anlegen eines Containers komplett reserviert. Dieser Speicherplatz steht dann ausschließlich der Datenbank zur Verfügung. Vom
Datenbankadministrator kann für einen Container entweder eine Datei oder eine unformatierte Einheit (Raw Device) angegeben werden.
SMS
SMS steht für „System Managed Space“ und
wird bei der Container-Definition durch die
Klausel MANAGED BY SYSTEM an­gegeben.
Der Speicherplatz eines SMS-Bereichs wird
vom Betriebssystem verwaltet und nur so weit
reserviert, wie er benötigt wird. Der Daten-
18
ORDIX News 1/2008
bankadministrator gibt lediglich das Verzeichnis für die Container vor. Welche Dateien dann
letzten Endes unterhalb dieses Verzeichnisses angelegt werden, wird dem Datenbanksystem überlassen. Der Zugriff darauf erfolgt
aber immer über das Betriebssystem.
Wird beispielsweise eine Tabelle mit Daten
befüllt, so wird auch erst zu diesem Zeitpunkt
der Speicherplatz extern für Extent auf der
Festplatte reserviert. Und dann auch nur in
dem Maße, wie er für die neuen Daten tatsächlich benötigt wird.
Datenbanken mit dynamischem Speicher
Im Gegensatz zur festen Definition der Container eines Tablespace über die Syntaxklauseln
MANAGED BY SYSTEM oder MANAGED BY
DATABASE werden die Container beim Einsatz von dynamischem Speicher vom Daten­
bankmanager angelegt und verwaltet. Ob
eine Datenbank mit dynamischem Speicher
arbeitet oder nicht, wird beim Anlegen der Datenbank festgelegt. Eine nachträgliche Änderung, sowohl das Einschalten als auch das
Ausschalten, ist nicht mehr möglich.
Anstelle der Container bzw. der Pfade der
Container werden bei der Verwendung von
dynamischem Speicher nur Speicherpfade
bzw. Gruppen von Speicherpfaden definiert.
Datenbanken
Dahinter verbirgt sich nichts anderes als Verzeichnisse im Dateisystem.
Wird eine Datenbank mit dynamischem Speicher angelegt, werden die drei Default Tablespaces ebenfalls mit dynamischem Speicher
angelegt. Ab der Version 9.1 ist die Verwendung von dynamischem Speicher beim Anlegen einer Datenbank Standard. Soll eine Datenbank ohne dynamischen Speicher angelegt
werden, so muss man bei dem Kommando
CREATE DATABASE die Syntaxerweiterung
AUTO­MATIC STORAGE NO verwenden.
Die Speicherpfade, die bei der Verwendung
von dynamischem Speicher definiert werden
können, sind der Datenbankpfad und der Speicherpfad. Die für den Datenbank- bzw. Speicherpfad angegebenen Verzeichnisse müssen
vorhanden und vom Eigentümer der Instanz
beschreibbar sein. Mit dem Kommando ALTER
DATABASE ADD STORAGE kann der Speicherpfad um weitere Pfade erweitert werden.
Datenbankpfad
Im Datenbankpfad werden vom Datenbankmanager interne Verwaltungsinformationen
für die Datenbank gespeichert. Wird beim Anlegen einer Datenbank der Datenbankpfad
nicht definiert, so wird dafür der Standarddatenbankpfad (Datenbankmanager Konfigura­
tionsparameter DFTDBPATH) verwendet, der
durch die Klausel DBPATH ON beim Anlegen
einer Datenbank festgelegt wird. Wird beim
Anlegen der Datenbank nur der Speicherpfad
mit der Klausel ON definiert, so wird für den
Datenbankpfad der erste Pfad des Speicherpfades verwendet.
Speicherpfad
Im Speicherpfad werden die eigentlichen Daten (Tabelleninhalte und Indizes) gespeichert.
Auch für den Speicherpfad wird als Standard­
wert der Standarddatenbankpfad (Datenbankmanager Konfigurationsparameter DFTDBPATH) verwen­det.
Die Abbildungen 1 - 4 zeigen verschiedene
Beispiele zum Anlegen einer Datenbank mit
dynamischem Speicher.
Tablespaces mit dynamischem Speicher
Bei Datenbanken ohne dynamischen Speicher müssen die Container den Tablespaces
mit MANAGED BY SYSTEM (SMS) und MANAGED BY DATABASE (DMS) fest zugeordnet werden. Für dynamischen Speicher gibt
es beim Kommando CREATE TABLESPACE
die Syntaxerweiterung MANAGED BY AUTO-
db2>
db2> CREATE DATABASE MYDB1
db2>
Abb. 1: Anlegen einer Datenbank ohne Definition von Datenbank- und Spei­
cher­pfad. Es wird der Wert des Konfigurationsparameters DFTDBPATH des
Datenbankmanagers verwendet.
db2>
db2> CREATE DATABASE MYDB2 ON /db/pfad1
db2>
Abb. 2: Anlegen einer Datenbank unter Angabe eines Speicherpfades (ON-Klausel).
Dieser Wert gilt auch für den Datenbankpfad.
db2>
db2> CREATE DATABASE MYDB3 ON /db/pfad1, /db/pfad2
db2>
Abb. 3: Anlegen einer Datenbank unter Angabe von zwei Pfaden für den Spei­
cherpfad (ON-Klausel). Als Datenbankpfad wird der erste Pfad verwendet.
db2>
db2> CREATE DATABASE MYDB4 ON /db/pfad1 DBPATH ON /db/pfad2
db2>
Abb. 4: Anlegen einer Datenbank unter Angabe eines Speicherpfades mit der
Klausel ON und Angabe eines Datenbankpfades mit der Klausel DBPATH ON.
MATIC STORAGE. Es ist auch möglich, das
Kommando ohne eine MANAGED BY Klausel zu verwenden. Dadurch wird für den neuen Tablespace implizit dynamischer Speicher
verwendet.
Die Abbildungen 5 - 8 zeigen verschiedene
Beispiele zum Anlegen von Tablespaces mit
dynamischem Speicher. Diese gelten allerdings nur für Datenbanken, die ebenfalls mit
dynamischem Speicher angelegt wurden.
Dynamischer Speicher - SMS oder DMS?
Auch für den dynamischen Speicher gibt es die
beiden Varianten SMS bzw. DMS. Allerdings
ist die Verwendung fest vorgegeben. Reguläre
und Large Tablespaces werden als DMS mit
Datei-Containern angelegt. Dagegen werden
Temporäre Tablespaces als SMS mit Verzeichnis-Containern angelegt. Diese Zuordnung gilt
für die Version 9.1 und kann sich gemäß der
ORDIX News 1/2008
19
Datenbanken
IBM-Dokumentation in zukünftigen Versionen
ändern.
<ERW> kann sein:
•
Namen der Container
TMP System-Tablespace für temporäre
Tabellen
•
UTM Benutzer-Tablespace für temporäre
Tabellen
•
•
USR Benutzer oder reguläre Ausdrücke
Die vom Datenbankmanager im Speicherpfad angelegten Container haben den Namen: <Speicherpfad>/<Instanz>/NODE####/
<Datenbank>/T#######/C#######.<ERW>
Dabei ist:
•
•
<Speicherpfad>Der Speicherpfad
•
<Instanz>
Die Instanz, unter der die Datenbank angelegt ist.
NODE####
Die Datenbankpartitions-
nummer (z. B. NODE0000)
<Datenbank>
Der Name der Datenbank
T#######
Die Tablespace-ID
C####### Die Container-ID
<ERW>
Der CAT-Systemkatalog
•
•
•
•
LRG LOB
Dynamischer Speicher RESTORE DATABASE
Beim Restore einer Datenbank mit dynami­
schem Speicher können der Datenbankund der Speicherpfad neu definiert werden.
Dies entspricht dem umgeleiteten Restore
(Redirected Restore) einer Datenbank ohne
dynamischen Speicher. Dazu gibt es beim
RESTORE DATABASE die Klauseln TO, ON
und DBPATH ON.
Für den Datenbankpfad gilt dabei Folgendes:
db2>
db2> CREATE TABLESPACE MYTBS1
db2>
db2> CREATE TABLESPACE MYTBS2 MANAGED BY AUTOMATIC STORAGE
db2>
Abb. 5: Die Tablespaces MYTBS1 und MYTBS2 werden mit dynamischem
Speicher angelegt.
db2>
db2> CREATE TEMPORARY TABLESPACE TMPTBS
db2>
Abb. 6: Der system-temporäre Tablespace TMPTBS wird mit dynamischem
Speicher angelegt.
db2>
db2> CREATE USER TEMPORARY TABLESPACE UTMPTBS
MANAGED BY AUTOMATIC STORAGE
db2>
Abb. 7: Der benutzer-temporäre Tablespace UTMPTBS wird mit dynamischem
Speicher angelegt.
db2>
db2> CREATE LONG TABLESPACE LONGTBS
db2>
Abb. 8: Der Large-Tablespace LONGTBS wird mit dynamischem Speicher
angelegt.
20
ORDIX News 1/2008
Ist eine Datenbank mit dem gleichen Namen
auf dem System schon vorhanden und soll
durch Restore ersetzt bzw. überschrieben
werden, kann der Datenbankpfad nicht geändert werden. Mit den Klauseln ON bezie­
hungsweise DBPATH ON wird der Datenbankpfad definiert, der für die wiederhergestellte
Datenbank verwendet werden soll.
Wird nur der Speicherpfad angegeben, so
wird für den Datenbankpfad der erste Speicherpfad verwendet. Wird keine der Klauseln
TO, ON oder DBPATH ON angegeben, wird
für den Datenbankpfad der Wert des Parameters DFTDBPATH der Konfiguration des Datenbankmanagers verwendet.
Für den Speicherpfad gibt es nur die beiden
Varianten mit ON-Klausel und ohne ON-Klausel. Wird keine ON-Klausel verwendet, so werden die Speicherpfade des Backup Images
verwendet. Durch Verwendung der ON-Klausel, werden die Speicherpfade für die wiederherzustellende Datenbank neu definiert.
Ob eine gesicherte Datenbank mit oder ohne
dynamischem Speicher gearbeitet hat und
welche Speicherpfade gegebenenfalls verwendet wurden, kann mit dem Kommando
db2ckbkp –s ermittelt werden. Dem Kommando wird neben der Option -s das Backup
Image als Parameter übergeben. Die Ausgabe liefert unter anderem Informationen über
die Speicherpfade und ob dynamischer Speicher verwendet wurde.
Datenbanken
Überwachung des Speicherplatzes
Wie viel Speicherplatz durch den dynamischen
Speicher belegt ist, ermittelt man mit einem
Snapshot auf die Datenbank. Das Kommando
GET SNAPSHOT FOR DATABASE ON <Datenbank> liefert die Anzahl der für den dynamischen Speicher definierten Pfade.
Für jeden Pfad werden neben dem Namen
eine Filesystem-ID und der freie Speicher in
dem Speicherpfad ausgegeben. Zudem wird
die Größe des Dateisystems ermittelt, in dem
der Speicherpfad liegt und wie viel Speicher
darin schon verwendet wird.
Glossar
Tablespace
Logische Ebene zwischen der Datenbank und den Tabellen der Datenbank. Hinter einem Tablespace liegt die physikalische Zuordnung des
Speicherplatzes. So erfolgt die Zuordnung des physikalischen Speicherplatzes einer Tabelle über das ihr zugeordnete Tablespace. Dabei
gibt es drei verschiedene Arten von Tablespaces:
•
•
•
Container
Reguläre Tablespaces dienen der Aufnahme von Daten, die nicht
vom Typ LONG oder LOB sind (keine binären Objekte).
Large Tablespaces dienen der Speicherung von binären Objekten
in einer Datenbank (z. B. Videos oder Textdokumente).
Temporäre Tablespaces dienen der Aufnahme von Daten, die nur
temporär gespeichert werden müssen.
Ein Container ist ein Begriff, der die Zuweisung von Plattenplatz zu
einem Tabelspace beschreibt.
Es gibt folgende Arten von Containern:
• eine Datei im Filesystem
• ein Verzeichnis im Filesystem
• eine unformatierte Einheit (RAW Device)
Einschränkungen
Bei der Verwendung von dynamischem Speicher sind einige Einschränkungen zu beachten:
•
Ob dynamischer Speicher verwendet wird
oder nicht, wird beim Anlegen der Datenbank festgelegt und kann nachträglich nicht
mehr geändert werden.
•
Die verwendeten Speicherpfade müssen
absolute Pfade sein.
•
Reguläre und LOB-Tablespaces werden
bei der Verwendung von dynamischem
Speicher immer als DMS angelegt. Einzelne Container können dabei nicht definiert werden.
•
Der Standardwert für die automatische
Größenanpassung der Container ist ON.
Somit ist die Größe der regulären und der
LOB-Tablespaces nur durch das Dateisystem beschränkt. Die Startgröße für einen
Container kann über die Klausel INITIALSIZE angegeben werden. Die Anfangsgröße für LOBS ist 32 MB.
•
Operationen, die auf DMS- oder SMS-Containern ausgeführt werden können, wie
z. B. ALTER TABLESPACE (ADD, DROP,
BEGIN NEW STRIPE SET usw.) sind bei
der Verwendung von dynamischem Speicher nicht möglich.
•
Wie bereits beschrie­ben, können bei einem
Restore nur der Datenbank- und der Speicherpfad geändert werden. Einzelne Container können nicht neu definiert werden.
Somit ist der Befehl SET TABELSPACE
CONTAINERS nicht möglich.
Fazit
Die „dynamische Speicherung“ gehört mit Sicherheit zu den interessantesten Neuerungen
aus dem Bereich der automatischen Datenbankverwaltung. Sie bringt sowohl Vor- als
auch Nachteile mit sich. So muss sich der Datenbankadministrator zum Beispiel nicht mehr
um die Verwaltung der Container kümmern.
Diese Aufgabe wird ihm vom Datenbanksys­
tem abgenommen. Auch ein umgeleiteter Restore ist um einiges einfacher und kann sogar
in einem Schritt durchgeführt werden.
Bei der Verwendung von dynamischem Speicher gibt der Datenbankadministrator jedoch
die Möglichkeit aus der Hand, eine Zuordnung auf Ebene der physikalischen Platten
vorzunehmen. Dies ist beim Einsatz von SAN
kaum möglich.
Die Verwendung von RAW Devices für die
Container ist bei der dynamischen Speicherung nicht mehr möglich. Da die meisten Datenbankadministratoren dies bis jetzt auch
nicht verwendet haben, ist das sicher kein
großes Manko. Der freiwillige Verzicht auf bis
zu 10 Prozent der I/O-Leistung sollte allerdings dabei bedacht werden.
Haben Sie Fragen zu diesem Thema? Dann
sprechen Sie uns an!
Holger Demuth und Thorsten Schuhmacher
([email protected]).
ORDIX News 1/2008
21
Java/JEE
Mit Lasttests zur performanten
JEE-Anwendung
Dieser Artikel richtet sich
sowohl an Entscheider als
auch an Projektleiter, die
größere JEE-Projekte planen
und durchführen.
Lasttests gehören zu jedem größeren Entwicklungsprojekt dazu, wie der TÜV zum Auto. Die Tests sind nicht gerade beliebt, aber unerlässlich, um zu alltagstauglichen, robusten und performanten Software-Anwendungen zu kommen - genauso wie zu verkehrssicheren Autos. Lasttests überprüfen die Einhaltung von zwei wichtigen Anforderungen an ein Software­system: Stabilität und Performanz. Dieser Artikel stellt anhand
von Erfahrungen in einem Kundenprojekt grundlegende Aspekte und Untersuchungs­
methoden zu dieser Thematik vor.
Das Kundenprojekt
•
Oracle als Datenbank
In diesem Projekt wird eine JEE-Client-Server-Anwendung entwickelt, die aus einer Altanwendung entstanden ist und an vielen Stellen auf neuere Technologien aufsetzt, z. B.:
•
.Net und JScript für den Client-Anteil
•
•
22
ORDIX News 1/2008
JEE als Kerntechnologie mit allen Facetten
(hieß zu Projektbeginn übrigens noch J2EE):
◦ WEB Container mit JSP/Servlets
◦ EJB Container mit EJB für die Business Logik
◦ Apache Webserver für das Loadbalan­
cing
CORBA für die Anbindung von LegacySystemen
Das komplexe Gesamtsystem hat inzwischen
erfolgreich die Einführung in den Produktivbe­
trieb geschafft. Der mehrmonatige Betrieb ohne
gravierende Performanzprobleme ist nicht zuletzt den umfangreichen und produktivbetriebsnahen Lasttests zu verdanken.
Was sind eigentlich Lasttests?
Für eine treffende Definition von Lasttests liefert
uns Wikipedia eine aussagekräftige Beschreibung [1]:
Java/JEE
„Unter einem Lasttest versteht man einen Softwaretest, mit dem eine zu erwartende, auch
extreme Last auf dem laufenden System erzeugt und das Verhalten desselbigen beobachtet und untersucht wird. Dazu kann eine Simulation eingesetzt werden. Ziel dabei ist es,
1.
Fehler aufzudecken, die im funktional
orientierten Systemtest/Integrationstest
nicht gefunden wurden.
2.
Erfüllung nichtfunktionaler Anforderungen, wie z. B. geforderte Antwortzeiten
sowie Mengenverarbeitungen, für den
Produktivbetrieb nachzuweisen.“
Zeitliche Einbettung in die Projektphase
Es gibt eine prinzipielle Schwierigkeit, die
Durchführung von Lasttests formal sauber
und korrekt in den Terminplan von Entwicklungsprojekten zu platzieren.
Denn eigentlich darf ein Lasttest erst dann
durchgeführt werden, wenn die funktionale
Korrektheit dokumentiert ist, d. h. die fachliche Abnahme der Anwendung vorliegt. Wenn
dann Lasttests stattfinden, die ihrerseits Performanzschwachstellen aufdecken, geht es
wieder zurück in die Entwicklung und das Prozedere „Fachliche Abnahme mit anschließen­
den Lasttests“ beginnt von vorn.
In der Praxis findet deshalb häufig eine verzahnte bzw. überlappende Zeitplanung statt.
So können Fehler aus den beiden Phasen
„Abnahme“ und „Lasttest“ gesammelt und in
einem Topf zusammengefasst werden. Diese
Vorgehensweise spart Zeit in der Entwicklung
bzw. Fehlerbehebung, da sich die Anzahl der
Termine für Bereitstellung und Lieferung minimiert. So wurde es auch in dem von ORDIX
unterstützten Kundenprojekt praktiziert. Den
schematischen Zeitplan des Projekts mit den
wichtigsten Phasen zeigt Abbildung 1.
Performanz: Antwortzeiten und Durchsatz
Die Performanz einer Anwendung kann man
unter verschiedenen Gesichtspunkten betrachten. Da geht es zum einen um das Kriterium des Antwortzeitverhaltens in der Benutzer­
i­nteraktion. Dahinter steckt die Frage: „Wie
lange muss der Benutzer einer Anwendung
auf die Antwort einer von ihm angestoßenen Transaktion warten?“ Zum anderen ist
Performanz aber auch häufig aus einer über­
geordneten Sichtweise mit der Frage­stellung
assoziiert: „Wie viele Transaktionen pro Zeit-
Abb. 1: Projektplan mit zeitlicher Einordnung der Lasttestphase.
einheiten bewältigt das System?“ Diese Größe wird auch als Durchsatz bezeichnet. Beide
Fragestellungen, die der individuellen Antwortzeit und die des globalen Durchsatzes,
hängen eng miteinander zusammen.
In unserem Kontext gelangte das Thema Performanz vorwiegend unter dem Aspekt Antwortzeitverhalten in die Untersuchung. Die zu
testende Anwendung ist für die Servicemitarbeiter des Kunden konzipiert, die damit ihre
Auftrags­vorbereitung und -abarbeitung sowie den Tagesabschluss und weitere Verwaltungsaufgaben, erledigen. Diese Geschäftsfälle und ihre zügige Abarbeitung sind für den
Kunden natürlich von großem Interesse und
somit standen sie während der Lasttests unter spezieller Beobachtung.
Messung, Darstellung und Bewertung
Die Lasttests wurden mit dem Tool JMeter [2]
erstellt, einem Framework zur Erstellung von
Simulatoren, die Client-Aktivitäten in sehr großem Umfang und hochparallelem Ablauf erlauben. JMeter gestattet es darüber hinaus,
einzelne Client-Aktionen genau zu protokollieren und zu messen, so dass einer gezielten
Analyse nichts im Wege steht [3]. Die Durchführung von einzelnen Lasttestläufen fand zu
bestimmten Tageszeiten statt und ging meistens über einen Zeitraum von vier Stunden.
Die Zeitdauer eines Geschäftsfalls, wie z. B.
„Auftrag laden“, ist als einzelner Punkt in einem
Diagramm eingetragen - an dem Zeitpunkt, als
er ausgeführt wurde. Die Punktwolke setzt sich
aus allen gemessenen Zeiten für diesen Geschäftsfall zusammen und die schwarze Linie
stellt den gleitenden Durchschnitt dar. Die Zeitskala (8:00 - 12:00 h) gibt die Dauer dieses
konkreten Lasttestlaufs an (siehe Abbildung 2).
ORDIX News 1/2008
23
Java/JEE
In Abbildung 3 sind die wichtigen Geschäftsfälle oder Client-Aktionen aufgelistet, die in
den Lasttestläufen simuliert wurden. Typische
Durchläufe dauerten jeweils vier Stunden und
die Gesamtanzahl aller simulierten Geschäfts­
fälle pro Testlauf erreichte ca. 200.000. Von
jedem einzelnen Geschäftsfall wurden die
Dauer und der Zeitpunkt der Rückkehr gemessen. Die interessanten statistischen Größen sind der Mittelwert der Antwortzeiten pro
Geschäftsfall in Sekunden und der Anteil der
Geschäftsfälle, die eine vorgegebene Zeitdauer unterschreiten.
Laufzeiten von GF 3: "Auftrag laden"
Server Request Zeiten in Sekunden
50
45
40
35
30
25
20
15
10
5
0
8:00
8:20
8:40
9:00
9:20
9:40
10:00
10:20
10:40
11:00
11:20
11:40
12:00
Tageszeit
Abb. 2: Punktwolke der Einzeldauern von konkreten Geschäftsfällen im Lasttest.
Mittelwert (sec)
Anteil <= X sec
Gewichtung
1 Client: Anmelden
m1
A1 (<= 5 sec)
(1- A1) / 0,5
2 Edda: Liste laden
m2
A2 (<= 10 sec)
(1- A2) / 0,5
3 Client: Auftrag laden
m3
A3 (<= 10 sec)
(1- A3) / 0,5
4 Client: Auftrag abschließen
m4
A4 (<= 10 sec)
(1- A4) / 0,5
5 Client: Tagesabschluss
m5
A5 (<= 5 sec)
(1- A5) / 0,5
Abb. 3: Mittelwerte der Zeitdauern und Vorgaben, welche Antwortzeiten bei
einzelnen Geschäfts­fällen einzuhalten sind. Die Spalte Gewichtung ist für
die Bewertung der Testläufe von Bedeutung.
CPU-Auslastung: Server 1
100
90
CPU in Prozent
80
%usr
%sys
70
60
50
40
30
20
12:00
11:50
11:40
11:30
11:20
11:10
11:00
10:50
10:40
10:30
10:20
10:10
9:50
10:00
9:40
9:30
9:20
9:10
9:00
8:50
8:40
8:30
8:20
8:10
0
8:00
10
Abb. 4: CPU-Auslastung für einen Server im Zeitraum eines Lasttestlaufs.
24
ORDIX News 1/2008
Zusammen mit einem Netzplandiagramm wer­
den daraus die Kriterien für „erfolgreiche“ Lasttests abgeleitet. Aber dazu später mehr.
Stabilität
Mit Stabilität oder Robustheit ist die Ausfallwahrscheinlichkeit einer Anwendung gemeint. Ausfälle können durch eine Vielzahl
von Gründen auftreten, häufig durch schiere
Überlastung der Prozessoren. Daher stand
die Überwachung der CPU-Auslastung in den
verschiedenen Server­systemen bei unseren
Lasttests im Vordergrund, von denen eine
Auslastungskurve beispielhaft in Abbildung 4
zu sehen ist.
Von Interesse in der hier zugrunde liegenden
Gesamtanwendung sind vier unterschiedliche
Server­systeme, die sich vom Typus her in jeweils zwei Application Server und zwei Datenbank Server aufteilen. Bei beiden Datenbank
Servern und einem der Application Server
handelt es sich um Mehr-CPU-Maschinen
des Herstellers Fujitsu Siemens Computers
mit dem Betriebssystem Sun Solaris 8. Hinter
dem anderen Application Server verbirgt sich
in Wirklichkeit eine Serverfarm, bestehend
aus bis zu 40 Windows 2000 Servern. In der
Lasttestumgebung kommt eine analoge Serverlandschaft zum Einsatz, die allerdings von
der Ausstattung her „nur“ über ca. 20 Prozent
der Hardware-Ressourcen des Produktivbetriebs verfügt.
Auch diese Messergebnisse der CPU-Auslastungen von allen Servern müssen wieder
zusammen­gefasst und verdichtet werden, was
beispielhaft die Abbildung 5 für einen konkre­
ten Lasttestlauf zeigt. Für die CPU-Auslas­
tung sind als statistische Größen besonders
der Mittel- und der Maximalwert, aber auch
der prozentuale Anteil der Gesamtzeit interes­
sant, bei der die CPU-Auslastung mehr als 50
Prozent beträgt.
Java/JEE
Ergebnisse ins rechte Licht rücken
Nachdem wir nun eine ganze Reihe von Mess­
ergebnissen und Zusammenfassungen ermittelt und statistische Aufbereitung betrieben
haben, fehlt noch der letzte Schritt der Bewertung. Diese muss übersichtlich und vor allem
aussagekräftig sein, da man in typischen Lasttestphasen mehrere Dutzend verschiedener
Testläufe durchführt und diese eine rasche
Einschätzung und Kategorisierung benötigen. Für diesen Schritt haben wir Netzplandiagramme aus MS Excel verwendet (siehe
Abbildung 6).
In dem Netzplandiagramm „Laufzeiten“ sind
die Werte aus der Spalte Gewichtung aus Abbildung 3 eingetragen, die zwischen 0 und 1
liegen können. Das globale Kriterium dafür, ob
ein Lasttestlauf in dieser Kategorie erfolgreich
war oder nicht, lautet: „Es darf keine Ausreißer im Netzplan geben“. D. h. im Fall der Lauf­
zeiten: Kein Wert darf > 0,5 sein, was durch
die rote Linie markiert ist. Bezogen auf den
Geschäftsfall „1 Client: Anmelden“ aus Abbildung 3 bedeutet das z. B.: Nicht mehr als 25
Prozent aller Anmeldungen dürfen länger als
5 Sekunden dauern.
Analog dürfen keine Ausreißer bei den CPUAuslastungen auftreten, deren Netzplandiagramm mit den Werten der Spalte Anteil > 50 %
aus Abbildung 5 gefüllt ist. Im vorliegenden
Fall wurde der konkrete Lasttest als gerade
noch bestanden bewertet, obwohl es eine
kleine Überschreitung der erlaubten Laufzeit
in einem Geschäftsfall 1 gibt.
So wurden etliche Runden gedreht - mit zum
Teil auch schlechten Netzplandiagrammen
und deutlichen Aus­reißern in mehreren Dimensionen. Aber gerade diese Aufbereitung
und Darstellung der Messdaten hat wertvolle Dienste in der Fehlersuche und der Aufde­
ckung von Performanzschwächen geleis­tet.
Am Ende der Lasttestphase lautete das Ergebnis der Lasttests schlicht: „Die Anwendung ist performant und stabil“.
Fazit
Lasttests gehören zu jedem größeren Softwareprojekt essentiell dazu und können nicht
früh genug in die Planung einbezogen werden. Antwortzeitverhalten, CPU- und Hauptspeicherauslastung sowie deren statistische
Auswertung und Bewertung haben sich als
geeignete Analysemethoden herausgestellt.
ORDIX hat viel Erfahrung in diesem Themenkomplex gesammelt und bringt auch Ihre An-
CPU-Auslastung, Statistik
Mittelwert
Maxwert
Anteil > 50 %
1 App Server AD
32,8 %
91,0 %
6,5 %
2 App Server CS
35,3 %
78,3 %
22,1 %
3 DB Server AD
7,3 %
71,0 %
0,4 %
4 DB Server CS
36,9 %
56,0 %
0,0 %
Abb. 5: Messergebnisse der CPU-Auslastung aller beteiligten Serversysteme.
Laufzeiten
CPU Auslastung
1
6
1
2
4
5
2
3
3
4
Abb. 6: Netzplandiagramme für die Bewertung.
Glossar
Netzplandiagramm
JMeter
Flächenhafter Diagrammtyp in MS Excel, um zusammenhängende Größen anschaulich darzustellen. Die n-Achsen, an
denen die Größen abgetragen werden, haben einen gemeinsamen Ursprung und spannen eine Art „Spinnennetz“ auf. Wird
häufig im Projektmanagement eingesetzt, um z. B. kritische
Abhängigkeiten zu zeigen.
Open Source Framework in Java-Technologie zur Erstellung
von Lasttest-Simulatoren (Sampler). JMeter verfügt in seiner
aktuellen Version 2.3.1 über eine große Anzahl vorgefertigter
Sampler.
Links
► [1] Definition von Lasttests in Wikipedia:
http://de.wikipedia.org/wiki/Lasttest_(Computer)
► [2] JMeter: http://jakarta.apache.org/jmeter/
► [3] ORDIX News Artikel „Last- und Performancetests mit JMeter“:
http://www.ordix.de/ORDIXNews/3_2004/jmeter.html
wendung gerne durch belastende Tests zu
Stabilität und Performanz.
Dr. Hubert Austermeier ([email protected]).
ORDIX News 1/2008
25
Seminartermine - heraustrennbare Übersicht -
Datenbanken
Datenbank-Hochverfügbarkeitslösungen für Entscheider
Datenbank-Modellierung
Oracle SQL
Oracle SQL für Umsteiger
Oracle SQL für Experten
Oracle Datenbankprogrammierung mit PL/SQL
Oracle PL/SQL Aufbau mit LOB Programmierung
Oracle Datenbankadministration Grundlagen
Oracle Datenbankadministration Aufbau
Oracle Backup und Recovery
Oracle Tuning und Monitoring
Oracle Troubleshooting Workshop
Oracle Real Application Cluster (RAC)
Oracle 10g Neuheiten
Oracle 11g Neuheiten
Oracle Security
Oracle Data Guard
Oracle RMAN
Oracle Grid Control
Oracle Advanced Queuing
Oracle Replication
Informix SQL
Informix Dynamic Server Administration
Informix Tuning und Monitoring
Informix Backup und Recovery mit ON-Bar
Informix 11 Neuheiten
Informix Hochverfügbarkeits-Technologien
IBM DB2 für Linux/Unix/Windows SQL Grundlagen
IBM DB2 für Linux/Unix/Windows Administration
IBM DB2 für Linux/Unix/Windows Version 9.1 Neuheiten
IBM DB2 für Linux/Unix/Windows Monitoring, Tuning und HV
MySQL Administration
Microsoft SQL Server Administration
Microsoft SQL Server Hochverfügbarkeits-Workshop
Programmierung
Einführung in die objektorientierte Programmierung
Perl Programmierung Grundlagen
Perl Programmierung Aufbau
Shell, Awk und Sed
Awk Intensiv-Workshop
Einführung in XML
XML Programmierung unter Java mit DOM und SAX
Oracle und XML
PHP Programmierung Grundlagen
PHP Programmierung Aufbau
Java-JEE
Java Programmierung Grundlagen
Java Programmierung Aufbau
Java GUI Entwicklung mit Swing
JEE für Entscheider
Einführung in JEE
JSP und Servlet Programmierung
EJB Programmierung
Web-Anwendungen mit JavaServer Faces (JSF)
Entwickeln mit dem Spring-Framework
Java Web Services
Entwicklung mit Hibernate
Web- und Applikations-Server
Apache Web-Server Installation und Administration
Tomcat Konfiguration und Administration
WebSphere Application Server Installation und Administration
Administration und Konfiguration für JBoss
Betriebssysteme
Unix/Linux Grundlagen für Einsteiger
Linux Systemadministration
Linux Netzwerkadministration
Server-Virtualisierung mit XEN
Linux Hochverfügbarkeits-Cluster
Unix/Linux Security
OpenLDAP - Praxiseinsatz im Netzwerk
Solaris Systemadministration Grundlagen
Solaris Systemadministration Aufbau
Solaris kompakt
Solaris 10 für erfahrene Systemadministratoren
Solaris Containers
Zettabyte Filesystem (ZFS) Workshop
AIX Systemadministration Grundlagen
Multivendor-Systemadministration
Systemmanagement
Systemüberwachung mit Nagios
BMC Performance Manager Basics
BMC Performance Manager Advanced
BMC Performance Manager Customizing and Development
Projektmanagement
IT-Projektmanagement
Grundlagen des IT-Controlling
Projektdefinition und -planung
Projekte steuern und überwachen
Wiesbaden
Lippstadt
490,00
790,00
1.790,00
790,00
1.190,00
1.790,00
1.490,00
1.890,00
1.890,00
1.890,00
1.890,00
1.890,00
1.890,00
1.890,00
1.890,00
1.190,00
1.490,00
1.490,00
1.090,00
1.090,00
1.090,00
1.590,00
1.790,00
1.890,00
1.090,00
490,00
1.490,00
1.790,00
1.890,00
790,00
1.190,00
1.090,00
1.790,00
790,00
1.090,00
1.590,00
1.590,00
1.590,00
1.090,00
1.090,00
790,00
790,00
1.590,00
1.090,00
1.590,00
1.590,00
1.590,00
450,00
1.090,00
1.590,00
1.590,00
1.590,00
1.090,00
1.090,00
1.090,00
1.090,00
1.090,00
1.290,00
1.090,00
1.590,00
1.590,00
1.590,00
1.090,00
1.190,00
1.090,00
1.090,00
1.890,00
1.890,00
1.890,00
1.890,00
790,00
790,00
1.890,00
1.890,00
1.090,00
1.890,00
1.890,00
1.490,00
1.890,00
1.190,00
1.890,00
1.190,00
nächster Termin: 10.11.2008 - 14.11.2008 in WI
*) Preise pro Seminar pro Teilnehmer in Euro. Alle Preise gelten zzgl. ges. MwSt.
**) Inhousepreise auf Anfrage.
Für Informationen und Fragen zu individuell zugeschnittenen Seminaren, Ausbildungsreihen oder Inhouse-Schulungen stehen wir jederzeit gerne
zur Verfügung. Auf Wunsch senden wir Ihnen auch unser komplettes Seminarprogramm zu.
26
ORDIX News 1/2008
KW 26
KW 25
KW 24
KW 23
KW 22
Juni
KW 21
KW 20
KW 19
KW 18
Mai
KW 17
KW 16
KW 15
KW 14
April
KW 13
KW 12
März
KW 11
Preis in
EURO*)**)
http://training.ordix.de
Online-Anmeldung und stets aktuelle
Seminarinhalte und Termine!
KW 42
KW 41
Okt.
KW 40
KW 39
KW 38
KW 37
KW 36
September
KW 35
KW 34
KW 33
KW 32
KW 31
August
KW 30
KW 29
KW 28
KW 27
Juli
März - Oktober 2008
Preis in
EURO*)**)
490,00
790,00
1.790,00
790,00
1.190,00
1.790,00
1.490,00
1.890,00
1.890,00
1.890,00
1.890,00
1.890,00
1.890,00
1.890,00
1.890,00
1.190,00
1.490,00
1.490,00
1.090,00
1.090,00
1.090,00
1.590,00
1.790,00
1.890,00
1.090,00
490,00
1.490,00
1.790,00
1.890,00
790,00
1.190,00
1.090,00
1.790,00
790,00
1.090,00
1.590,00
1.590,00
1.590,00
1.090,00
1.090,00
790,00
790,00
1.590,00
1.090,00
1.590,00
1.590,00
1.590,00
450,00
1.090,00
1.590,00
1.590,00
1.590,00
1.090,00
1.090,00
1.090,00
1.090,00
1.090,00
1.290,00
1.090,00
1.590,00
1.590,00
1.590,00
1.090,00
1.190,00
1.090,00
1.090,00
1.890,00
1.890,00
1.890,00
1.890,00
790,00
790,00
1.890,00
1.890,00
1.090,00
1.890,00
1.890,00
1.490,00
Jetzt zum Frühbucherpreis von 1.701,00 €*) buchen!
1.890,00
1.190,00
1.890,00
1.190,00
Datenbanken
Datenbank-Hochverfügbarkeitslösungen für Entscheider
Datenbank-Modellierung
Oracle SQL
Oracle SQL für Umsteiger
Oracle SQL für Experten
Oracle Datenbankprogrammierung mit PL/SQL
Oracle PL/SQL Aufbau mit LOB Programmierung
Oracle Datenbankadministration Grundlagen
Oracle Datenbankadministration Aufbau
Oracle Backup und Recovery
Oracle Tuning und Monitoring
Oracle Troubleshooting Workshop
Oracle Real Application Cluster (RAC)
Oracle 10g Neuheiten
Oracle 11g Neuheiten
Oracle Security
Oracle Data Guard
Oracle RMAN
Oracle Grid Control
Oracle Advanced Queuing
Oracle Replication
Informix SQL
Informix Dynamic Server Administration
Informix Tuning und Monitoring
Informix Backup und Recovery mit ON-Bar
Informix 11 Neuheiten
Informix Hochverfügbarkeits-Technologien
IBM DB2 für Linux/Unix/Windows SQL Grundlagen
IBM DB2 für Linux/Unix/Windows Administration
IBM DB2 für Linux/Unix/Windows Version 9.1 Neuheiten
IBM DB2 für Linux/Unix/Windows Monitoring, Tuning und HV
MySQL Administration
Microsoft SQL Server Administration
Microsoft SQL Server Hochverfügbarkeits-Workshop
Programmierung
Einführung in die objektorientierte Programmierung
Perl Programmierung Grundlagen
Perl Programmierung Aufbau
Shell, Awk und Sed
Awk Intensiv-Workshop
Einführung in XML
XML Programmierung unter Java mit DOM und SAX
Oracle und XML
PHP Programmierung Grundlagen
PHP Programmierung Aufbau
Java-JEE
Java Programmierung Grundlagen
Java Programmierung Aufbau
Java GUI Entwicklung mit Swing
JEE für Entscheider
Einführung in JEE
JSP und Servlet Programmierung
EJB Programmierung
Web-Anwendungen mit JavaServer Faces (JSF)
Entwickeln mit dem Spring-Framework
Java Web Services
Entwicklung mit Hibernate
Web- und Applikations-Server
Apache Web-Server Installation und Administration
Tomcat Konfiguration und Administration
WebSphere Application Server Installation und Administration
Administration und Konfiguration für JBoss
Betriebssysteme
Unix/Linux Grundlagen für Einsteiger
Linux Systemadministration
Linux Netzwerkadministration
Server-Virtualisierung mit XEN
Linux Hochverfügbarkeits-Cluster
Unix/Linux Security
OpenLDAP - Praxiseinsatz im Netzwerk
Solaris Systemadministration Grundlagen
Solaris Systemadministration Aufbau
Solaris kompakt
Solaris 10 für erfahrene Systemadministratoren
Solaris Containers
Zettabyte Filesystem (ZFS) Workshop
AIX Systemadministration Grundlagen
Multivendor-Systemadministration
Systemmanagement
Systemüberwachung mit Nagios
BMC Performance Manager Basics
BMC Performance Manager Advanced
BMC Performance Manager Customizing and Development
Projektmanagement
IT-Projektmanagement
Grundlagen des IT-Controlling
Projektdefinition und -planung
Projekte steuern und überwachen
Informationen und Anmeldung:
ORDIX AG
Westernmauer 12 - 16
33098 Paderborn
Tel.: 05251 1063-0
ORDIX AG
Kreuzberger Ring 13
65205 Wiesbaden
Tel.: 0611 77840-00
zentrales Fax:
bzw.
E-Mail:
Online-Anmeldung:
0180 1 ORDIX 0
0180 1 67349 0
[email protected]
http://training.ordix.de
ORDIX News 1/2008
27
Java/JEE
Excel-Tools unter Java im Vergleich:
JExcelAPI und Jakarta POI –
David gegen Goliath?
Dieser Artikel richtet
sich vorwiegend an JavaEntwickler, die in ihren
Projekten Excel-Dateien
bearbeiten oder erstellen
müssen.
Das Jakarta-Projekt POI ist sicherlich die bekannteste Bibliothek, die in der Lage ist,
Dateien von Microsoft Office unter Java zu bearbeiten. Es existieren jedoch eine Reihe weiterer Bibliotheken, die mit Excel-Dateien umgehen können. Für diesen Artikel
wurden das POI-Projekt [1] und die Bibliothek JExcelAPI [2] „in den Ring geschickt“,
um gegeneinander anzutreten und ihre Unterschiede im Umgang mit Excel-Dateien
herauszustellen.
In der rechten Ecke: Das JExcelAPI
Der Herausforderer in Form des JExcelAPI
existiert zwar schon einige Jahre, hat aber bis
heute noch nicht den Verbreitungsgrad seines Kontrahenten, dem Jakarta-Projekt POI
erreicht. Im Gegensatz zum POI-Projekt, das
im Zeitraum von 2004 bis 2007 kaum weiterentwickelt wurde, wurde JExcel in dieser Zeit
kontinuierlich verbessert und zunehmend aus­
gereifter.
Mittlerweile bieten einige Projekte, die z. B.
für einen Export bisher ausschließlich auf POI
gesetzt haben, zusätzliche Schnittstellen für
die JExcelAPI an. Als Beispiel sei hier JasperReport genannt, dessen Exportfunktion seit
einiger Zeit nicht nur durch POI sondern auch
durch JExcel realisiert werden kann.
ORDIX News 1/2008
Daher ist es mit Hilfe der POI-Bibliothek auch
möglich, Microsoft Word-, Powerpoint-, Outlook- und Visio-Dateien zu bearbeiten. Dieser
Artikel beschränkt sich jedoch auf das Modul HSSF (Horrible Spreadsheet Format, zu
deutsch in etwa „furchtbares Arbeitsblattformat“) für die Bearbeitung von Excel-Dateien.
Die aktuellste stabile Version 3.0.1 ist Mitte
2007 erschienen [3].
Funktionen des JExcelAPI
In der linken Ecke: Das Jakarta POI-Projekt
JExcel kann alle Excel-Dateien von der Version 97 bis 2003 interpretieren und Dateien erzeugen, die zu diesen Versionen kompatibel
sind. Von Excel 2007 erstellte *.xlsx-Dateien,
die auf dem OOXML-Dateiformat basieren,
können allerdings von der JExcelAPI nicht interpretiert werden.
Nun schauen wir auf den „Altmeister“ und fragen uns, wie ein Entwicklungsteam auf die Idee
kommen kann, sein Projekt „Poor Obfuscation
Implementation“ (zu deutsch in etwa „armselige, verwirrende Implementierung“) zu benennen. Der Name ist jedoch nicht auf das Projekt
Einfache Bestandteile eines Excel-Sheets,
wie z. B. Grafiken, Kommentare, viele Formeln, verschiedenen Zellen oder auch Datums- und Nummernformatierung, stellen für
JExcel kein Problem dar. Seine Schwächen
offenbart das Archiv vor allem beim Auslesen
Die Bibliothek steht aktuell in der im Oktober
2007 erschienenen Version 2.6.6 zur Verfügung [2].
28
selbst, sondern vielmehr auf das den OfficeDateien zugrunde liegende OLE2-Dateiformat
bezogen. POI stellt eine Java-Implementierung dieses von Microsoft definierten Formats
dar und besteht aus mehreren Modulen.
Java/JEE
der Meta-Daten des OLE2-Dateiformates, sowie bei der Bearbeitung von Makros. Letztere kann JExcel zwar kopieren bzw. von einem
in das andere Workbook-Objekt übertragen,
erstellen oder bearbeiten kann es Makros jedoch nicht.
Die Projektseite bietet zwar ein FAQ und ein
kleines Tutorial an, es wird dabei aber bei Weitem nicht der ganze Funktionsumfang dieser
Bibliothek behandelt.
Im Allgemeinen ist die Verwendung der Funktionen sehr intuitiv, aber bei speziellen Problemen
und Fragen, vor allem in der Einarbeitungszeit,
ist gelegentlich doch etwas mehr Rechercheaufwand für die Problemlösung erforderlich.
Funktionen des POI
Das Apache-Projekt ist, genau wie JExcel,
in der Lage, Dateien der Excel-Versionen 97
bis 2003 zu lesen und zu bearbeiten. Mit dem
OOXML-Dateiformat der 2007er Version von
Microsoft Excel kann jedoch das Jakarta POI
ebenfalls nicht umgehen.
Mit den allermeisten Funktionalitäten aus Excel
kommt POI sehr gut zurecht. Neben einfachen
Datums-, Nummern- und Fließkomma­zellen
oder auch Grafiken, Charts und Kom­mentaren
unterstützt das Archiv sehr viele Excel-Formeln, ist in der Lage die Meta-Daten der Datei
auszulesen und kann auch mit Makros umgehen.
Für einen umfangreichen Zugriff auf einzelne
Elemente der Dateistruktur existiert ein Low
Level-API, das einen sehr tiefgreifenden Einfluss auf die Datenstruktur erlaubt und vor allem für das Auslesen von Meta-Daten sehr
hilfreich sein kann. Die meisten Funktionen
des HSSF-Moduls sind sehr gut dokumentiert
und die Projektseite der Apache-Group bietet viele Beispiele an. Dies hilft insbesondere
in der Einarbeitungszeit, da manche Vorgehensweisen nicht sehr intuitiv sind.
// Erstellen und parametrisieren des Settings-Objektes
WorkbookSettings ws = new WorkbookSettings();
ws.setSuppressWarnings(false);
...
...
// Erstellen des Workbooks und des Sheets
WritableWorkbook workbook = Workbook.createWorkbook(new
File(...));
WritableSheet sheet = workbook.createSheet("Name des Sheets",
nSheetIndex);
// Erstellen eines Zellenformats
WritableFont fontUeberschrift = new WritableFont(WritableFont.
ARIAL, 12, WritableFont.BOLD);
WritableCellFormat formatUeberschrift = new WritableCellFormat
(fontUeberschrift);
// Erstellen einer Zelle
sheet.addCell(new Label(0, 0, "Ueberschrift Spalte 1", format­
Ueberschrift));
...
// Daten rausschreiben
workbook.write();
workbook.close();
Abb. 1: Erzeugen eines neuen Excel-Files mit dem JExcelAPI.
// Erstellen eines neuen Workbooks und eines Sheets
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("Test-Sheet");
// Erstellen einer neuen Zeile
HSSFRow row = sheet.createRow(0);
// Erstellen eines neuen Zellenformates
HSSFFont fontUeberschrift = workbook.createFont();
fontUeberschrift.setFontName(HSSFFont.FONT_ARIAL);
HSSFCellStyle cellStyleUeberschrift = workbook.createCellStyle();
// Erstellen einer neuen Zelle
Cell cell = row.createCell((short)0);
cell.setCellValue(new HSSFRichTextString("Ueberschrift Spalte 1"));
cell.setCellStyle(cellStyleUeberschrift);
cellStyleUeberschrift.setFont(fontUeberschrift);
// Erstellen des Outputs
FileOutputStream out = new FileOutputStream(new File(....));
// Herausschreiben der Daten
workbook.write(out);
out.close();
Abb. 2: Erzeugen eines neuen Excel-Files mit der POI-Bibliothek.
Erstellen von Dateien mit dem JExcelAPI
Für das Erstellen einer Excel-Datei mit dem
JExcelAPI wird zunächst ein WritableWorkbook-Objekt erstellt, das eine ExcelMappe repräsentiert. Einem Workbook wird
im Konstruktor das Ausgabe-Objekt (z. B. ein
Outputstream oder ein File-Objekt) übergeben. Das WritableWorkbook kann mit Hilfe des WorkbookSettings-Objekts konfiguriert werden (siehe Abbildung 1).
Über eine createSheet-Methode können
dann einzelne Arbeitsblätter (Sheets) erzeugt
werden. Diesen wiederum kann man dann über
die addCell-Methode beliebig viele Zellen hinzufügen. Der addCell-Methode wird hierfür
ein Objekt des Interface-Typs Writ­ableCell
übergeben, das Angaben über seine Position,
seinen Inhalt und seine Formatierung enthält.
ORDIX News 1/2008
29
Java/JEE
Es existieren mehrere Implementierungen
des Interfaces WritableCell. Die wichtigsten sind Boolean, Number, Label und
Date­Time, die in der Lage sind, die entspre­
chenden Java-Datentypen in einer ExcelZelle darzustellen und gegebenenfalls Aus­
gabeformatierungen auf sie anzuwenden.
Eine weitere, wichtige Implementierung dieses Interfaces ist die Klasse Formula, die
es ermöglicht, eine Formelzelle zu definieren,
in der eine Excel-Funktion enthalten ist [z. B.
„Summe(A1:A8)“].
Die Formatierung der Zelle wird dabei über ein
WritableCellFormat definiert. Da lediglich eine begrenzte Anzahl von Zellenformaten gleichzeitig verwaltet werden kann, kann
es zu Problemen kommen, wenn innerhalb
eines Dokuments zu viele WritableCellFormat-Objekte erstellt werden. In diesem
Falle werden die Zellen, die nach Erreichen
der Höchstzahl dargestellt werden, ohne Formatierung ausgegeben.
Erstellen von Dateien mit der Jakarta POI
Genau wie JExcel kennt auch POI ObjektRepräsentationen einer Excel-Mappe, eines
Arbeitsblattes und einer Zelle in Form eines
HSSFWorkbook-, eines HSSFSheet- und eines HSSFCell-Objektes (siehe Abbildung 2).
Glossar
API
Bibliothek
Meta-Daten
OOXML
Application Programming Interface. Ein API ist eine Sammlung von
Klassen, welche eine Schnittstelle zu einer Hardware oder Anwendung definieren.
Archiv mit einer Sammlung von Klassen, die bestimmte Funktionalitäten bereitstellen und in andere Projekte integriert werden können.
Daten, die nicht zu den Nutzdaten gehören, sondern Informationen
über die eigentlichen Nutzdaten beinhalten.
Office Open XML. OOXML ist ein von der Firma Microsoft entwickeltes, auf XML basierendes Dateiformat für Office-Anwendungen.
Links
Im Gegensatz zum JExcelAPI besteht jedoch
nicht die Möglichkeit, Zellen direkt einer Position im Sheet zuzuweisen. Für jede Zeile, die
über eine oder mehrere Zellen verfügen soll,
ist zunächst die Erzeugung eines HSSFRowObjektes notwendig. Dieses stellt wiederum
Methoden bereit, um Zellen an einer bestimmten Spaltenposition der Zeile zu erstellen.
Die Position, der Inhalt und die Formatierung
der Zelle werden im Gegensatz zum JExcel
API jedoch nicht in einem separaten Objekt
gehalten, sondern direkt dem Cell-Objekt
übergeben. Die Methode setCellValue
kann dabei mit verschiedenen Übergabeparametern, z. B. einem boolean-Wert, einem
double-Wert oder einem Date-Objekt aufgerufen werden. Um eine Formelzelle zu erzeugen, stellt das Cell-Objekt die Methode
setCellFormula bereit.
Einlesen von Dateien mit dem JExcelAPI
Das Einlesen von bestehenden Excel-Dateien
gestaltet sich mit Hilfe des JExcelAPI recht einfach. Neben dem WritableWorkbook stellt
das Archiv auch ein einfaches Workbook-Objekt bereit, dessen Konstruktor einer bereits
bestehenden Excel-Datei übergeben werden
kann. Über entsprechende getter-Methoden
kann man dann auf die einzelnen Elemente,
bis hin zu den einzelnen Zellen, zugreifen und
diese auslesen. Über die getType-Methode
des Cell-Objektes lässt sich der Typ des Inhalts bestimmen und anschließend in den spezifischen Cell-Type umwandeln. Dieser stellt
dann entsprechende Methoden bereit, um den
Zelleninhalt auszulesen.
Das Workbook kann entweder über eine statische Methode direkt erstellt oder über das
WorkbookParser-Objekt geholt werden, das
neben dem Workbook auch aus dem Dokument ausgelesene Meta-Informationen bereitstellt. Ein einfaches Beispiel für das Einlesen
einer Excel-Datei mit Hilfe der JExcelAPI ist in
dem Beispielprojekt zu diesem Artikel [5] enthalten.
► [1] Projektseite des Apache POI-Projektes: http://poi.apache.org/
► [2] Projektseite der JExcelAPI: http://jexcelapi.sourceforge.net/
► [3] Übersicht über das HSSF-Modul: http://poi.apache.org/hssf/index.html
► [4] Tutorial für JExcelAPI, leider nicht ganz aktuell:
http://www.andykhan.com/jexcelapi/tutorial.html
► [5] Beispielprojekt zu diesem Artikel:
►
Netbeans-Projekt: http://www.ordix.de/ORDIXNews/1_2008/example_netbeans.zip
►
Eclipse-Projekt: http://www.ordix.de/ORDIXNews/1_2008/example_eclipse.zip
► [6] Weitere Java-Archive zur Bearbeitung von Excel: http://www.smartxls.com
30
ORDIX News 1/2008
Einlesen von Dateien mit dem POI-Archiv
Das Lesen oder Bearbeiten von Excel-Dateien
kann über das HSSF-Modul ähnlich umgesetzt
werden wie mittels JExcel. Das UserAPI bietet
auch hier über entsprechende getter-Methoden Zugriff auf die einzelnen Bestandteile, wie
Sheets, Rows oder Cells. Diese kön­nen entfernt, geändert oder durch andere Objekte ersetzt werden.
Java/JEE
JExcelAPI und Jakarta POI
im Expertencheck
Jakarta POI
JExcelAPI
1. Wie viel Handlungsfreiheit lässt
die Lizenz?
2. Erlernbarkeit
3. Umfang der „lesen“-Funktion
„Das JExcelAPI erlaubt den Umgang mit
Excel-Dateien aus Java heraus mit minimalem Einarbeitungs-/Entwicklungsaufwand
und ohne tiefergehende Kenntnisse über
das Dateiformat. Das POI-Projekt bietet zusätzlichen Funktionsumfang und ermöglicht
weitgehende Eingriffe in die Dateistruktur
eines Excel-Dokuments. Mit diesen beiden
Werkzeugen kann ich beliebige Excel-Dateien erstellen oder Daten daraus importieren.
Beide Tools haben mir in verschiedenen
Projekten das Leben leicht gemacht.“
4. Umfang der „schreiben“-Funktion
5. Umfang der „ändern“-Funktion
6. Kompatibilität mit verschiedenen
Excel-Versionen
7. Performance
8. Reifegrad der Software
9. Dokumentation
10. Support
Alexander Zeller,
ORDIX AG, Paderborn
positiv:
negativ:
Für performanten Nur-Lesezugriff kann jedoch auch die EventAPI verwendet werden.
Diese beinhaltet als zentrale Komponenten
die HSSFEventFactory und das Interface
HSSFListener. Die EventFactory durchläuft
das Dokument und die Implementierung des
HSSFListener wird während des Parsens
über jeden neu gefundenen Eintrag informiert.
Die EventFactory kann dann auf die verschiedenen Einträge entsprechend reagieren und
sie auslesen. Ein einfaches Beispiel hierzu
finden Sie unter [5].
Fazit
Der Funktionsumfang des POI-Projektes ist
deutlich größer als der der JExcelAPI. Aber
auch die Möglichkeiten der JExcelAPI reichen
für die Erstellung einfacher Excel-Mappen und
das Auslesen von Daten aus einer Excel-Datei in aller Regel aus. Letztere zeichnet sich
dafür zusätzlich durch eine sehr leichte Einarbeitung und eine sehr leicht nachvollziehbare
Programmstruktur aus.
Aus Programmierersicht lassen sich viele Anforderungen mit der JExcelAPI einfacher realisieren. Die Handhabung des POI-Projektes
wirkt an manchen Stellen etwas altbacken, so
z. B. die Verwendung von short- statt intWerten, was oftmals eine Datentypumwandlung selbst von Konstanten erfordert. Müssen
jedoch Meta-Informationen ausgelesen oder
sehr spezifische Anforderungen umgesetzt
werden, ist man mit der POI-Bibliothek sicherlich besser bedient.
Um einen kleinen Eindruck in die Arbeitsweise und den Umgang mit den beiden Archiven
beim Lesen bzw. Schreiben von Excel-Dateien zu erhalten, finden Sie unter [5] ein kleines
Beispielprojekt zum Herunterladen. Es steht
als Netbeans- und als Eclipse-Projekt zur
Verfügung. Es ist in der Lage, eine einfache
Excel-Datei zu erzeugen und Daten einer einfachen Excel-Datei auszulesen. Beides wird
jeweils mit den beiden vorgestellten Excel-Archiven umgesetzt.
Alexander Zeller ([email protected]).
ORDIX News 1/2008
31
Systemmanagement
Erweiterte Optionen zur Konfiguration von Server- und Diensteobjekten
Nagios 3.0:
Vererbungslehre für Administratoren
Dieser Artikel richtet sich
an Nagios-Administratoren,
die einen Einblick in die
Neuerungen der Version 3.0
erhalten möchten.
Bei der Open Source Monitoring Software Nagios steht ein großer Versionswechsel
bevor: Der aktuellen Version 2.10 folgt die Version 3.0. Auch wenn die Entwicklung einer neuen Benutzeroberfläche auf die Version 4.0 verschoben wurde, so hat sich doch
„unter der Haube“ einiges getan. Viele Erweiterungen werden den Administratoren die
Arbeit erleichtern. Eine Auswahl stellen wir im Folgenden vor.
Wer eine Vielzahl ähnlicher Server oder Dienste mit Nagios überwacht, nutzt sie bereits:
Vorlagen oder auch Templates genannt. Vorlagen fassen eine Reihe von Einstellungen
zusammen, die dann an die einzelnen Serveroder Diensteobjekte vererbt werden.
Bisher konnte jedes Objekt nur die Einstellun­
gen einer einzigen Vorlage erben. Diese Einschränkung wurde aufgehoben. Mit der Version
3.0 können jetzt mehrere Vorlagen angegeben
werden.
define host{
name
check_interval
check_period
...
register
}
web-server
10
7x24
0
Abb. 1: Definition einer Vorlage für Web-Server.
define host{
name
check_interval
notification_options
event_handler
...
register
}
entwicklungs-server
15
d,u,r
handle-host-event
0
Abb. 2: Definition einer Vorlage für Entwicklungs-Server.
32
ORDIX News 1/2008
Funktionsweise von Vorlagen
Eine Vorlage nutzt die gleiche Struktur wie ein
Server- oder Diensteobjekt. Damit Nagios die
Definition als Vorlage erkennt, wird zusätzlich
die Option register 0 verwendet (siehe Abbildungen 1 und 2). Dadurch wird verhindert,
dass Nagios ein Objekt mit den angegebenen
Eigenschaften anlegt.
Bei der Definition der Server- oder Diensteobjekte können zusätzlich zu den direkt angegebenen Optionen die in einer Vorlage definierten Optionen eingebunden werden, indem die
Option use angegeben wird (siehe Abbildung
3). Dabei werden nur diejenigen Optionen aus
der Vorlage übernommen, die noch nicht direkt in der Objektdefinition angegeben wurden. Anders ausgedrückt überschreiben lokale Einstellungen die Einstellungen aus der
Vorlage. So wird beim Web-Server web1 der
Wert der Option check_interval aus der
Vorlage web-server übernommen, aber der
Wert der Option check_period direkt auf
Basis der Objekt-Definition – also auf den
Wert 5x8 – gesetzt.
Mehr als eine Vorlage
In großen Umgebungen mit vielen Servern
oder Diensten kommt häufig der Wunsch auf,
Optionen über Vorlagen nicht nur auf Basis
der Server-Art (Web-Server, Datenbank-Server), sondern zusätzlich auch noch anhand
Systemmanagement
anderer Kriterien (Standort, Umgebung, Betriebssystem etc.) zu vererben.
Bisher musste dafür eine Vielzahl an Vorlagen
geschaffen werden (Web-Server-Wiesbaden,
Web-Server-Paderborn, Datenbank-ServerWiesbaden, Datenbank-Server-Paderborn,
... Web-Server-Produktion, Web-Server-Entwicklung, ...).
Mit der neuen Nagios-Version 3.0 kann nun
ein Objekt die Optionen von mehr als einer
Vorlage erben. Die Vorlagen werden dabei
als mit Kommata getrennte Liste in der Option
use angegeben (siehe Abbildung 4).
Auch bei der Verwendung von mehreren Vorlagen werden nur diejenigen Optionen aus einer Vorlage verwendet, die nicht schon durch
die Objektdefinition selbst oder eine in der Lis­
te weiter links stehende Vorlage festgelegt
wurden.
Die für den Entwicklungs-Web-Server devweb1 aktiven Optionen sind in Abbildung 5
dargestellt. Die Werte der Optionen check_
interval und check_period wurden aus
der Vorlage web-server übernommen, der
Wert der Option notification_options
aus der Vorlage entwicklungs-server.
Die Reihenfolge entscheidet
Werden in den verschiedenen Vorlagen die
gleichen Optionen mit unterschiedlichen Werten verwendet, so entscheidet die Reihenfolge innerhalb der Option use darüber, welche
Werte aktiv werden.
Da eine Vorlage selbst auch auf verschiedenen Vorlagen beruhen kann, ergeben sich
un­ter Umständen komplexe Strukturen. Das
Beispiel in den Abbildungen 6 und 7 ist der Dokumentation von Nagios 3.0 entnommen und
zeigt eine solch komplexe Struktur. Dies ist bei
der Planung und Implementierung zu berücksichtigen und am besten auch zu testen, um
unerwünschte Effekte zu vermeiden.
Vererbung unterbinden
Neu in der Version 3.0 ist auch die Möglichkeit,
nicht nur die Werte der vererbten Optionen zu
verändern, sondern einzelne vererbte Optionen
(derzeit Optionen mit Zeichenketten-Werten wie
z. B. event_handler) aus der Objektdefinition zu löschen. Dazu werden die Optionen auf
den Wert null gesetzt, wie in Abbildung 4 der
Wert für die Option event_handler, die so
define host{
use
host_name
check_period
...
}
web-server
web1
5x8
Abb. 3: Definition eines Server-Objektes für einen Web-Server.
define host{
use
host_name
event_handler
...
}
web-server, entwicklungs-server
devweb2
null
Abb. 4: Definition eines Server-Objektes für einen Entwicklungs-Web-Server.
define host{
host_name
check_interval
check_period
notification_options
...
}
devweb2
10
7x24
d,u,r
Abb. 5: Aktive Einstellungen für den Entwicklungs-Web-Server aus Abb 4.
define host{
use
host_name
...
}
1, 4, 8
devweb1
Abb. 6: Definition eines Server-Objektes mit mehreren Vorlagen.
1
2
3
6
devweb1
4
5
7
8
Precedence Order (Rangfolge)
Inheritance (Vererbung)
Abb. 7: Darstellung der Vererbung und Rangfolge für den Server aus Abb. 6.
Quelle: http://nagios.sourceforge.net/docs/3_0/objectinheritance.html
ORDIX News 1/2008
33
Systemmanagement
Versionsinformation
Die zum Redaktionsschluss neueste verfügbare Version ist 3.0rc2, also Release Candidate 2. Das ist noch keine stabile Version und sollte auch noch nicht in ProduktionsUmgebungen eingesetzt werden. Aktuell „stable“ ist nur die alte Version 2.10. Sowohl
die stabile Version 2.10 als auch die aktuelle Version 3.0rc2 können auf der Nagios
Webseite [1] heruntergeladen werden.
Links
► [1] Nagios Webseite: http://www.nagios.org
► Seminarempfehlung:
Systemüberwachung mit Nagios: http://training.ordix.de/seminar.php?nr=648
nicht mehr aus der Vorlage entwicklungsserver übernommen wird (zum Ergebnis der
Einstellung siehe Abbildung 5).
Fazit
Die neue Version 3.0 bietet gerade in großen
Nagios-Umgebungen Vorteile bei der jetzt viel
flexibleren Verwendung von Vorlagen. Allerdings ist dennoch ein gut durchdachtes Konfigurationskonzept Basis für die Verwendung
von Vorlagen, um unerwünschte Effekte zu
vermeiden. Bei der Erstellung oder Anpassung
dieser Konzepte unterstützen wir Sie gerne.
Andreas Jordan ([email protected]).
Larry Ratlos:
Verflixte PHP 5 Arrays
Jetzt ist Larry schon 5 Jahre bei ORDIX. Und seine Aufgaben sind so vielfältig, dass
er trotzdem immer wieder vor neuen Problemen steht ...
Larry hat vor einiger Zeit den ORDIX PHP 5
Kurs besucht und ist begeistert: Die Inhalte
wurden sehr verständlich vermittelt. Aber jetzt,
da er wieder in seinem Büro sitzt, versteht er die
Welt nicht mehr. Er geht nochmal alle Themen
durch und bleibt beim “Iterieren von Arrays unter PHP 5” hängen. Er versucht, sein eigenes
Array auf verschiedene Weise zu durchlaufen,
wozu er folgenden Code benutzt:
<?php
$arr=array("Larry","ist","ratlos");
foreach ($arr as &$wert) { }
foreach ($arr as $wert) { }
print_r($arr);
?>
Nun ist er total verwundert über die Ausgabe
des Aufrufs print_r(), die da lautet:
Array ( [0] => Larry [1] => ist [2] => ist )
Warum ist denn nun das letzte Element ein „ist“
und nicht „ratlos“? Er hatte doch gelernt, dass
man mit einem foreach($arr as $wert)Konstrukt ein Array Element für Element durch-
34
ORDIX News 1/2008
laufen kann und das Array beim Durchlaufen
mit foreach($arr as &$wert) sogar direkt
beim Durchlaufen verändern kann. Aber er ändert doch gar nichts an dem Array ...
Können Sie Larrys Code möglichst einfach kor­
rigieren, so dass er das erwartete Ergebnis liefert? Dann senden Sie Ihre Lösung bitte bis
zum 18. April 2008 an [email protected].
Lösung der Aufgabe aus 4/2007
Larry hatte kurz vor Weihnachten das Problem, dass er einem Kollegen, dessen Name
aber unbekannt war, ein Paket überbringen
lassen sollte. Er hat es nach einigem Knobeln
dem Paderborner Kollegen mitgegeben, der
es dann dem Java-Referenten übergeben hat.
Viele Leser haben herausgefunden, dass das
Paket nach Paderborn muss. Der schnellste
war Herr Heimburger vom Statistischen Landesamt Sachsen, der sich daraufhin selbst
über ein kleines Paket freuen durfte.
Betriebssysteme
I/O-Multipathing mit Linux-Bordmitteln:
Viele Wege führen zur LUN
Bereits seit der Linux-Kernelversion 2.6.12, also seit Juni 2005, besteht die Möglichkeit, Storage-Systeme mit Hilfe des Device Mappers Multipathing-I/O (DM-MPIO) über
re­dundante, physikalische Pfade anzubinden. Vorher war dies nur mit kommerzieller
Software (z. B. EMC PowerPath) möglich. Aufgrund fehlender Unterstützung der Hersteller werden allerdings nachwievor meist proprietäre Software-Lösungen verwendet.
Seit einiger Zeit zertifizieren jedoch auch die großen Hersteller von Storage-Systemen
den Einsatz der frei verfügbaren I/O-Multipathing-Lösung. Nachdem EMC bereits im
Dieser Artikel richtet sich an
Systemadministratoren, die
einfach und kostengünstig
Speicherbereiche aus dem
SAN redundant an ihre LinuxSysteme anbinden möchten
oder nach einer Alternative zu
kostenpflichtigen Lösungen
suchen.
Jahr 2006 die Nutzung in Single-Server-Umgebungen freigegeben hat, wird seit Ende
2007 auch der Einsatz in Cluster-Umgebungen (z. B. mit OCFS) unterstützt. Dies möchten wir zum Anlass nehmen, Ihnen die wichtigsten Konzepte und Komponenten dieser
frei verfügbaren Multipathing-Lösung einmal in kompakter Form vorzustellen.
Wie funktioniert I/O-Multipathing?
Der Device Mapper als Basis
Wie der Name bereits sagt: Voraussetzung für
I/O-Multipathing sind mehrere physikalische
Pfade, die zu einem Storage Device führen.
Fällt einer dieser Pfade aus, werden Schreibund Leseoperationen (I/O) über die verbliebenen Pfade ausgeführt. Zur Verbesserung der
Performance können die Operationen zudem
bei Bedarf auch im Normalbetrieb auf unterschiedliche Pfade verteilt werden.
Der Device Mapper ist seit der Kernel-Version
2.6 eine zentrale Komponente des Storage
Management auf Linux-Systemen. Mit seiner
Hilfe werden virtuelle Block-Devices erstellt,
deren Blöcke mittels Zuordnungstabellen, so
genannten „maps“, auf beliebige existierende
Block-Devices verteilt werden können. Die Art
und Weise, wie die Blöcke verteilt werden, ist
dabei flexibel (z. B. linear oder als Spiegel) und
ORDIX News 1/2008
35
Betriebssysteme
wird durch „targets“ definiert. Das Logical Volume Management basiert beispielsweise seit
der Version 2 auf dem Device Mapper.
Pfad 1
Anwendung
/dev/mapper/oracle_mp
/dev/sda
HBA1
/dev/sdb
HBA2
SP1
DeviceMapper
SP2
LUN
Pfad 2
Linux Server
Storage
Abb. 1: Device Mapper Multipathing-I/O im Überblick.
# /sbin/scsi_id -g -u -s /block/sdc
360070590000280101094433030303439
# /sbin/scsi_id -g -u -s /block/sde
360070590000280101094433030303439
Abb. 2: Ermittlung einer eindeutigen ID mit scsi_id.
Mit der Kernel-Version 2.6.12 wurde der Device Mapper um das Target „multipath“ erwei­
tert und bildet damit das Fundament des I/OMultipathing. Mit seiner Hilfe wird ein virtuelles
Device generiert, hinter dem sich die verschiedenen Pfade zum eigentlichen Gerät verbergen. Die Aufgabe des Device Mappers ist so­wohl die Verteilung der Schreib- und Lese­ope­ra­
tionen als auch die Erkennung defekter Pfade
und die entsprechende Umlenkung der Operationen auf die verbliebenen Pfade. Einen Überblick über den DM-MPIO gibt Abbildung 1.
multipath configuration tool
Um ein Multipathing Device anzulegen, sind
folgende Schritte notwendig:
# multipath –ll
oracle_mp (360070590000280101094433030303439) dm-0 EMC,SYMMETRIX
[size=100G][features=0][hwhandler=0]
\_ round-robin 0 [prio=2][active]
\_ 1:0:0:0 sdc 8:32 [active][ready]
\_ 2:0:0:0 sde 8:64 [active][ready]
Abb. 3: Anzeige der aktuellen Konfiguration mit dem Multipath Tool.
# Welche Devices nicht pruefen? (z.B. nicht /dev/sda und /dev/sdb)
blacklist {
devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
devnode "^hd[a-z][[0-9]*]"
devnode "^sd[ab][0-9]*"
}
# Multipaths konfigurieren
multipaths {
multipath {
wwid "360070590000280101094433030303439"
alias "oracle_mp"
path_grouping_policy multibus
}
}
Abb. 4: Auszug aus der Konfigurationsdatei /etc/multipath.conf.
•
Suche nach Geräten mit identischer ID, aber
unterschiedlichen Pfaden
•
Erstellung einer Map für den Device Mapper
•
Anlegen des Multipathing Devices mit dieser Map
Die Schritte können prinzipiell auch manuell
durchgeführt werden. In der Praxis werden sie
allerdings vom Multipath Tool übernommen.
Dieses kann automatisch bei der Erkennung
neuer Block-Devices durch das Hotplug-Subsystem aufgerufen oder bei Bedarf auch manu­
ell ausgeführt werden. Das Werkzeug ermittelt
mit Hilfe des Kommandos scsi_id über ein
SCSI-Inquiry eine eindeutige Bezeichnung,
die Worldwide-ID (WWID) eines SCSI-Devi­
ces, z. B. für /dev/sdc und /dev/sde (siehe
Abbildung 2).
Weisen mehrere SCSI-Devices die gleiche
WWID auf, so wird davon ausgegangen, dass
es sich um redundante Pfade zu demselben
Gerät handelt und ein entsprechendes Multipath Device wird erzeugt (siehe Abbildung 3).
Konfiguration
# multipathd -k
multipathd> list paths
hcil
dev dev_t pri dm_st
chk_st next_check
1:0:0:0 sdc 8:32 1
[active][ready] XXXXXX.... 12/20
2:0:0:0 sde 8:64 1
[active][ready] XXXXXX.... 12/20
Abb. 5: Der interaktive Modus des Multipath-Dämons.
36
ORDIX News 1/2008
Die Konfiguration des Multipath Tools erfolgt
in der Datei /etc/multipath.conf. In ihr
wird unter anderem definiert, welche Devices
wie auf redundante Pfade zu prüfen sind und
welches Multipathing-Verfahren genutzt werden soll. Zudem können sprechende Namen
für die zu erstellenden Multipathing Devices
konfiguriert werden (siehe Abbildung 4).
Betriebssysteme
kpartx
Glossar
Das Multipath Tool legt lediglich Maps für komplette Block-Devices an. Sind diese jedoch partitioniert, wird für jede Partition eine separate
Map benötigt. Diese Aufgabe übernimmt das
Tool „kpartx“. Es untersucht ein gegebenes
Meta-Device auf Partitionen und legt bei Bedarf entsprechend zusätzliche Meta-Devices
an. Standardmäßig wird zu diesem Zweck die
Endung -part<nr> an den Namen des Basis-Devices angehängt. D. h. die erste Partition des Multipath Devices /dev/mapper/
oracle_mp ist über den Pfad /dev/mapper/oracle_mp-part1 erreichbar usw.
Der Multipath-Dämon
Die Aufgabe des Multipath-Dämons multipathd ist die dynamische Rekonfiguration
der Multipathing Devices bei Ausfall und Res­
taurierung von Pfaden. Des Weiteren liefert
multipathd eine Kommandozeilenschnittstelle, die es dem Administrator ermöglicht,
die aktuelle Konfiguration abzurufen bzw. zu
verändern (siehe Abbildung 5).
I/O-Multipathing Zugriff auf Blockgeräte über mehrere physikalische Pfade zur Steigerung von Verfügbarkeit und Performance.
DM-MPIO
Device Mapper Multipathing-I/O. DM-MPIO ist die native I/O-Multipathing-Lösung auf Linux-Systemen seit Kernel 2.6.12.
LUN
Logical Unit Number. LUN ist die Zuordnungsnummer für Geräte an
einem SCSI-Bus (z. B. für virtuelle Festplatten eines Disk Arrays).
SAN
Storage Area Network. SAN ist ein Netzwerk zur Anbindung von
Speicherressourcen an Serversysteme.
OCFS
Oracle Cluster Filesystem. Das OCFS ist ein frei verfügbares Cluster Filesystem von Oracle.
WWID
World Wide ID. WWID ist eine weltweit eindeutige Bezeichnung,
z. B. als Adresse eines Gerätes im SAN.
Fazit
Das DM-MPIO stellt nicht nur eine kostenlose,
sondern vor allem eine offene und sehr klar struk­
turierte Multipathing-Lösung für Linux-Sys­teme
dar. Die zunehmende Unterstützung durch große Storage-Anbieter legt nahe, dass DM-MPIO
in Zukunft vermehrt als Alternative zu traditionel­
ler Multipathing Software eingesetzt wird.
Christof Amelunxen ([email protected]).
Impressum
Herausgeber:
ORDIX AG
Aktiengesellschaft für Software­ent­wick­lung,
Beratung, Schulung und Systemintegration,
Paderborn
Redaktion:
Helma Jenniches, Sascia Brinkmann
V.i.S.d.P.: Benedikt Georgi, Wolfgang Kögler
Anschrift der Redaktion:
ORDIX AG
Westernmauer 12 - 16
33098 Paderborn
Tel.: 05251 1063-0
Fax: 0180 1673490
Gestaltung/Layout: Sascia Brinkmann
Auflage: 9.300
Druck: Druckerei Reike GmbH, Paderborn
Bildnachweis:
pixelio.de © Nicole80; pixelio.de © hofschlaeger;
pixelio.de © Multipla; pixelio.de © DominoXL;
photocase.de © nild; photocase © Christian Kudler
Autoren dieser Ausgabe:
Christof Amelunxen, Dr. Hubert Austermeier, Holger Demuth, Christian Fertsch, Dirk
Hansmeier, Andreas Jordan, Wolfgang Kögler, Lars Hendrik Korte, Rainer Restat,
Thorsten Schuhmacher, Frank Späth, Manfred Stöb, Christian Wiesing, Alexander Zeller
Copyright:
ORDIX AG. Alle Rechte, auch die der Übersetzung, des Nachdrucks und der Vervielfältigung der Artikel oder von Teilen daraus, bleiben uns vorbehalten. Kein Teil der Artikel
darf ohne unsere schriftliche Genehmigung in irgendeiner Form reproduziert, insbesondere unter Verwendung elektronischer Systeme verarbeitet, verbreitet, vervielfältigt oder
zu öffentlichen Wiedergaben benutzt werden.
Haftung:
Eine Haftung für die Richtigkeit der Veröffentlichungen kann trotz sorgfältiger Prüfung
durch die Redaktion vom Herausgeber nicht übernommen werden.
Warenzeichen:
Einige der aufgeführten Bezeichnungen sind eingetragene Warenzeichen ihrer jeweiligen Inhaber.
Die Zeitschrift ORDIX News wird von der ORDIX AG an ausgesuchte Kunden verteilt
und kann für 2,20 Euro bestellt werden. Sie finden sowohl die neueste Ausgabe als auch
ältere Ausgaben im Archiv der ORDIX News im Internet unter: http://www.ordix.de.
Schauen Sie mal rein!
Der Kontakt zu unseren Lesern ist uns sehr wichtig. Für An­re­gungen, Kritik und Anmerkungen zu den Themen, aber auch für interessante Ideen sind wir immer offen und dankbar. Wir freuen uns auf Ihr Feedback an [email protected].
ORDIX News 1/2008
37
Projektmanagement
IT-Projektmanagement:
Aller Anfang ist schwer
Dieser Artikel richtet sich an
Projekt- und IT-Manager.
Ein IT-Projekt zu beginnen, erscheint auf den ersten Blick einfach. Am Anfang steht eine Vorgabe oder eine Idee - sei es aufgrund einer gesetzlichen Vorschrift, einer strategischen Entscheidung oder einer technischen Notwendigkeit. Ein Team wird gebildet
und ein Projektleiter ernannt. Projektstart! Aber ist das tatsächlich der Projektstart?
Wann und wie startet ein Projekt wirklich? Was ist für einen erfolgreichen Projektstart
notwendig? Im vorliegenden Artikel erörtern wir die wesentlichen Aspekte der ersten Phase eines Projektes, die Projektdefinition oder auch Projektinitialisierung genannt wird.
„Sage mir, wie dein Projekt beginnt und
ich sage Dir, wie es endet.“
Dieses Zitat bringt es auf den Punkt. Was oft
als Projekt bezeichnet wird, ist in den meisten
Fällen nur die Realisierungsphase eines Projektes. Wirklich entscheidend für den Erfolg
eines Projektes ist jedoch die Projektdefinition. Man spricht in diesem Kontext auch von
„formaler Autorisierung“ des Projektes.
Wie ordnet sich die Projektdefinition als Phase in den gesamten Ablauf? Welches sind die
Voraussetzungen für eine Projektdefinition und
was ist das Ergebnis dieser Phase?
Die Phasen eines Projektes
Phasenmodelle bilden die Grundlage dafür,
IT-Projekte so zu strukturieren, dass der gesamte Ablauf beherrschbar bleibt. Zwar haben sich in der Vergangenheit unterschiedliche Varianten entwickelt, die sich im Detail
unterscheiden, allen gemeinsam ist jedoch
die generelle Trennung zwischen Projektdefinition, Planung, Durchführung und Abnahme
(siehe Abbildung 1).
Während der Abwicklung von IT-Projekten sind
eine Reihe wichtiger Aufgaben zu erledigen.
Dies sind neben Konzeption und Entwicklung
der Lösung vor allem Aufgaben in den Bereichen Anforderungsmanagement, Planung,
Kommunikation und Projekt-Controlling. In der
38
ORDIX News 1/2008
Initialisierungsphase des Projektes müssen da­
für die Weichen gestellt werden.
Wo beginnt der Weg zum Ziel?
Welches sind die Voraussetzungen für eine
Projektdefinition und was ist das Ergebnis dieser Phase? Die Projektdefinitionsphase beginnt mit der Idee und liefert als Ergebnis eine
Entscheidungsvorlage, meist in Form des Projektantrags. Die eigentliche Projektdurchführung beginnt mit dem Kick-Off.
Der richtige Werkzeugsatz
IT-Projekte unterscheiden sich zum Teil erheblich voneinander, sodass man nicht mit einer „Standardmethode“ zum Ziel kommt. Das
gilt vor allem auch für die Projektdefinition.
Ein Projekt „richtig aufzusetzen“ hängt vom
Ergebnis verschiedener Fragestellungen ab:
•
•
•
•
•
Was sind die wesentlichen Projekt­ziele?
Wie umfangreich wird das Projekt?
Um welchen Projekttyp (Software-Entwick­
lung, Migration, IT-Infrastruktur) handelt es
sich?
Welche Restriktionen/Risiken gibt es?
Welche Rahmenbedingungen existieren?
Es sind demnach zunächst die richtigen Voraussetzungen zu schaffen, damit ein Projekt
erfolgreich sein kann. Viele Aspekte einer sol-
Projektmanagement
chen Projektdefinition findet man beispielsweise in einer Ausschreibung. Eine weitere, sinnvolle Variante ist die Anfertigung einer Studie,
die je nach Größenordnung durchaus als eigenständiges Projekt gestaltet werden kann.
Dabei stehen jedoch meist die technische
Machbarkeit und die inhaltlichen Anforderungen im Vordergrund, während andere Aspekte,
wie Organisation, Kennzahlen, Berichte und
Dokumentationsstrukturen außen vor bleiben.
Da während der Projektinitialisierung die Weichen für die späteren Phasen gestellt werden,
müssen zu Beginn folgende Bereiche geklärt
werden:
•
•
•
•
•
•
Ziele und Inhalte
Planung und Steuerung
Beteiligte und Rollen
Kommunikation
Technologie
Risiken und Qualität
Mit Hilfe der folgenden Checklisten kann ein
Projektleiter zu Beginn seines Projektes Vollständigkeitsprüfungen vornehmen oder bewusst auf Handlungsbedarf hinweisen. Dabei
müssen in dieser Phase nicht alle genannten
Punkte behandelt werden, sondern es müssen
die Grundlagen für die Erreichung der Projektziele geschaffen werden. Umgekehrt erheben
die Listen keinen Anspruch auf Vollständigkeit.
Ziele und Inhalte
Idee/Vorgabe
Projektdefinition
Strukturierung/
Planung
Projektantrag
Kick-Off
Planung und Steuerung
Projektplanung und effektives Projekt-Control­
ling sind für ein erfolgreiches Projekt unverzichtbar. Die folgenden, notwendigen Voraus­
set­zun­­gen sind hierfür zu schaffen:
□ Es existiert eine Planbasis.
□ Der Terminrahmen ist vorgegeben.
□ Finanzielle Rahmenbedingungen sind bekannt.
□ Was geplant werden muss, ist definiert.
□ Wichtige Meilensteine sind festgelegt.
□ Realistische Schätzungen liegen vor.
□ Erste Kennzahlen für ein effektives Projekt-Controlling liegen vor.
□ Es herrscht Klarheit über erforderliche Arbeitspakete zur Messung des Fertigstellungsgrads.
□ Berichtswesen (Art und Umfang) ist defi-
□ Anforderungen und Rahmenbedingungen
Beteiligte und Rollen
□ Auftraggeber und Auftragnehmer sind ein-
Die Benennung der Personen und die Festlegung von Verantwortlichkeiten sind ein wesentlicher Erfolgsfaktor. Dazu gehört insbesondere die klare Definition und Zuordnung
der Rollen im Projekt.
deutig festgelegt.
□ Über die Projektziele (und Nicht-Ziele)
herrscht Klarheit und Einigkeit zwischen
den Beteiligten.
niert und kommuniziert.
□ Spielräume und -regeln für Änderungen/
Erweiterungen sind festgelegt (ChangeManagement).
□ Die Nutzen- bzw. die Wirtschaftlichkeitsbe-
□ Die Projektorganisation ist definiert, die we-
□ Qualitätsziele sind definiert.
□ Das Team ist adäquat für das Projekt be-
trachtung liegt vor.
□ Die formalen Voraussetzungen für den Start
sind erfüllt (meist Projektantrag).
□ Alle Ziele und Inhalte sind kommuniziert.
□ Das Kick-Off ist geplant, die Agenda liegt vor.
Überprüfung/
Abnahme
Abb. 1: Typischer Projektablauf.
Eine klare Formulierung und Dokumentation
der Ziele ist gemeinsam mit dem Auftraggeber des Projekts zu erstellen. Dabei können
folgende Punkte als Leitlinie helfen. Die Ergebnisse sollten im Rahmen eines Kick-Offs
öffentlich vorgestellt werden.
sind definiert.
Realisierung/
Durchführung
sentlichen Positionen sind besetzt.
setzt.
□ Es gibt genügend Personal und es ist ausreichend qualifiziert.
□ Rollen im Projekt sind ausreichend definiert und verteilt.
ORDIX News 1/2008
39
Projektmanagement
□ Der Nutzen für die Projektmitarbeiter ist
dargestellt.
□ Es ist ausreichend Projektmanagementund Führungserfahrung vorhanden.
□ Die Kompetenzen des Projektleiters sind
ausreichend.
□ Die Eskalationswege sind definiert und
kommuniziert.
Kommunikation
Kommunikation im Projekt ist ein immer wieder
unterschätztes Thema. Dabei geht es weniger
um eine hohe Anzahl an Meetings, sondern
vielmehr um einen effektiven Informationsfluss
zwischen allen Beteiligten. Projektmanagement ist auch Kommunikationsmanagement
(siehe auch ORDIX News 2/2007 [1]):
□ Es existiert ein Kommunikationskonzept
(Art und Weise, wie mit Projektbeteiligten
kommuniziert wird).
□ Dokumentationsrichtlinien sind definiert.
□ Alle vom Projekt direkt oder indirekt Betroffenen sind über die Ziele und den geplanten Ablauf informiert.
□ Alle relevanten Interessensvertreter (z. B.
Auftraggeber, Projektmitarbeiter, zukünftige Anwender, Betriebsrat etc.) sind bekannt, informiert und eingebunden.
□ Die erste Planung (Schätzung) wurde abgestimmt.
□ Grundlagen für ein Berichtswesen (Art und
Umfang) sind geschaffen.
Technologie
Während der Projektdefinition stellt sich nicht
nur die Frage nach den einzusetzenden Technologien, die in der Realisierung Anwendung
finden, sondern vor allem nach Architekturvorgaben, Richtlinien und Vorgehensmodellen. In
diesem Kontext sind auch Festlegungen be-
Links
► ORDIX News Artikel „Kommunikation im Projektmanagement: ... und Reden ist Gold“:
http://www.ordix.de/ORDIXNews/2_2007/Projektmanagement/kommunikation_
projektmanagement.html
► Seminarempfehlungen:
►
Projektdefinition und -planung: http://training.ordix.de/seminar.php?nr=661
►
Projekte steuern und überwachen: http://training.ordix.de/seminar.php?nr=664
40
ORDIX News 1/2008
züglich Versions- und Konfigurationsmanagement zu treffen. Vor allem beim Einsatz neuer,
bisher unbekannter Technologien ist sicherzustellen, dass ausreichendes Know-how verfügbar ist.
□ Entwicklungsrichtlinien und Vorgehensmo­
delle sind berücksichtigt und sind verbind­
lich.
□ Technologische Abhängigkeiten und Architekturvorgaben sind berücksichtigt.
□ Die Tool-Umgebung ist verbindlich festgelegt.
Risiken und Qualität
Qualität ist planbar, wenn wesentliche Qualitätsziele frühzeitig festgelegt werden. Eine
laufende Qualitätssicherung ist erst möglich,
wenn im Vorfeld überprüfbare Kriterien definiert wurden. Dies gilt vor allem für das Testen, da Testfälle unmittelbar aus der Anforderungsdefinition abgeleitet werden.
Gleiches gilt für mögliche Risiken. Sofern frühzeitig potenzielle Risiken beachtet werden,
kann deren Eintrittswahrscheinlichkeit in den
späteren Projektphasen besser beurteilt werden bzw. Risiken können in der Realisierung
und Implementierung vermieden werden. Außerdem kann man deutlich effektiver reagieren, falls ein Risikofall tatsächlich eintritt.
Erreichte Qualitätsziele und vermiedene Ri­
siken sind zusätzliche, aussagekräftige Kennzahlen des Projekt-Controllings und lassen neben dem Fertigstellungsgrad eine genauere
und objektivere Beurteilung des Projektfortschritts zu.
Fazit
Je höher die Qualität der Initialisierung eines IT-Projektes, desto größer ist die Wahrscheinlichkeit, dass dieses Projekt erfolgreich
im Sinne technischer, zeitlicher und monetärer Vorgaben abgeschlossen wird. Ein Projekt
beginnt nicht mit einem Beschluss oder einer
Idee. Ein Projekt beginnt dann, wenn es eine
solide Basis für eine Entscheidung zur Durchführung gibt. Diese Entscheidung stützt sich
auf Ergebnisse der Projektinitialisierung. Die
Projektinitialisierung sollte immer von dem
Projektleiter durchgeführt werden, der auch
für die folgenden Phasen verantwortlich ist.
Ansonsten wird es nicht gut enden ...
Rainer Restat ([email protected]).
Datenbanken
Reihe Oracle Objekttypen von A - Z (Teil VI):
Jobs und Libraries
Im sechsten Teil der Reihe Objekttypen fahren wir mit „J“ wie Job fort. Dazu erläutern
wir weitere Job-bezogene Objekttypen außerhalb der alphabetischen Reihenfolge. Anschließend geht es mit „L“ und dem Objekttyp Library und dessen Verwendung als
Brücke zwischen PL/SQL und den Betriebssystemfunktionen weiter.
Der DBMS_SCHEDULER
Der Objekttyp Job und sieben weitere Objekttypen sind im Zusammenhang mit der Job-Verwaltung und dem Paket DBMS_SCHEDULER
in Oracle 10g eingeführt worden. Ein Job kombiniert die Metadaten eines Programms mit einer Zeitdefinition. Sowohl das Datum der Ausführung als auch die damit verbundene Aktion
kann direkt im Job oder auch indirekt über ein
Schedule bzw. Programm erfolgen.
Neben den Basiskomponenten des Pakets
DBMS_SCHEDULER existieren weitere, optionale Komponenten. Den Schedule erweitert ein Zeitfenster (Window) um eine Laufzeit und eine optionale Verknüpfung mit einem
Ressourcenplan. Mit einem Window Group
lassen sich mehrere Zeitfenster zusammenfassen.
Jobs können in Klassen gruppiert werden. Jobklassen sind die Verbindung zum Resource
Manager der Datenbank. Mittels der Konsumentengruppen können Ressourcenzusagen
für die jeweiligen Jobklassen gegeben werden.
Oracle erstellt automatisch eine Jobklasse mit
dem Namen AUTO_TASKS_JOB_CLASS und
eine Konsumentengruppe mit dem Namen
AUTO_TASKS_CONSUMER_GROUP.
Die automatisch angelegten Komponenten
werden von Oracle zur Aktualisierung der Tabellenstatistiken genutzt. Aus einer Abfolge
von Programmen lassen sich zudem Ablaufketten (Chain) definieren. Ein Job kann eine
solche Abfolge von Programmen anstoßen.
Alle zuvor genannten Scheduler-Komponenten sind mit einem gleichnamigen Objekttyp
Dieser Artikel wendet sich an
Datenbankadministratoren und
-entwickler, die einen Überblick
über die Objekttypen von Oracle
bekommen möchten.
verbunden. In Abbildung 1 sind sämtliche Objekttypen, die im Zusammenhang mit der Jobverwaltung stehen, aufgeführt.
Eine ausführliche Betrachtung des Themas
DBMS_SCHEDULER finden Sie in der ORDIX
News 1/2005 [1].
Beispiele
Eine Job-Definition besteht, wie das Beispiel
in der Abbildung 2 zeigt, mindestens aus einem Job, der Ausführungszeit, hier eine Referenz auf ein Schedule („Schedule1“), und einer
Referenz auf ein auszuführendes Programm
Scheduler Element
JOB
Object Typ
JOB
Beschreibung
Kombination aus PROGRAM und
WINDOW Objekt
JOB CLASS
JOB CLASS
Gruppierung von Jobs zur
Ressourcenzuordnung
SCHEDULE
SCHEDULE
Zeitplan der Job-Ausführung
PROGRAM
PROGRAM
Beschreibung der auszuführenden
Aktion
WINDOW
WINDOW
Zeitfenster für die Job-Ausführung
WINDOW GROUP
WINDOW GROUP Zusammenfassung mehrerer Zeitfenster
CHAIN
CHAIN
Jobkette, Liste chronologisch
ablaufender Jobs
CREDENTIAL
CREDENTIAL
Berechtigung eines Jobs
AGENT_REGISTRATION_ UNDEFINED
Passwort zur Anmeldung des AgenPASSWORD
ten zur Remote Job-Ausführung
Abb. 1: Objekttypen im Scheduler-Umfeld.
ORDIX News 1/2008
41
Datenbanken
BEGIN
SYS.DBMS_SCHEDULER.CREATE_JOB
(
job_name => 'Jobtest1'
,schedule_name => 'Schedule1'
,program_name => 'Program1'
,job_class => 'ORDIX_JOB_CLASS'
);
SYS.DBMS_SCHEDULER.ENABLE
( NAME => 'DH.Jobtest');
END;
/
Abb. 2: Beispiel für eine Job-Definition.
SYS.DBMS_SCHEDULER.CREATE_JOB_CLASS
(
job_class_name =>'ORDIX_JOB_CLASS'
,resource_consumer_group =>'LOW_GROUP'
,service =>NULL
,logging_level =>SYS.DBMS_SCHEDULER.LOGGING_FULL
,log_history =>30
,comments =>NULL
);
Abb. 3: Beispiel für eine Job-Class-Definition.
CREATE OR REPLACE FUNCTION W2KWRAPP (
lpCmdLine IN VARCHAR2,
uCmdShow IN PLS_INTEGER := 1 )
RETURN PLS_INTEGER
IS
EXTERNAL LIBRARY kernel32 NAME "WinExec"
LANGUAGE C CALLING STANDARD PASCAL
PARAMETERS (
lpCmdLine STRING,
uCmdShow LONG,
RETURN LONG
);
/
Abb. 4: Beispiel für die Definition einer Wrapper Funktion mit Zugriff auf ein
dynamisches Library-Objekt.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ANY")
)
)
Abb. 5: Beispiel für eine Listener.ora Konfiguration.
42
ORDIX News 1/2008
(„Program1“). Ein Beispiel für die Definition eines Job Class Objektes ist in Abbildung 3
aufgelistet.
Ausnahmen
Folgende Scheduler-Komponenten erzeugen
keine Objekte im Sinne von DBA_OBJECTS:
•
•
•
•
•
•
•
•
•
ANYDATA_ARGUMENT
CHAIN_EVENT_STEP
CHAIN_RULE
CHAIN_STEP
RUNNING_CHAINS
METADATA_ARGUMENT
PROGRAM_ARGUMENT
GLOBAL_ATTRIBUTES
JOB_LOG
Bei der Scheduler-Komponente mit dem Namen AGENT_REGISTRATION_PASSWORD
handelt es sich um ein Objekt im Sinne von
DBA_OBJECTS, dessen Objekttyp aber nicht
namentlich in der View DBA_OBJECTS definiert ist, sondern als Objekttyp UNDEFINED
aufgeführt wird. Es handelt sich hierbei um
das Passwort zur Anmeldung des Agenten
zur Remote-Jobausführung, welcher mit der
Version 11g eingeführt wird.
Library Objekte
Eine Library ist eine Sammlung von Funktionen, die über eine Schnittstelle der PL/SQLEngine zur Verfügung gestellt wird. Libraries
können statisch oder dynamisch eingebunden
werden. Eine statische Library liegt in Form von
C-Byte Code in der Datenbank vor. Ein statisches Library-Objekt wird wie folgt definiert:
CREATE OR REPLACE LIBRARY
ORDIX_LIB TRUSTED AS STATIC
Eine dynamische Library ist ein mit einer Datei verknüpftes Schemaobjekt. Über ein dynamisches Library-Objekt wird aus PL/SQL heraus auf externe Funktionen zugegriffen, die
in einer externen Library-Datei implementiert
sind. Seit Oracle 8 stehen diese Aufrufe (Callouts) aus PL/SQL heraus zur Verfügung.
Eine typische Anwendung ist der Zugriff auf
eine betriebssystemnahe Funktion. Diese liegt
Datenbanken
in der Form von Shared-Library-Dateien vor.
Das folgende Beispiel erstellt ein LibraryObjekt auf die Betriebssystem-Shared-Li­bra­
ry-Datei „Kernel32.dll“ unter Windows, die
sich im System32-Verzeichnis befindet.
CREATE OR REPLACE LIBRARY
kernel32 as
'C:\windows\system32\kernel32.dll';
Der Status VALID des Objektes in der View
User_libraries besagt nicht unbedingt, dass
die angegebene Datei im lokalen Filesystem
tatsächlich existiert. Ein Library-Objekt kann
natürlich auch auf einen Remote-Rechner verweisen. Sollte sich die Library-Datei nicht im
angegebenen Pfad befinden, kommt es erst
bei der Ausführung der Funktion zu einem
Fehler: ORA-06520: PL/SQL: Fehler beim Laden der externen Bibliothek.
Die Library kommt zum Einsatz
Um eine externe Funktion aufrufen zu können, muss die aufrufende PL/SQL-Prozedur
(siehe Abbildung 4) wissen, in welcher Datei
sich diese Funktion befindet. Dazu wird in der
Alias Library nach dem Dateinamen gesucht
und anschließend via SQL-NET der Listener
kontaktiert. Dieser startet den Oracle Agent
EXTPROC-Prozess. Hierfür wird ein Eintrag,
wie in den Abbildungen 5 und 6 gezeigt, in der
Listener.ora und der Tnsnames.ora benötigt.
Von nun an kommunizieren der EXTPROCProzess und die PL/SQL-Engine direkt miteinander. Der Prozess EXTPROC besteht für
die Dauer der aufrufenden Session. Nach Beendigung der Session wird auch EXTPROC
beendet.
Für jede Session, die externe Funktionen verwendet, startet ein eigener EXTPROC-Prozess. Die PL/SQL-Engine übergibt den Namen
der Shared Library-Datei an den EXTPROCProzess mit Hilfe des Library-Objektes und
der PL/SQL Wrapper Function. Dieser bringt
die Shared-Library-Funktion zur Ausführung
und übergibt das Resultat der PL/SQL-Engine. Die erfolgreiche Ausführung der externen
Funktion kann über den Rückgabewert (siehe
Abbildung 7) kontrolliert werden.
Ausblick
In einer der nächsten ORDIX News setzen wir
die Artikelreihe dann wieder alphabetisch fort.
Dirk Hansmeier ([email protected]).
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
Abb. 6: Beispiel für eine Tnsnames.ora Konfiguration.
SET SERVEROUTPUT ON
DECLARE
v_ret NUMBER;
BEGIN
v_ret := W2KWRAPP ('cmd /q /c mkdir c:\temp\test');
DBMS_OUTPUT.PUT_LINE ('1st command: v_ret=' || v_ret);
END;
/
Abb. 7: Beispiel für den Aufruf einer Wrapper Funktion mit Zugriff auf ein
dynamisches Library-Objekt.
Referenzen
Oracle Doku aus MetaLink: https://metalink.oracle.com (Zugriff nur für registrierte User)
► Note: 70678.1 PL/SQL Example: Bitwise Operations using External Procedures
► Note: 68061.1 Creating External Procedures on Windows NT
► Note: 99136.1 Calling Operating System Commands from PL/SQL using External Procedures
Link
► [1] ORDIX News 1/2005, Artikel „Jobsteuerung mit dbms_scheduler“:
http://www.ordix.de/ORDIXNews/1_2005/oracle_10g_jobsteuerung.html
Glossar
dbms_scheduler
Oracle Komponenten zur Planung und Steuerung von daten­
bankabhängigen Aktionen, bestehend aus einer PL/SQLSchnitt­stelle, zugehörigen Hintergrundprozessen und einer
Reihe von Data Dictionary Views.
Resource Manager Tool zur Verwaltung von Ressourcen, wie CPU-Zeit, maximale
Anzahl Sessions, Parallelitätsgrad etc. für Benutzergruppen in
einem bestimmten Zeitraum.
Resource Consumer Eine Gruppe von Oracle Benutzern mit gleicher Anforderung
Group
an die benötigten Ressourcen.
Ressourcenplan
Beschreibt die periodenabhängige Zuordnung von Ressourcen zu einer Resource Consumer Group.
EXTPROC
Eigenständiger Prozess auf Betriebssystemebene, der Library
Dateien dynamisch einbindet, die entsprechenden Funktionen
aufruft und deren Rückgabewerte an Oracle zurückgibt.
Callouts
Aufrufe von externen Funktionen, die in einer anderen Program­
miersprache implementiert sind, als die aufrufende Funktion.
ORDIX News 1/2008
43
Datenbanken
Tacho, der 560 km/h anzeigt
aufgemotztes Auto
IBM Informix Dynamic Server Version 11 (Teil II):
Dynamisches Ressourcen Tuning
Dieser Artikel richtet sich
an Datenbank- und System­
administratoren, Entwickler
und Entscheider im
Datenbankumfeld.
In der ORDIX News 3/2007 [1] stellten wir den neuen Informix Dynamic Server (IDS)
Version 11 vor und gaben einen ersten Überblick über Neuerungen im neuen OLTPDatenbank-Flagschiff der IBM. Seit Mitte Juni 2007 ist nun der Informix Dynamic Server Version 11.10.(FU)C1 auf dem Markt erhältlich. Sehr viele neue Funktionen wurden
in diese Version integriert. In diesem Teil der Reihe beleuchten wir das Thema „Dynamisches Ressourcen Tuning“.
RTO-Policy
Mit der IDS Version 11 kann sich der Datenbankadministrator das Leben etwas vereinfachen, z. B. mit der so genannten RTO-Policy.
RTO steht für Recovery Time Objective und
bedeutet soviel wie eine Vereinbarung einer
Zielvorgabe für eine garantierte Wiederanlaufzeit (Recovery-Phase) nach einem Datenbankserverausfall.
Die RTO-Policy wird über den neuen Konfi­gu­
rationsparameter RTO_SERVER_RESTART
aktiviert. Mit der Angabe einer Zeitdauer in Sekunden wird festgelegt, wie lange eine Wiederanlaufzeit (Zeitspanne vom Beginn des Starts
bis hin zum Zustand „Online“ des Datenbank-
44
ORDIX News 1/2008
servers) maximal sein darf. Der Wert kann im
Bereich zwischen 60 und 1800 Sekunden liegen.
Sobald dieser Konfigurationsparameter gesetzt ist, aktiviert er automatisch ein Monitoring
des Datenbankservers, um die RTO-Richt­li­
nie einzuhalten. Unter der Vo­raussetzung,
dass ein Physical Logfile mit einer Mindestgröße von 10 MB sowie ausreichend große
Logical Logfiles zur Transaktionsprotokollierung zur Verfügung stehen, werden, abhängig
von der Transaktionslast, Checkpoints durchgeführt, damit die Einhaltung der RTO-Policy
garantiert werden kann. Bei aktivierter RTORichtlinie wird der Standardparameter für den
Checkpoint Intervall CKTINTVL ignoriert.
Datenbanken
Die beiden zusätzlichen Konfigurationsparameter RAS_PLOG_SPEED und RAS_LLOG_
SPEED regeln die Lesegeschwindigkeit des
Physical Logs und des Logical Logs. Beide
Werte werden beim Starten vom Datenbankserver automatisch ermittelt und eingetragen.
Eine Übersicht über die drei Konfigurationsparameter finden Sie in Abbildung 1.
Zusätzlich zum automatischen Monitoring
wird bei Aktivierung einer RTO-Policy auch
das dynamische Ressourcen Tuning gestartet. Dabei überprüft der Datenbankserver im
laufenden Betrieb ständig die beiden Parameter LRU_MIN_DIRTY und LRU_MAX_DIRTY
und führt, je nach Lastsituation, auch selbstständig Anpassungen durch.
Bei Bedarf werden durch den Datenbankserver im laufenden Betrieb weitere AIO_VPs
(Informix Virtuelle Prozesse für das Schreiben und Lesen von Platte) und Page Cleaner
Prozesse hinzugefügt, die für das Schreiben
der geänderten Bufferpool Pages aus dem
Shared Memory auf Platte (Synchronisation)
verantwortlich sind.
LRU-Optimierung
Das Schreiben des Inhaltes eines Shared
Memory Buffers auf die Platte (Synchronisation) wird im Englischen als „buffer flushing“
bezeichnet. Die automatische Ausführung dieser Aktion wird anhand der Schwellwerte der
beiden LRU-Parameter LRU_MIN_DIRTY und
LRU_MAX_DIRTY gesteuert.
Bisher hatten diese beiden Schwellwerte eine
feste Größe, die nicht dynamisch angepasst
werden konnte. Zukünftig optimiert der Datenbankserver die Werte bei entsprechendem
Lastverhalten automatisch. Voraussetzung
dafür ist entweder, dass der neue Konfigurationsparameter AUTO_LRU_TUNING = 1 gesetzt ist oder, wie bereits oben erwähnt, der
RTO_SERVER_RESTART aktiviert ist.
Stellt der Datenbankserver Engpässe in der
LRU-Queue Verwaltung fest, dann werden
die beiden Schwellwerte der LRU-Parameter LRU_MAX_DIRTY und LRU_MIN_DIRTY
automatisch um 1 Prozent nach unten korrigiert. Durch das Herabsetzen der beiden
LRU-Schwellwerte werden die geänderten
Pages/Datensätze aus dem Shared Memory
häufiger auf Platte geschrieben. Diesen Vorgang nennt man auch Synchronisation oder
LRU-Flushing. Die Überprüfung der beiden
LRU-Parameter erfolgt bei jedem ausgelös­
ten Checkpoint (siehe Abbildung 2).
KONFIGURATIONSPARAMETER Recovery Time Objective
RTO_SERVER_RESTART ## (Angabe in Sekunden)
# Zeit, die der Server für einen Recovery aus dem Offline
# maximal benötigen darf.
# 0=Off, die Angabe erfolgt in Sekunden im Bereich von 60-1800
# Dieser Wert beeinflusst u.a. das Checkpoint-Interval.
RAS_PLOG_SPEED ###
# Parameter für die Lesegeschwindigkeit des Physical Logs.
# Dieser Wert wird vom DB-Server beim Starten automatisch
# ermittelt und eingetragen.
# Standardwert: 10240 pages/sec (20 Mb/sec)
# Wert in pages written/second
RAS_LLOG_SPEED ###
# Parameter für die Lesegeschwindigkeit des Logical Logs
# Dieser Wert wird vom DB-Server beim Starten automatisch
# ermittelt und eingetragen.
# Wird als 1/8 von RAS_PLOG_SPEED initialisiert.
# Standardwert: 1280 pages/sec (2.5 Mb/sec)
# Wert in pages written/second
Abb. 1: Konfigurationsparameter der RTO-Policy.
Automatische Anpassung von LRU_MIN_DIRTY und LRU_MAX_DIRTY
12:02:02 Adjusting LRU for bufferpool - id 0 size 2k
12:02:02 Old max 78.4 min 68.6 New max 77.6 min 67.9
Abb. 2: Beispieleintrag im Message Logfile nach dynamischer Anpassung beider
LRU-Parameter durch den DB-Server.
Die Standardeinstellungen für die Schwellwerte der beiden LRU-Parameter betragen 50
für LRU_MIN_DIRTY und 60 für LRU_MAX_
DIRTY. Bei aktivierter LRU-Optimierung können die Werte höher gesetzt werden. Eine
Empfehlung lautet inzwischen, mit den Werten LRU_MIN_DIRTY = 70 und LRU_MAX_
DIRTY = 80 zu starten.
Die Einstellungen der LRU-Schwellwerte regeln das Schreiben der geänderten Daten aus
dem Shared Memory Buffer auf die Platte. Wird
der Schwellwert von LRU_MAX_DIRTY überschritten, werden solange modifizierte Datenseiten auf die Platte geschrieben, bis der untere
Schwellwert LRU_MIN_DIRTY erreicht ist.
Achtung: Die automatischen LRU-Anpassungen sind nicht permanent und werden auch
nicht in der ONCONFIG-Datei gespeichert.
Falls keine manuelle Änderung der Konfigurationsparameter in der $ONCONFIG erfolgt,
wird beim nächsten Neustart des Datenbank-
ORDIX News 1/2008
45
Datenbanken
servers wieder auf die ursprünglichen Konfigurationswerte, die in der ONCONFIG-Datei
enthalten sind, zurückgegriffen.
Nicht blockierende Checkpoints
Mit der Version 11 wurde der bisherige Checkpoint-Algorithmus durch einen praktisch nicht
blockierenden Checkpoint-Algorithmus ersetzt. Durch das optimierte LRU-Flushing werden die modifizierten Buffer Pages außerhalb
der Checkpointphase auf Platte geschrieben.
Das einzige, was den Datenbankserver noch
für geringe Sekundenbruchteile blockiert, ist
das Schreiben des Checkpoint-Eintrages in
das Logical Logfile.
Der Informix Dynamic Server überwacht die
Auslastung und die bisherigen CheckpointZeiten und löst Checkpoints bei Bedarf häufiger aus, damit kritische Ressourcen, wie das
physische oder das logische Logfile, nicht
erschöpft werden. Damit wird sichergestellt,
dass Transaktionen während eines Checkpoints nicht blockiert werden.
Bei Anwendungen, die empfindlich auf Reaktionszeiten reagieren, kann die bisherige
Methode geändert werden. Bei dieser wurde aggressives LRU-Flushing (Schreiben der
Daten aus dem Shared Memory Bereich auf
Voraussetzungen für nicht blockierende Checkpoints:
•
•
Ausreichend groß dimensionierte Logfiles (Logical- und Physlog)
Bei zu kleinen Logfiles wird eine Meldung zusammen mit einem Vorschlagswert
in das Logfile mitprotokolliert.
16:05:17 Performance Advisory: Based on the current workload,
the physical log might be too small to accommodate the time it
takes to flush the bufferpool.
16:05:17 Results: The server might block transactions during
checkpoints.
16:05:17 Action: If transactions are blocked during the
checkpoint, increase the size of the physical log to at least
14000 KB.
16:05:17 Performance Advisory: Based on the current workload,
the logical log space might be too small to accommodate the
time it takes to flush the bufferpool.
16:05:17 Results: The server might block transactions during
checkpoints.
16:05:17 Action: If transactions are blocked during the
checkpoint, increase the size of the logical log space to at
least 14000 KB.
Abb. 3: Eintrag im Online Logfile bei zu kleinen Logfiles.
46
ORDIX News 1/2008
die Platte auf Basis von sehr niedrigen LRUParametereinstellungen) verwendet, um die
Wartezeiten des Checkpoints zu verringern.
Es ist allerdings darauf zu achten, dass sowohl das Physical Logfile als auch die Transaktionsprotokolle ausreichend groß angelegt
sind. Falls dies nicht der Fall sein sollte, werden blockierende Checkpoints durchgeführt.
Gleichzeitig wird ein Eintrag in das Message
Logfile des Datenbankservers vorgenommen,
der auch einen Hinweis mit Empfehlung einer
Mindestgröße enthält (siehe Abbildung 3).
Checkpoint Analyse
DasneueKommandoonstat -g ckpbieteteine
Möglichkeit, die aufgetretenen Checkpoints
zu überwachen und zu analysieren. Es wird
ausgegeben, ob die Funktion AUTO_CKPTS
an- oder ausgeschaltet ist, welcher Wert für
RTO_SERVER_RESTART eingestellt ist, sowie die aktuell erwartete Restart-Zeit beim
Recovery (siehe Abbildung 4).
Durch die Erweiterung der sysmaster Datenbank um die beiden Tabellen syscheckpoint
und sysckptinfo kann man alternativ auch
über ein selbst erstelltes SQL-Statement auf
die gewünschten Informationen zugreifen.
Im Folgenden werden nun die wichtigsten Aussagen des Kommandos onstat –g ckp beschrieben, wie in Abbildung 4 zu sehen ist:
•
Interval: fortlaufende Nummerierung der
Checkpoints
•
Clock time: Zeitpunkt, wann der Checkpoint aufgetreten ist
•
Trigger: auslösender Grund eines Checkpoints
•
Admin: Das System hat einen Checkpoint ausgelöst.
•
RTO (Maximale Recovery Zeit): anhand des aktuellen Workload wurde
ein automatischer Checkpoint angestoßen, um die RTO-Policy einzuhalten.
•
*Admin: Das System hat wegen Adminaufgaben einen Checkpoint ausgelöst, z. B. onparams, onspaces,
onmode ...
•
•
*User: Es wurde manuell der Befehl
onmode -c abgesetzt.
*Backup: Ein Archiv (ontape/onbar)
hat den Checkpoint ausgelöst.
Datenbanken
mstoeb>onstat -g ckp
IBM Informix Dynamic Server Version 11.10.FC1
AUTO_CKPTS=On
RTO_SERVER_RESTART=60 seconds
-- On-Line -- Up 04:18:43 -- 29696 Kbytes
Estimated recovery time 24 seconds
Critical Sections
Clock
TotalFlush Block #
Ckpt Wait Long # Dirty
IntervalTime
Trigger LSN
Time Time Time Waits Time Time Time Buffers
150
15:35:45 Backup 52:0x1314c 0.1 0.0
0.0 0
0.0 0.0 0.0 0
151
15:36:14 Admin 55:0x18
0.0 0.0
0.0 0
0.0 0.0 0.0 0
153
15:36:22 Admin 55:0x203c
0.0 0.0
0.0 0
0.0 0.0 0.0 0
154
15:36:26 Admin 55:0x303c
0.2 0.0
0.0 0
0.0 0.0 0.0 0
155
15:36:334 Admin 55:0x403c
0.0 0.0
0.0 0
0.0 0.0 0.0 0
167
15:38:19 Backup 55:0x1411c 0.1 0.0
0.0 0
0.0 0.0 0.0 0
168
15:45:02 RTO
57:0x29015c 4.5 4.2
0.0 1
0.0 0.2 0.2 558
169
15:56:14 RTO
58:0x90d618 7.2 5.9
0.0 1
0.1 1.2 1.2 539
219
11:33:33 *User 93:0x8c6018 0.1 0.1
0.0 1
0.0 0.1 0.1 3
220
13:04:23 *Backup 98:0x4f1018 1.6 1.3
0.0 0
0.0 0.0 0.0 140
221
13:04:24 Backup 98:0x4f211c 0.1 0.0
0.0 0
0.0 0.0 0.0 0
222
13:18:01 Plog
102:0x8f44b810.9 10.3 0.0 1
0.0 0.5 0.5 755
Max Plog
pages/sec
200
Max Llog
pages/sec
200
Max Dskflush
Time
6
Avg Dskflush
pages/sec
69
Avg Dirty
pages/sec
0
Physical Log
Dskflu TotalAvg
/Sec Pages/Sec
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
131 2224 5
90
1602 2
3
20
0
110 2567 0
0
0
0
73
6647 8
Logical
Total
Pages
1
4
1
1
1
1
4570
4439
23
8519
1
11585
Log
Avg
/Sec
1
0
0
0
0
1
11
6
0
0
0
14
Blocked
Time
0
Abb. 4: Beispielausgabe des Informix Kommandos onstat -g ckp.
•
•
Llog: Der letzte Checkpoint wäre beim
Logwechsel überschrieben worden.
Daher musste ein Checkpoint ausgelöst werden.
Glossar
RTO
•
Plog: Der Füllgrad des Physical Logs
hat 75 % erreicht. Daher musste ein
Checkpoint ausgelöst werden.
Recovery Time Objective. Zielvereinbarung in Sekunden, wie lange der DBServer nach einem Ausfall von der Startphase bis zum Zustand „Online“ benötigen darf.
LRU
Least Recently Used. Interne Verwaltung einer Pointer-Liste, die auf Daten
im Shared Memory verweist.
AIO-VP Informix Virtueller Prozess (Asynchronous I/O) für das Schreiben auf Platte.
•
CKPTINTVL: Auslöser ist das Checkpointinterval CKPTINTVL der ONCONFIG, wenn das AUTO_CKPT ausgeschaltet ist.
Links
LSN: Anzeige der Unique_ID und Page des
Logical Logfile, in dem der Checkpoint gespeichert ist.
Danach folgen einige statistische Werte, wie
z. B. Dirty Buffers = Anzahl der Buffer Pages,
die auf Platte geschrieben wurden oder Total
Time = komplette Dauer eines Checkpoint
Requests in Sekunden.
Fazit
IBM hat den Schwerpunkt der neuen Funktionen der Version 11 ganz gezielt auf Performance und Skalierbarkeit, Reduktion des
Administrationsaufwands sowie auf Ausfallsicherheit gelegt. Dadurch kommen die langjährigen, bereits bekannten Stärken des IDS, die
effiziente Administration, Zuverlässigkeit und
hochskalierbare Architektur besonders den
► [1] ORDIX News Artikel „Cheetah - IBM’s neues Raubtier“:
http://www.ordix.de/ORDIXNews/3_2007/Datenbanken/ibm_ids_teilI.html
Unternehmen zu Gute, die einen 24x7-Betrieb
auf höchstem Niveau benötigen.
Alle hier vorgestellten Erweiterungen des Datenbankservers IDS 11 gehen einher mit einer
Arbeitserleichterung für den Datenbankver­
ant­wortlichen. Damit ist ein weiterer Schritt in
die von IBM propagierte „Administration Free
Zone“ getan.
In einer der kommenden Ausgaben beleuchten
wir die neuen Hochverfügbarkeitslösungen, die
unter dem Codenamen MACH11 in den Informix Dynamic Server 11 integriert wurden.
Manfred Stöb ([email protected]).
ORDIX News 1/2008
47
Open Source
Neue Features in OpenLDAP 2.3 (Teil II):
OpenLDAP –
Serverkonfiguration zur Laufzeit
Dieser Artikel richtet sich an
erfahrene LDAP-Administratoren, die sich für neue Funktionen
interessieren und die weitreichenden Möglichkeiten von OpenLDAP
kennen lernen wollen.
In der ORDIX News 4/2007 [1] haben wir bereits über neue Funktionen des OpenLDAP
berichtet, die in der Version 2.3 Einzug gehalten haben. Hierbei kamen der neue Replikationsmechanismus syncrepl und die overlays zur Sprache. In diesem Artikel wird
eine weitere, neue Funktion präsentiert: die LDAP-Serverkonfiguration ohne Neustart
des Dienstes oder Neuladen der Konfigurationsdatei. Zudem wird am Beispiel sudo
demonstriert, wie sich das vielfältige LDAP-Protokoll für andere Zwecke, fernab der
Benutzerauthentifizierung, nutzen lässt.
Konfiguration zur Laufzeit
In der Praxis setzen die meisten Unternehmen aus Redundanz- und Lastverteilungsgründen mehrere LDAP-Server zur Authentifizierung und Namensauflösung ein. Selbst
in mittelgroßen Unternehmen sind das schon
mal schnell fünf bis acht LDAP-Server. In älteren OpenLDAP-Versionen musste der Dienst
jedes Mal neu gestartet beziehungsweise
die Konfigurationsdatei neu geladen werden,
nachdem eine Änderung in der Konfigurationsdatei /etc/openldap/slapd.conf
durchgeführt wurde. Da die Änderungen meistens auf allen LDAP-Servern durchgeführt
werden sollten, musste dies für jeden Server
separat durchgeführt werden.
Seit der Version 2.3 des OpenLDAP-Servers
kann die Konfiguration zur Laufzeit geändert
werden. Für die Umsetzung wurde ein neues Datenbank-Backend namens ldif eingeführt, in dem die Konfigurationseinstellungen
gespeichert werden. Die Konfigurationsdateien werden im LDIF-Format im Verzeichnis
/etc/openldap/slapd.d erwartet.
Das Ändern von Konfigurationseinstellungen
erfolgt nun analog zum Hinzufügen von Benutzern oder Gruppen. Es wird eine LDIF-Da-
48
ORDIX News 1/2008
tei mit Konfigurationseinstellungen erstellt, die
dann mit einem der beiden Befehle ldapadd
oder ldapmodify auf die Datenbank angewendet werden. Der LDAP-Server erkennt die
Konfigurationsänderungen und wendet sie so­
fort ohne Neustart an.
Die bisherige Konfigurationsdatei kann zwar
weiterhin genutzt und geändert werden, allerdings mit den bekannten Nachteilen des anschließenden Neustarts des LDAP-Dienstes.
Von der Parallelnutzung beider Konfigurationsverfahren ist abzuraten, da kein automatischer Abgleich stattfindet und schnell die
Übersicht verloren geht, wo welche Einstellung aktiviert wurde. Wir empfehlen deshalb,
die bestehende Konfiguration in das neue
Verfahren zu konvertieren und die alte Konfigurationsdatei anschließend zu löschen. Abbildung 1 zeigt die notwendigen Schritte zur
Konvertierung.
Es gilt dabei allerdings eine kleine Einschränkung zu beachten: Der alte Replikationsdaemon slurpd kann mit dem neuen Verfahren
nicht umgehen und braucht zwingend eine
slapd.conf. Dies stellt jedoch ein zu vernachlässigendes Problem dar, da der wesentlich flexiblere und auf Performance ausgelegte
Open Source
syncrepl-Mechanismus [1] von OpenLDAP
Version 2.3 diese Einschränkung nicht besitzt.
slapd.d Internals
Der LDAP-Konfigurationsbaum unter /etc/
openldap/slapd.d ist nun folgendermaßen
aufgebaut: Direkt im Konfigurationsverzeichnis
befinden sich das Objekt cn=config und die
Datei cn=config.ldif, in der globale Konfigurationsattribute wie z. B. PID, args, TLS,
Threads oder der Pfad zum Konfigurationsverzeichnis gesetzt werden. Letztendlich entsprechen die Einstellungen den globalen Ein­
stellungen der alten Konfigurationsdatei.
Die unterhalb von cn=config befindlichen
Objekte, wie z. B. cn=schema beinhalten weitere Einstellungen zur Konfiguration: Das Objekt cn=schema ist für die Konfiguration der
vom slapd verwendeten Standardschemata
wie z. B. core, cosine und inetOrgPerson
zuständig. Mit den in geschweiften Klammern
bei 0 beginnenden Zahlen kann die Ladereihenfolge der Einträge bestimmt werden.
Auch innerhalb der Schemadateien sind die
Objekte nun im LDIF-Format und können
zur Laufzeit durch importieren einer Datei im
LDIF-Format geändert werden. Um adminis­
trativen Zugriff auf die Konfiguration zu erlan­
gen, muss nun in der Datei /etc/openldap/
slapd.d/cn=config/olcDatabase={0}
config.ldif ein Kennwort für den schon ein­
getragenen Benutzer cn=config gesetzt werden. Der Eintrag in der Datei hat das Format
{SSHA}0JAlK29Fna1PmJvjdch2SxidRUXhLKP7.
Das gehashte Kennwort kann mit dem Befehl
slappasswd -s <Kennwort> erzeugt werden und erlaubt anschließend den Zugriff auf
die Konfiguration mit den normalen LDAP-Befehlen. Mit dem Befehl ldapsearch (siehe
Abbildung 2) kann die Konfiguration innerhalb
des LDAP-Verzeichnisses angesehen werden, während mit ldapmodify (siehe Abbildung 3) Werte zur Laufzeit verändert und aktiviert werden.
LDAP als zentrales Konfigurationsdepot
In großen Unix-Umgebungen kommt häufig
das Produkt sudo zum Einsatz. Das Wort
„sudo“ steht hier für „substitute user do“. Um
nicht allen Benutzern eines Unix-Systems
alle Berechtigungen zu geben, kann der Administrator mit sudo die Berechtigungen einschränken, indem nur bestimmte Kommandos
erlaubt sind und festgelegt wird, auf welchem
Server sie von wem und unter welcher Benut-
/etc/init.d/ldap stop
mkdir /etc/openldap/slapd.d
/usr/lib/openldap/slapd -f /etc/openldap/slapd.conf \
-F /etc/openldap/slapd.d
rm /etc/openldap/slapd.conf
chown -R ldap:ldap /etc/openldap/slapd.d
/etc/init.d/ldap start
Abb. 1: Konvertierung einer bestehenden Konfiguration in das neue Verfahren.
$> ldapsearch -LLL -x -D "cn=config" -W -b cn=config objectClass=*
dn: cn=config
objectClass: olcGlobal
cn: config
olcConfigDir: /etc/openldap/slapd.d/
olcArgsFile: /var/run/slapd/slapd.args
...
olcThreads: 16
Abb. 2: Anzeige der Konfiguration.
ldap1:/tmp # cat test.ldif
dn: cn=config
changetype: modify
replace: olcThreads
olcThreads: 4
ldap1:/tmp # ldapmodify -x -W -D "cn=config" -f test.ldif
Abb. 3: Änderung des olcThreads-Attributs zur Laufzeit.
zerkennung ausgeführt werden dürfen. Dafür
schreibt der Benutzer den Befehl sudo vor
den eigentlichen Befehl. Ein Beispiel wäre
sudo useradd -m user1.
Klassisch wird die Konfiguration in der Datei
/etc/sudoers vorgenommen. Von der Herstellerseite ist die Datei zwar so aufgebaut,
dass nur eine Datei für alle Systeme gepflegt
werden muss. Diese muss aber nach einer
Änderung auf die betroffenen Systeme verteilt werden, was vor allem in größeren Umgebungen einen erheblichen Pflegeaufwand
verursacht. Dieser Pflegeaufwand wird mit
Hilfe von NIS oder anderen Möglichkeiten reduziert. Hier möchten wir aufzeigen, welche
Anwendungsmöglichkeiten LDAP bietet, indem wir die sudo-Konfigurationsdaten in unserem LDAP-Verzeichnisdienst pflegen.
ORDIX News 1/2008
49
Open Source
Vorteile der LDAP Integration
Nachteile der LDAP Integration
•
Die sudo-Konfiguration kann zentral verwaltet werden und muss bei Änderungen
nicht mehr auf die Server verteilt werden.
•
•
Bei der sudo-Kommandoausführung muss
nicht mehr die ganze sudoers-Datei aus­gewertet, sondern nur im LDAP nach be­
stimmten Einträgen gesucht werden.
•
Das Programm visudo wird nicht mehr
zum Editieren der Konfiguration benötigt.
Stattdessen wird der LDAP-seitige Objekt/
Attribut-Check genutzt.
Die sudo-Konfiguration kann nicht vollständig im LDAP implementiert werden.
So ist z. B. die Gruppierung von Befehlen
(command aliase), Rechnern (host aliase)
und Usern (user aliase) nur bedingt umsetzbar. Das ist aber keine bedeutende
Einschränkung, da bei einem LDAP-Eintrag beliebig viele Kommandos, Rechner oder Benutzer/Gruppen angegeben
werden können.
•
Es muss einmalig der Aufwand betrieben
werden, ein LDAP-fähiges sudo auf die
Server zu verteilen und eine Konfigurationsdatei anzupassen.
•
Falls kein Netzwerk zu Verfügung steht,
kann die sudo-Konfiguration nicht geladen
werden. Als Fallback kann aber eine lokale
/etc/sudoers lokal abgelegt werden.
dn: ou=SUDOers,dc=ordix,dc=de
objectClass: top
objectClass: organizationalUnit
ou: SUDOers
dn: cn=defaults,ou=SUDOers,dc=ordix,dc=de
objectClass: top
objectClass: sudoRole
cn: defaults
description: Standard sudo Optionen
sudoOption: always_set_home
sudoOption: env_reset
sudoOption: log_host
sudoOption: log_year
sudoOption: logfile=/var/log/sudo.log
dn: cn=%users,ou=SUDOers,dc=ordix,dc=de
objectClass: top
objectClass: sudoRole
cn: %users
sudoUser: %users
sudoUser: !joe
sudoHost: nameserver1
sudoHost: nameserver2
sudoCommand: /sbin/mount /cdrom
sudoCommand: /sbin/umount /cdrom
sudoCommand: /sbin/shutdown -[hr] now
Abb. 4: LDIF-Datei mit der sudo-Konfiguration.
uri
sudoers_base
sudo_debug
ldap://ldap1.ordix.de
ou=SUDOers,dc=ordix,dc=de
2
Abb. 5: Client-Konfiguration in der Datei /etc/ldap.conf.
Link
► [1] ORDIX News Artikel „OpenLDAP - Alles in sync?“:
http://www.ordix.de/ORDIXNews/4_2007/Open_Source/Open_LDAP_2_3.html
50
ORDIX News 1/2008
Vorbereitung des LDAP-Servers
Um die sudo-spezifischen Objekte innerhalb
des LDAP-Verzeichnisdienstes zu verwalten,
muss eine Schemaerweiterung auf den LDAPServern vorgenommen werden. Dazu wird die
Schemadatei sudo.schema benötigt, welche von der sudo-Webseite heruntergeladen
werden kann. Zusätzlich muss die Schemadatei von OpenLDAP geladen werden. Dies
kann entweder über den herkömmlichen Weg
include/etc/openldap/schema/sudo.
schema innerhalb der Konfigurationsdatei
slapd.conf oder über das oben beschriebene Verfahren cn=config gelöst werden.
Nachdem der LDAP-Server mit den Schema­
erweiterungen gestartet ist, können nun ers­te
Einträge vorgenommen werden. Dies kann
sowohl mit klassischen LDIF-Dateien geschehen, als auch mit Scripting-Verfahren, wie
beispielsweise Perl oder einem grafischen
LDAP-Browser wie phpLDAP­admin oder dem
LDAP Account Manager (LAM).
Auch die Konvertierung einer bestehenden
sudo-Konfiguration ist leicht möglich. Mit den
Kommandos
export SUDOERS_BASE=ou=SUDOers,dc
=ordix,dc=de sudoers2ldif /etc/
sudoers > /tmp/sudoers.ldif
kann aus einer bestehenden Konfigurationsdatei eine LDIF-Datei erstellt werden, die dann in
den LDAP-Verzeichnisbaum importiert werden
Open Source
kann. Abbildung 4 zeigt ein Beispiel für eine
LDIF-basierte Konfiguration, die nun mit dem
Kommando ldapadd importiert werden kann.
In diesem Beispiel wird eine separate Organisationseinheit SUDOers angelegt, um
die sudo-Konfiguration von anderen Einträgen getrennt zu verwalten. Mit dem Eintrag
cn=defaults können globale sudo-Optionen konfiguriert werden, wie beispielsweise
das logfile, indem lokal auf dem System
die mit Hilfe von sudo ausgeführten Kommandos protokolliert werden.
Mit dem Eintrag cn=%users wird allen Mitgliedern der Gruppe users - außer joe - auf
den Servern nameserver1 und nameserver2 das Recht gegeben, das CD-ROMLaufwerk zu mounten bzw. zu unmounten
und den Server herunter zu fahren bzw. neu
zu starten.
Anpassung der Clients
Nun müssen die sudo-Clients von dem
LDAP-Server erfahren. Hierzu wird auf dem
Client lokal die Datei /etc/ldap.conf bearbeitet bzw. neu angelegt. sudo_debug ist
bei der Fehlersuche hilfreich, sollte bei erfolgreichem Betrieb aber auf 0 gesetzt werden.
Die Datei sollte dem Benutzer root gehören
und auch nur für ihn Leserechte besitzen. Die
alte Datei /etc/sudoers könnte jetzt vom
System entfernt werden.
Möchte man allerdings einen Fallback-Mechanismus realisieren, welcher bei Netzwerkausfall greift, lässt man sie lokal bestehen. Die
Datei wird dann automatisch genutzt, falls der
LDAP-Server nicht erreichbar sein sollte. Das
Kommando sudo -l sollte nun die Kommandos anzeigen, die der aufrufende Benutzer
ausführen darf.
Glossar
DatenbankBackend
LDIF
Eine Datenbank, die für die physikalische Speicherung der Daten genutzt wird. Diese kann textbasiert sein - aber auch eine SQL-Datenbank ist möglich.
LDAP Data Interchange Format. LDIF ist ein ASCII-basiertes Dateiformat zur Darstellung von Informationen aus einem LDAP-Verzeichnis.
Seminarempfehlung:
OpenLDAP - Praxiseinsatz im Netzwerk
► Internet: http://training.ordix.de/seminar.php?nr=636
OpenLDAP, eine Implementation des LDAP als freie Software, ist Bestandteil der meisten, aktuellen Linux-Distributionen und läuft auch unter verschiedenen Unix-Derivaten.
In diesem Workshop bekommt der Teilnehmer einen Überblick über die Funktionsweise
und Administration von OpenLDAP.
Seminarinhalte:
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
Grundbegriffe der Protokolle LDAP und X500
Aufbau und Komponenten eines Verzeichnisdienstes
LDAP-Utilities zum Bearbeiten des Verzeichnisses
Graphische Tools für LDAP Zugriffe
Aufbau Schema, Entwurf eigener Schemata
Erweiterte Serverkonfiguration für multiple Baumstrukturen
Debugging und Logging
Anbindung von Overlays
Replikation und Abgleich von Verzeichnisdaten
Master/Slave-Konfiguration
Zeitsynchronisation mit NTP
Clientanbindung an LDAP Verzeichnisdienste
Einsatz von ACL‘s zur Zugriffsbeschränkung
Sicherheit mit SSL/TLS
LDAP im Zusammenspiel mit Anwendungen
Übungen
Termine:
17.03.- 19.03.2008in Wiesbaden
23.06.- 25.06.2008 in Wiesbaden
15.09.- 17.09.2008 in Wiesbaden
10.11.- 12.11.2008in Wiesbaden
Seminar-ID: BS-16
Dauer: 3 Tage
Preis pro Teilnehmer:
1.090,00 € (zzgl. MwSt.)
Resümee
Wie in diesem und dem letzten ORDIX News
Artikel berichtet, bietet OpenLDAP 2.3 einige
neue Funktionen, die die Administration vor
allem von größeren Netzwerken mit mehreren LDAP-Servern erleichtern.
Die in der Ausgabe 4/2007 beschriebenen
overlays bieten modulare Möglichkeiten,
den LDAP-Server um Funktionen zu erweitern, ohne ihn neu zu kompilieren. Die hier beschriebene Konfiguration zur Laufzeit erweitert
die Administration, ohne dass lästige Neustarts
der Dienste erforderlich werden.
Die Integration der sudo-Verwaltung ist nur ein
Beispiel von vielen, wie man die Konfiguration zentral im LDAP verwaltet. Weitere Möglichkeiten sind zum Beispiel die Pflege der
E-Mail-Adressen, die Verwaltung von Radiusbenutzern oder die Verwaltung der DHCP/
DNS-Daten innerhalb von LDAP.
Christian Fertsch ([email protected]).
ORDIX News 1/2008
51
Wir lieben Java!
Ein starkes Team für individuelle Anwendungsentwicklung
Die Struktur Ihres Unternehmens mit Ihrer Organisation und Ihren Abläufen ist einzigartig.
Wir entwickeln für Sie Lösungen, so individuell wie Ihr Unternehmen!
Wir bieten:
• Konzeption und Implementierung von JEE-Projekten
• Integration von Open Source Komponenten
•
•
•
•
•
(z. B. Hibernate, Struts, Seam und Spring)
Application Server (z. B. JBoss, WebSphere)
Web-basierte Anwendungen mit JSF, JSP, Servlets u. a.
GUI-Entwicklung mit Swing
Verteilte Anwendungen
Seminare, Coaching
... für Ihre Geschäftsprozesse.
Weitere Informationen finden Sie im Internet unter http://www.ordix.de.
Für ein persönliches Gespräch wenden Sie sich an Frau Jana Kreschel: [email protected]
Herunterladen