MFde: Update the German Documentation set.
This update features the german translation of the HAST section. doc/de_DE.ISO8859-1/books/handbook/disks/chapter.sgml 1.303 -> 1.306 Obtained from: The FreeBSD German Documentation Project
This commit is contained in:
parent
6549aa799b
commit
01914f6de2
Notes:
svn2git
2020-12-08 03:00:23 +00:00
svn path=/head/; revision=37068
1 changed files with 690 additions and 9 deletions
|
@ -3,8 +3,8 @@
|
|||
The FreeBSD German Documentation Project
|
||||
|
||||
$FreeBSD$
|
||||
$FreeBSDde: de-docproj/books/handbook/disks/chapter.sgml,v 1.177 2011/03/06 15:51:59 jkois Exp $
|
||||
basiert auf: 1.303
|
||||
$FreeBSDde: de-docproj/books/handbook/disks/chapter.sgml,v 1.180 2011/03/13 19:26:47 bcr Exp $
|
||||
basiert auf: 1.306
|
||||
-->
|
||||
|
||||
<chapter id="disks">
|
||||
|
@ -4488,14 +4488,695 @@ Device 1K-blocks Used Avail Capacity
|
|||
</sect1>
|
||||
|
||||
<sect1 id="disks-hast">
|
||||
<title>Highly Available Storage (HAST)</title>
|
||||
<sect1info>
|
||||
<authorgroup>
|
||||
<author>
|
||||
<firstname>Daniel</firstname>
|
||||
<surname>Gerzo</surname>
|
||||
<contrib>Beigetragen von </contrib>
|
||||
</author>
|
||||
</authorgroup>
|
||||
<authorgroup>
|
||||
<author>
|
||||
<firstname>Freddie</firstname>
|
||||
<surname>Cash</surname>
|
||||
<contrib>Mit Beiträgen von </contrib>
|
||||
</author>
|
||||
<author>
|
||||
<firstname>Pawel Jakub</firstname>
|
||||
<surname>Dawidek</surname>
|
||||
</author>
|
||||
<author>
|
||||
<firstname>Michael W.</firstname>
|
||||
<surname>Lucas</surname>
|
||||
</author>
|
||||
<author>
|
||||
<firstname>Viktor</firstname>
|
||||
<surname>Petersson</surname>
|
||||
</author>
|
||||
</authorgroup>
|
||||
<authorgroup>
|
||||
<author>
|
||||
<firstname>Benedict</firstname>
|
||||
<surname>Reuschling</surname>
|
||||
<contrib>Übersetzt von </contrib>
|
||||
</author>
|
||||
</authorgroup>
|
||||
<!-- Date of writing: 26 February 2011 -->
|
||||
</sect1info>
|
||||
|
||||
<para>Dieses Kapitel ist noch nicht übersetzt.
|
||||
Lesen Sie bitte <ulink
|
||||
url="&url.books.handbook.en;/disks-hast.html">
|
||||
das Original in englischer Sprache</ulink>. Wenn Sie helfen
|
||||
wollen, dieses Kapitel zu übersetzen, senden Sie bitte
|
||||
eine E-Mail an die Mailingliste &a.de.translators;.</para>
|
||||
<title>Highly Available Storage (HAST)</title>
|
||||
<indexterm>
|
||||
<primary>HAST</primary>
|
||||
<secondary>high availability</secondary>
|
||||
</indexterm>
|
||||
|
||||
<sect2>
|
||||
<title>Überblick</title>
|
||||
|
||||
<para>Hochverfügbarkeit ist eine der Hauptanforderungen von
|
||||
ernsthaften Geschäftsanwendungen und hochverfügbarer Speicher
|
||||
ist eine Schlüsselkomponente in solchen Umgebungen. Highly
|
||||
Available STorage, oder <acronym>HAST<remark
|
||||
role="acronym">Highly Available STorage</remark></acronym>, wurde von
|
||||
&a.pjd; als ein Framework entwickelt, welches die transparente
|
||||
Speicherung der gleichen Daten über mehrere physikalisch getrennte
|
||||
Maschinen ermöglicht, die über ein TCP/IP-Netzwerk verbunden
|
||||
sind. <acronym>HAST</acronym> kann als ein netzbasiertes RAID1
|
||||
(Spiegel) verstanden werden und ist dem DRBD®-Speichersystem der
|
||||
GNU/&linux;-Plattform ähnlich. In Kombination mit anderen
|
||||
Hochverfügbarkeitseigenschaften von &os;
|
||||
wie <acronym>CARP</acronym>, ermöglicht es
|
||||
<acronym>HAST</acronym>, hochverfügbare Speichercluster zu bauen,
|
||||
die in der Lage sind, Hardwareausfällen zu widerstehen.</para>
|
||||
|
||||
<para>Nachdem Sie diesen Abschnitt gelesen haben, werden Sie folgendes
|
||||
wissen:</para>
|
||||
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>Was <acronym>HAST</acronym> ist, wie es funktioniert und
|
||||
welche Eigenschaften es besitzt.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Wie man <acronym>HAST</acronym> auf &os; aufsetzt und
|
||||
verwendet.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Wie man <acronym>CARP</acronym> und &man.devd.8; kombiniert, um
|
||||
ein robustes Speichersystem zu bauen.</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
|
||||
<para>Bevor Sie diesen Abschnitt lesen, sollten Sie:</para>
|
||||
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>die Grundlagen von &unix; und &os; verstanden haben
|
||||
(<xref linkend="basics">).</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>wissen, wie man Netzwerkschnittstellen und andere Kernsysteme
|
||||
von &os; konfiguriert (<xref linkend="config-tuning">).</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>ein gutes Verständnis der &os;-Netzwerkfunktionalität
|
||||
besitzen (<xref linkend="network-communication">).</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>&os; 8.1-RELEASE oder höher einsetzen.</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
|
||||
<para>Das <acronym>HAST</acronym>-Projekt wurde von der &os; Foundation
|
||||
mit Unterstützung der <ulink
|
||||
url="http://www.omc.net/">OMCnet Internet Service GmbH</ulink> und
|
||||
<ulink url="http://www.transip.nl/">TransIP BV</ulink>
|
||||
gesponsert.</para>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>HAST-Merkmale</title>
|
||||
|
||||
<para>Die Hauptmerkmale des <acronym>HAST</acronym>-Systems sind:</para>
|
||||
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>Es kann zur Maskierung von I/O-Fehlern auf lokalen Festplatten
|
||||
eingesetzt werden.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Dateisystem-unabhängig, was es erlaubt, jedes von &os;
|
||||
unterstützte Dateisystem zu verwenden.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Effiziente und schnelle Resynchronisation: es werden nur die
|
||||
Blöcke synchronisiert, die während der Ausfallzeit eines
|
||||
Knotens geändert wurden.</para>
|
||||
</listitem>
|
||||
<!--
|
||||
<listitem>
|
||||
<para>Besitzt mehrere Synchronisationsmodi, um eine schnelle
|
||||
Übergabe an einen anderen Knoten (sog. failover) zu
|
||||
ermöglichen.</para>
|
||||
</listitem>
|
||||
-->
|
||||
<listitem>
|
||||
<para>Es kann in einer bereits bestehenden Umgebung eingesetzt
|
||||
werden, um zusätzliche Redundanz zu erreichen.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Zusammen mit <acronym>CARP</acronym>,
|
||||
<application>Heartbeat</application>, oder anderen Werkzeugen, ist
|
||||
es möglich, ein robustes und dauerhaftes Speichersystem zu
|
||||
bauen.</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>HAST im Einsatz</title>
|
||||
|
||||
<para><acronym>HAST</acronym> stellt auf Block-Ebene eine synchrone
|
||||
Replikation eines beliebigen Speichermediums auf mehreren Maschinen zur
|
||||
Verfügung. Daher werden mindestens zwei Knoten (physikalische
|
||||
Maschinen) benötigt: der <literal>primary</literal>
|
||||
(auch bekannt als <literal>master</literal>) Knoten, sowie der
|
||||
<literal>secondary</literal> (<literal>slave</literal>) Knoten. Diese
|
||||
beiden Maschinen zusammen werden als Cluster bezeichnet.</para>
|
||||
|
||||
<note>
|
||||
<para>HAST ist momentan auf insgesamt zwei Knoten im Cluster
|
||||
beschränkt.</para>
|
||||
</note>
|
||||
|
||||
<para>Da <acronym>HAST</acronym> in einer
|
||||
primär-sekundär-Konfiguration funktioniert, ist immer nur ein
|
||||
Knoten des Clusters zu jeder Zeit aktiv. Der
|
||||
<literal>primäre</literal> Knoten, auch
|
||||
<literal>active</literal> genannt, ist derjenige, der alle I/O-Anfragen
|
||||
verarbeitet, die an die <acronym>HAST</acronym>-Schnittstelle gesendet
|
||||
werden. Der <literal>secondary</literal>-Knoten wird automatisch vom
|
||||
<literal>primary</literal>-Knoten aus synchronisiert.</para>
|
||||
|
||||
<para>Die physischen Komponenten des <acronym>HAST</acronym>-Systems
|
||||
sind:</para>
|
||||
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>lokale Platte (am Primärknoten)</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Platte am entfernten Rechner (Sekundärknoten)</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
|
||||
<para><acronym>HAST</acronym> arbeitet synchron auf Blockebene, was es
|
||||
für Dateisysteme und Anwendungen transparent macht.
|
||||
<acronym>HAST</acronym> stellt gewöhnliche GEOM-Provider im
|
||||
Verzeichnis <filename class="directory">/dev/hast/</filename> für
|
||||
die Verwendung durch andere Werkzeuge oder Anwendungen zur
|
||||
Verfügung, somit gibt es keinen Unterschied zwischen dem Einsatz
|
||||
von durch <acronym>HAST</acronym> bereitgestellten Geräten und
|
||||
herkömmlichen Platten, Partitionen, etc.</para>
|
||||
|
||||
<para>Jede Schreib-, Lösch- oder Entleerungsoperation wird an die
|
||||
lokale und über TCP/IP zu der entfernt liegenden
|
||||
Platte gesendet. Jede Leseoperation wird von der lokalen Platte
|
||||
durchgeführt, es sei denn, die lokale Platte ist nicht aktuell
|
||||
oder es tritt ein I/O-Fehler auf. In solchen Fällen wird die
|
||||
Leseoperation an den Sekundärknoten geschickt.</para>
|
||||
|
||||
<sect3>
|
||||
<title>Synchronisation und Replikationsmodi</title>
|
||||
|
||||
<para><acronym>HAST</acronym> versucht, eine schnelle Fehlerbereinigung
|
||||
zu gewährleisten. Aus diesem Grund ist es sehr wichtig, die
|
||||
Synchronisationszeit nach dem Ausfall eines Knotens zu reduzieren.
|
||||
Um eine schnelle Synchronisation zu ermöglichen, verwaltet
|
||||
<acronym>HAST</acronym> eine Bitmap von unsauberen Bereichen
|
||||
auf der Platte und synchronisiert nur diese während einer
|
||||
regulären Synchronisation (mit Ausnahme der initialen
|
||||
Synchronisation).</para>
|
||||
|
||||
<para>Es gibt viele Wege, diese Synchronisation zu behandeln.
|
||||
<acronym>HAST</acronym> implementiert mehrere Replikationsarten, um
|
||||
unterschiedliche Methoden der Synchronisation zu realisieren:</para>
|
||||
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para><emphasis>memsync</emphasis>: meldet Schreiboperationen als
|
||||
vollständig, wenn die lokale Schreiboperation beendet ist
|
||||
und der entfernt liegende Knoten die Ankunft der Daten
|
||||
bestätigt hat, jedoch bevor die Daten wirklich gespeichert
|
||||
wurden. Die Daten werden auf dem entfernt liegenden Knoten
|
||||
direkt nach dem Senden der Bestätigung gespeichert. Dieser
|
||||
Modus ist dafür gedacht, Latenzen zu verringern und
|
||||
zusätzlich eine gute Verlässlichkeit zu bieten. Der
|
||||
<emphasis>memsync</emphasis>-Replikationsmodus ist momentan noch
|
||||
nicht implementiert.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><emphasis>fullsync</emphasis>: meldet Schreiboperationen als
|
||||
vollständig, wenn die lokale Schreiboperation beendet ist
|
||||
und die entfernte Schreiboperation ebenfalls abgeschlossen wurde.
|
||||
Dies ist der sicherste und zugleich der langsamste
|
||||
Replikationsmodus. Er stellt den momentanen Standardmodus
|
||||
dar.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><emphasis>async</emphasis>: meldet Schreiboperationen als
|
||||
vollständig, wenn lokale Schreibvorgänge abgeschlossen
|
||||
wurden. Dies ist der schnellste und gefährlichste
|
||||
Replikationsmodus. Er sollte verwendet werden, wenn die Latenz
|
||||
zu einem entfernten Knoten bei einer Replikation zu hoch ist
|
||||
für andere Modi. Der
|
||||
<emphasis>async</emphasis>-Replikationsmodus ist zum
|
||||
gegenwärtigen Zeitpunkt nicht implementiert.</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
|
||||
<warning>
|
||||
<para>Momentan wird nur der
|
||||
<emphasis>fullsync</emphasis>-Replikationsmodus
|
||||
unterstützt.</para>
|
||||
</warning>
|
||||
</sect3>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>HAST-Konfiguration</title>
|
||||
|
||||
<para><acronym>HAST</acronym> benötigt
|
||||
<literal>GEOM_GATE</literal>-Unterstützung, um korrekt zu
|
||||
funktionieren. Der <literal>GENERIC</literal>-Kernel enthält
|
||||
jedoch <literal>GEOM_GATE</literal> <emphasis>nicht</emphasis> von
|
||||
vornherein, jedoch ist in der Standardinstallation von &os;
|
||||
<filename>geom_gate.ko</filename> als ladbares Modul vorhanden.
|
||||
Stellen Sie bei Systemen, bei denen nur das Allernötigste
|
||||
vorhanden sein soll, sicher, dass dieses Modul zur Verfügung
|
||||
steht. Als Alternative lässt sich die
|
||||
<acronym>GEOM_GATE</acronym>-Unterstützung direkt in den Kernel
|
||||
statisch einbauen, indem Sie die folgende Zeile zu Ihrer
|
||||
Kernelkonfigurationsdatei hinzufügen:</para>
|
||||
|
||||
<programlisting>options GEOM_GATE</programlisting>
|
||||
|
||||
<para>Das <acronym>HAST</acronym>-Framework besteht aus Sicht des
|
||||
Betriebssystems aus mehreren Bestandteilen:</para>
|
||||
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>Dem &man.hastd.8;-Dienst, welcher für die
|
||||
Datensynchronisation verantwortlich ist,</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Dem &man.hastctl.8; Management-Werkzeug,</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Der Konfigurationsdatei &man.hast.conf.5;.</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
|
||||
<para>Das folgende Beispiel beschreibt, wie man zwei Knoten als
|
||||
<literal>master</literal>-<literal>slave</literal> /
|
||||
<literal>primary</literal>-<literal>secondary</literal> mittels
|
||||
<acronym>HAST</acronym> konfiguriert, um Daten zwischen diesen beiden
|
||||
auszutauschen. Die Knoten werden als
|
||||
<literal><replaceable>hasta</replaceable></literal> mit der IP-Adresse
|
||||
<replaceable>172.16.0.1</replaceable> und
|
||||
<literal><replaceable>hastb</replaceable></literal> mit der IP-Adresse
|
||||
<replaceable>172.16.0.2</replaceable> bezeichnet. Beide Knoten
|
||||
besitzen eine dedizierte Festplatte
|
||||
<devicename>/dev/<replaceable>ad6</replaceable></devicename> mit der
|
||||
gleichen Grösse für den <acronym>HAST</acronym>-Betrieb.
|
||||
Der <acronym>HAST</acronym>-Pool (manchmal auch Ressource
|
||||
genannt, z.B. der GEOM-Provider in <filename
|
||||
class="directory">/dev/hast/</filename>) wird als
|
||||
<filename><replaceable>test</replaceable></filename> bezeichnet.</para>
|
||||
|
||||
<para>Die Konfiguration von <acronym>HAST</acronym> wird in der Datei
|
||||
<filename>/etc/hast.conf</filename> vorgenommen. Diese Datei sollte
|
||||
auf beiden Knoten gleich sein. Die denkbar einfachste Konfiguration
|
||||
ist folgende:</para>
|
||||
|
||||
<programlisting>resource test {
|
||||
on hasta {
|
||||
local /dev/ad6
|
||||
remote 172.16.0.2
|
||||
}
|
||||
on hastb {
|
||||
local /dev/ad6
|
||||
remote 172.16.0.1
|
||||
}
|
||||
}</programlisting>
|
||||
|
||||
<para>Schlagen Sie in der &man.hast.conf.5;-Manualpage nach, wenn Sie an
|
||||
erweiterten Konfigurationsmöglichkeiten interessiert sind.</para>
|
||||
|
||||
<tip>
|
||||
<para>Es ist ebenfalls möglich, den Hostnamen in den
|
||||
<literal>remote</literal>-Anweisungen zu verwenden. Stellen Sie in
|
||||
solchen Fällen sicher, dass diese Rechner auch aufgelöst
|
||||
werden können, also in der Datei <filename>/etc/hosts</filename>
|
||||
aufgeführt sind, oder alternativ im lokalen
|
||||
<acronym>DNS</acronym>.</para>
|
||||
</tip>
|
||||
|
||||
<para>Da nun die Konfiguration auf beiden Rechnern vorhanden ist, sind
|
||||
Sie in der Lage, den <acronym>HAST</acronym>-Pool zu erstellen. Lassen
|
||||
Sie die folgenden Kommandos auf beiden Knoten ablaufen, um die
|
||||
initialen Metadaten auf die lokale Platte zu schreiben und starten Sie
|
||||
anschliessend den &man.hastd.8;-Dienst:</para>
|
||||
|
||||
<screen>&prompt.root; <userinput>hastctl create test</userinput>
|
||||
&prompt.root; <userinput>/etc/rc.d/hastd onestart</userinput></screen>
|
||||
|
||||
<note>
|
||||
<para>Es ist <emphasis>nicht</emphasis> möglich, GEOM-Provider mit
|
||||
einem bereits bestehenden Dateisystem zu verwenden (z.B. um einen
|
||||
bestehenden Speicher in einen von <acronym>HAST</acronym> verwalteten
|
||||
Pool zu konvertieren), weil diese Prozedur bestimmte Metadaten auf
|
||||
den Provider schreiben muss und dafür nicht genug freier Platz
|
||||
zur Verfügung stehen wird.</para>
|
||||
</note>
|
||||
|
||||
<para>HAST ist nicht dafür verantwortlich, die Rolle
|
||||
(<literal>primary</literal> oder <literal>secondary</literal>) für
|
||||
den jeweiligen Knoten festzulegen. Die Rolle des Knotens muss vom
|
||||
Administrator oder einer anderen Software wie
|
||||
<application>Heartbeat</application> mittels des
|
||||
&man.hastctl.8;-Werkzeugs festgelegt werden. Auf dem primären
|
||||
Knoten (<literal><replaceable>hasta</replaceable></literal>) geben Sie
|
||||
nun den folgenden Befehl ein:</para>
|
||||
|
||||
<screen>&prompt.root; <userinput>hastctl role primary test</userinput></screen>
|
||||
|
||||
<para>Geben Sie nun, ähnlich wie zuvor, das folgende Kommando auf
|
||||
dem sekundären Knoten
|
||||
(<literal><replaceable>hastb</replaceable></literal>) ein:</para>
|
||||
|
||||
<screen>&prompt.root; <userinput>hastctl role secondary test</userinput></screen>
|
||||
|
||||
<caution>
|
||||
<para>Es kann passieren, dass beide Knoten nicht in der Lage sind,
|
||||
miteinander zu kommunizieren und dadurch beide als primäre
|
||||
Knoten konfiguriert sind; die Konsequenz daraus wird als
|
||||
<literal>split-brain</literal> bezeichnet. Um diese Situation zu
|
||||
bereinigen, folgen Sie den Schritten, die in <xref
|
||||
linkend="disks-hast-sb"> beschrieben sind.</para>
|
||||
</caution>
|
||||
|
||||
<para>Es ist möglich das Ergebnis des &man.hastctl.8;-Werkzeugs auf
|
||||
jedem Knoten zu überprüfen:</para>
|
||||
|
||||
<screen>&prompt.root; <userinput>hastctl status test</userinput></screen>
|
||||
|
||||
<para>Der wichtigste Teil ist die <literal>status</literal>-Textzeile der
|
||||
Ausgabe, die auf jedem Knoten <literal>complete</literal> lauten
|
||||
sollte. Falls der Status als <literal>degraded</literal>
|
||||
zurückgemeldet wird, ist etwas schief gegangen. Zu diesem
|
||||
Zeitpunkt hat die Synchronisation zwischen den beiden Knoten bereits
|
||||
begonnen. Die Synchronisation ist beendet, wenn das Kommando
|
||||
<command>hastctl status</command> meldet, dass die
|
||||
<literal>dirty</literal>-Bereiche 0 Bytes betragen.</para>
|
||||
|
||||
<para>Der letzte Schritt ist, ein Dateisystem auf dem
|
||||
<devicename>/dev/hast/<replaceable>test</replaceable></devicename>
|
||||
GEOM-Provider anzulegen und dieses ins System einzuhängen. Dies
|
||||
muss auf dem <literal>primary</literal>-Knoten durchgeführt werden
|
||||
(da <filename>/dev/hast/<replaceable>test</replaceable></filename> nur
|
||||
auf dem <literal>primary</literal>-Knoten erscheint). Dies kann ein
|
||||
paar Minuten dauern, abhängig von der Grösse der
|
||||
Festplatte:</para>
|
||||
|
||||
<screen>&prompt.root; <userinput>newfs -U /dev/hast/test</userinput>
|
||||
&prompt.root; <userinput>mkdir /hast/test</userinput>
|
||||
&prompt.root; <userinput>mount /dev/hast/test /hast/test</userinput></screen>
|
||||
|
||||
<para>Sobald das <acronym>HAST</acronym>-Framework richtig konfiguriert
|
||||
wurde, besteht der letzte Schritt nun darin, sicherzustellen, dass
|
||||
<acronym>HAST</acronym> während des Systemstarts automatisch
|
||||
gestartet wird. Die folgende Zeile sollte zur Datei
|
||||
<filename>/etc/rc.conf</filename> hinzugefügt werden:</para>
|
||||
|
||||
<programlisting>hastd_enable="YES"</programlisting>
|
||||
|
||||
<sect3>
|
||||
<title>Failover-Konfiguration</title>
|
||||
|
||||
<para>Das Ziel dieses Beispiels ist, ein robustes Speichersystem zu
|
||||
bauen, welches Fehlern auf einem beliebigen Knoten widerstehen kann.
|
||||
Die Schlüsselaufgabe in diesem Szenario besteht darin, zu
|
||||
verhindern, dass der <literal>primary</literal>-Knoten des Clusters
|
||||
ausfällt. Sollte es dennoch passieren, ist der
|
||||
<literal>secondary</literal>-Knoten da, um nahtlos einzuspringen, das
|
||||
Dateisystem zu prüfen, einzuhängen und mit der Arbeit
|
||||
fortzufahren, ohne dass auch nur ein einzelnes Bit an Daten verloren
|
||||
ging.</para>
|
||||
|
||||
<para>Um diese Aufgabe zu bewerkstelligen, ist es nötig, eine
|
||||
weitere Eigenschaft zu nutzen, die unter &os; verfügbar ist,
|
||||
welche ein automatisches Failover auf der IP-Schicht ermöglicht:
|
||||
<acronym>CARP</acronym>. <acronym>CARP</acronym> steht für
|
||||
Common Address Redundancy Protocol und erlaubt es mehreren Rechnern
|
||||
im gleichen Netzsegment, die gleiche IP-Adresse zu verwenden. Setzen
|
||||
Sie <acronym>CARP</acronym> auf beiden Knoten des Clusters anhand der
|
||||
Dokumentation in <xref linkend="carp"> auf. Nachdem dieser Schritt
|
||||
abgeschlossen ist, sollte jeder Knoten seine eigene
|
||||
<devicename>carp0</devicename>-Schnittstelle mit der geteilten
|
||||
IP-Adresse <replaceable>172.16.0.254</replaceable> besitzen.
|
||||
Selbstverständlich muss der primäre
|
||||
<acronym>HAST</acronym>-Knoten des Clusters der
|
||||
<acronym>CARP</acronym>-Masterknoten sein.</para>
|
||||
|
||||
<para>Der <acronym>HAST</acronym>-Pool, welcher im vorherigen Abschnitt
|
||||
erstellt wurde, ist nun bereit für den Export über das
|
||||
Netzwerk auf den anderen Rechner. Dies kann durch den Export
|
||||
über <acronym>NFS</acronym>, <application>Samba</application>
|
||||
etc. erreicht werden, indem die geteilte IP-Addresse
|
||||
<replaceable>172.16.0.254</replaceable> verwendet wird. Das einzige
|
||||
ungelöste Problem ist der automatische Failover, sollte der
|
||||
primäre Knoten einmal ausfallen.</para>
|
||||
|
||||
<para>Falls die <acronym>CARP</acronym>-Schnittstelle aktiviert oder
|
||||
deaktiviert wird, generiert das &os;-Betriebssystem ein
|
||||
&man.devd.8;-Ereignis, was es ermöglicht,
|
||||
Zustandsänderungen auf den
|
||||
<acronym>CARP</acronym>-Schnittstellen zu überwachen. Eine
|
||||
Zustandsänderung auf der <acronym>CARP</acronym>-Schnittstelle
|
||||
ist ein Indiz dafür, dass einer der Knoten gerade ausgefallen
|
||||
oder wieder verfügbar ist. In diesem Fall ist es möglich,
|
||||
ein Skript zu starten, welches den Failover automatisch
|
||||
durchführt.</para>
|
||||
|
||||
<para>Um diese Zustandsänderungen auf der
|
||||
<acronym>CARP</acronym>-Schnittstelle abzufangen, müssen die
|
||||
folgenden Zeilen in der Datei <filename>/etc/devd.conf</filename> auf
|
||||
jedem Knoten eingefügt werden:</para>
|
||||
|
||||
<programlisting>notify 30 {
|
||||
match "system" "IFNET";
|
||||
match "subsystem" "carp0";
|
||||
match "type" "LINK_UP";
|
||||
action "/usr/local/sbin/carp-hast-switch master";
|
||||
};
|
||||
|
||||
notify 30 {
|
||||
match "system" "IFNET";
|
||||
match "subsystem" "carp0";
|
||||
match "type" "LINK_DOWN";
|
||||
action "/usr/local/sbin/carp-hast-switch slave";
|
||||
};</programlisting>
|
||||
|
||||
<para>Um diese neue Konfiguration zu aktivieren, führen Sie das
|
||||
folgende Kommando auf beiden Knoten aus:</para>
|
||||
|
||||
<screen>&prompt.root; <userinput>/etc/rc.d/devd restart</userinput></screen>
|
||||
|
||||
<para>Für den Fall, dass die
|
||||
<devicename>carp0</devicename>-Schnittstelle aktiviert oder
|
||||
deaktiviert wird (sich also der Status der Schnittstelle
|
||||
ändert), erzeugt das System eine Meldung, was es dem
|
||||
&man.devd.8;-Subsystem ermöglicht, ein beliebiges Skript zu
|
||||
starten, in diesem Fall also
|
||||
<filename>/usr/local/sbin/carp-hast-switch</filename>. Dies ist das
|
||||
Skript, dass den automatischen Failover durchführt. Für
|
||||
genauere Informationen zu der obigen &man.devd.8;-Konfiguration,
|
||||
lesen Sie die &man.devd.conf.5;-Manualpage.</para>
|
||||
|
||||
<para>Ein Beispiel für ein solches Skript könnte wie folgt
|
||||
aussehen:</para>
|
||||
|
||||
<programlisting>#!/bin/sh
|
||||
|
||||
# Original script by Freddie Cash <fjwcash@gmail.com>
|
||||
# Modified by Michael W. Lucas <mwlucas@BlackHelicopters.org>
|
||||
# and Viktor Petersson <vpetersson@wireload.net>
|
||||
|
||||
# The names of the HAST resources, as listed in /etc/hast.conf
|
||||
resources="test"
|
||||
|
||||
# delay in mounting HAST resource after becoming master
|
||||
# make your best guess
|
||||
delay=3
|
||||
|
||||
# logging
|
||||
log="local0.debug"
|
||||
name="carp-hast"
|
||||
|
||||
# end of user configurable stuff
|
||||
|
||||
case "$1" in
|
||||
master)
|
||||
logger -p $log -t $name "Switching to primary provider for ${resources}."
|
||||
sleep ${delay}
|
||||
|
||||
# Wait for any "hastd secondary" processes to stop
|
||||
for disk in ${resources}; do
|
||||
while $( pgrep -lf "hastd: ${disk} \(secondary\)" > /dev/null 2>&1 ); do
|
||||
sleep 1
|
||||
done
|
||||
|
||||
# Switch role for each disk
|
||||
hastctl role primary ${disk}
|
||||
if [ $? -ne 0 ]; then
|
||||
logger -p $log -t $name "Unable to change role to primary for resource ${disk}."
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
# Wait for the /dev/hast/* devices to appear
|
||||
for disk in ${resources}; do
|
||||
for I in $( jot 60 ); do
|
||||
[ -c "/dev/hast/${disk}" ] && break
|
||||
sleep 0.5
|
||||
done
|
||||
|
||||
if [ ! -c "/dev/hast/${disk}" ]; then
|
||||
logger -p $log -t $name "GEOM provider /dev/hast/${disk} did not appear."
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
logger -p $log -t $name "Role for HAST resources ${resources} switched to primary."
|
||||
|
||||
|
||||
logger -p $log -t $name "Mounting disks."
|
||||
for disk in ${resources}; do
|
||||
mkdir -p /hast/${disk}
|
||||
fsck -p -y -t ufs /dev/hast/${disk}
|
||||
mount /dev/hast/${disk} /hast/${disk}
|
||||
done
|
||||
|
||||
;;
|
||||
|
||||
slave)
|
||||
logger -p $log -t $name "Switching to secondary provider for ${resources}."
|
||||
|
||||
# Switch roles for the HAST resources
|
||||
for disk in ${resources}; do
|
||||
if ! mount | grep -q "^/dev/hast/${disk} on "
|
||||
then
|
||||
else
|
||||
umount -f /hast/${disk}
|
||||
fi
|
||||
sleep $delay
|
||||
hastctl role secondary ${disk} 2>&1
|
||||
if [ $? -ne 0 ]; then
|
||||
logger -p $log -t $name "Unable to switch role to secondary for resource ${disk}."
|
||||
exit 1
|
||||
fi
|
||||
logger -p $log -t $name "Role switched to secondary for resource ${disk}."
|
||||
done
|
||||
;;
|
||||
esac</programlisting>
|
||||
|
||||
<para>Im Kern führt das Skript die folgenden Aktionen durch,
|
||||
sobald ein Knoten zum <literal>master</literal> /
|
||||
<literal>primary</literal> wird:</para>
|
||||
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>Es ernennt den <acronym>HAST</acronym>-Pool als den
|
||||
primären für einen gegebenen Knoten.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Es prüft das Dateisystem, dass auf dem
|
||||
<acronym>HAST</acronym>-Pool erstellt wurde.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Es hängt die Pools an die richtige Stelle im System
|
||||
ein.</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
|
||||
<para>Wenn ein Knoten zum <literal>backup</literal> /
|
||||
<literal>secondary</literal> ernannt wird:</para>
|
||||
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>Hängt es den <acronym>HAST</acronym>-Pool aus dem
|
||||
Dateisystem aus.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Degradiert es den <acronym>HAST</acronym>-Pool zum
|
||||
sekundären.</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
|
||||
<caution>
|
||||
<para>Bitte beachten Sie, dass dieses Skript nur ein Beispiel
|
||||
für eine mögliche Lösung darstellt. Es behandelt
|
||||
nicht alle möglichen Szenarien, die auftreten können und
|
||||
sollte erweitert bzw. abgeändert werden, so dass z.B.
|
||||
benötigte Dienste gestartet oder gestoppt werden usw.</para>
|
||||
</caution>
|
||||
|
||||
<tip>
|
||||
<para>Für dieses Beispiel wurde ein Standard-UFS Dateisystem
|
||||
verwendet. Um die Zeit für die Wiederherstellung zu
|
||||
verringern, kann ein UFS mit Journal oder ein ZFS-Dateisystem
|
||||
benutzt werden.</para>
|
||||
</tip>
|
||||
|
||||
<para>Weitere detaillierte Informationen mit zusätzlichen
|
||||
Beispielen können auf der <ulink
|
||||
url="http://wiki.FreeBSD.org/HAST">HAST Wiki</ulink>-Seite
|
||||
abgerufen werden.</para>
|
||||
</sect3>
|
||||
</sect2>
|
||||
<sect2>
|
||||
<title>Fehlerbehebung</title>
|
||||
|
||||
<sect3>
|
||||
<title>Allgemeine Tipps zur Fehlerbehebung</title>
|
||||
|
||||
<para><acronym>HAST</acronym> sollte generell ohne Probleme
|
||||
funktionieren. Jedoch kann es, wie bei jeder anderen Software auch,
|
||||
zu gewissen Zeiten sein, dass sie sich nicht so verhält wie
|
||||
angegeben. Die Quelle dieser Probleme kann unterschiedlich sein,
|
||||
jedoch sollte als Faustregel gewährleistet werden, dass die
|
||||
Zeit für beide Knoten im Cluster synchron läuft.</para>
|
||||
|
||||
<para>Die Anzahl an Debugging-Meldungen von &man.hastd.8; sollte
|
||||
erhöht werden, wenn Fehler von <acronym>HAST</acronym> bereinigt
|
||||
werden. Dies kann durch das Starten des &man.hastd.8;-Dienstes mit
|
||||
der Option <literal>-d</literal> erreicht werden. Wichtig zu wissen
|
||||
ist, dass diese Option mehrfach angegeben werden kann, um die Anzahl
|
||||
an Meldungen weiter zu erhöhen. Sie können viele
|
||||
nützliche Informationen auf diese Art bekommen. Sie sollten
|
||||
ebenfalls die Verwendung der Option <literal>-F</literal> in
|
||||
Erwägung ziehen, die den &man.hastd.8;-Dienst in den Vordergrund
|
||||
bringt.</para>
|
||||
</sect3>
|
||||
|
||||
<sect3 id="disks-hast-sb">
|
||||
<title>Auflösung des Split-brain-Zustands</title>
|
||||
|
||||
<para>Die Konsequenz aus der Situation, wenn beide Knoten des Clusters
|
||||
nicht in der Lage sind, miteinander zu kommunizieren und dadurch
|
||||
beide als primäre Knoten fungieren, wird als
|
||||
<literal>split-brain</literal> bezeichnet. Dies ist ein
|
||||
gefährlicher Zustand, weil es beiden Knoten erlaubt ist,
|
||||
Änderungen an den Daten vorzunehmen, die miteinander nicht in
|
||||
Einklang gebracht werden können. Diese Situation sollte vom
|
||||
Systemadministrator händisch bereinigt werden.</para>
|
||||
|
||||
<para>Um diese Situation zu beheben, muss der Administrator
|
||||
entscheiden, welcher Knoten die wichtigsten Änderungen von
|
||||
beiden besitzt (oder diese manuell miteinander vermischen) und
|
||||
anschliessend den <acronym>HAST</acronym>-Knoten die volle
|
||||
Synchronisation mit jenem Knoten durchführen zu lassen, welcher
|
||||
die beschädigten Daten besitzt. Um dies zu tun, geben Sie die
|
||||
folgenden Befehle auf dem Knoten ein, der neu synchronisiert werden
|
||||
soll:</para>
|
||||
|
||||
<screen>&prompt.root; <userinput>hastctl role init <resource></userinput>
|
||||
&prompt.root; <userinput>hastctl create <resource></userinput>
|
||||
&prompt.root; <userinput>hastctl role secondary <resource></userinput></screen>
|
||||
</sect3>
|
||||
</sect2>
|
||||
</sect1>
|
||||
</chapter>
|
||||
|
||||
|
|
Loading…
Reference in a new issue