Collie Sheepdog, Distributed Storage System, corosync
(Link zu dieser Seite als [[QEMU-KVM-Buch/ Speichermedien/ Sheepdog]])
Inhaltsverzeichnis |
[bearbeiten] Sheepdog
Website: http://www.osrg.net/sheepdog/
Sheepdog ist ein Distributed Storage System für QEMU. Es bietet hochverfügbaren Storage auf Block-Ebene für virtuelle Maschinen. Das heißt, der Speicherplatz für die virtuellen Festplatten wird auf mehrere Sheepdog-Server (Nodes) gespiegelt. Es gibt keinen zentralen Server. Sheepdog skaliert bis zu hunderten Nodes und unterstützt erweiterte Volumen-Management-Funktionen wie Snapshots, Cloning und Thin Provisioning. Die Clients brauchen sich nicht darum zu kümmern, auf welchen Nodes die jeweiligen Blöcke gespiegelt werden. Die Kommunikation der Nodes erfolgt über die Corosync Cluster Engine (http://www.corosync.org). Corosync ist ein Fork des OpenAIS-Projektes und stellt eine Kommunikationsschicht für verteilte Anwendungen zur Verfügung. Mit Hilfe des Totem-Protokolls wird eine fehlertolerante Multicast-Kommunikation realisiert.
[bearbeiten] Installation
Zur Installation sind eine oder mehrere x86-Maschinen (64-Bit) notwendig. Auf einen Sheepdog-Node kann auch QEMU ab Version 0.13 installiert sein. Zu empfehlen sind mindestens drei Nodes. Für eine Testumgebung ist die Installation in virtuellen Maschinen möglich. In diesem Beispiel werden zunächst zwei Nodes mit den IP-Adressen 192.168.1.201 (Node01) und 192.168.1.202 (Node01) verwendet. Auf dem Rechner Host läuft QEMU. Auf diesem Computer soll später acuh Sheepdog installiert werden.
Per Default verwendet Sheepdog das Verzeichnis /var/lib/sheepdog zum Speichern der Daten. Dieses Verzeichnis ist auf den Nodes jeweils als separate Partition anzulegen. Da die Daten der Images auf allen Nodes kopiert werden, diese Partition entsprechend groß zu wählen. Das Eininden der Partition muss mit dem XATTR-Support erfolgen. In diesem Beispiel wird als Dateisystem ext4 verwendet. In der Datei /etc/fstab ist dazu statt defaults die Option user_xattr einzutragen. Manuell wird diese Mount-Option mit diesem Befehl hinzugefügt:
Node01 ~$ sudo mount -o remount,user_xattr /var/lib/sheepdog
Neben einem Kernel ab Version 2.6.27 wird glibc ab Version 2.9, Corosync und libcorosync-dev benötigt. Zuerst wird corosync installiert. Unter Debian/Ubuntu erfolgt dies mit diesem Befehl:
Node01 ~$ sudo apt-get install corosync libcorosync-dev
Für Red Hat, CentOS und Fedora ist folgender Befehl anzuwenden.
Node01 ~$ sudo yum install corosynclib-devel
Unter Ubuntu ist in der Datei /etc/default/corosync die Variable START mit dem Wert yes zu definieren. Corosync ist zu starten. Bei Problemen sind die Einträge in der Log-Datei zu analysieren. Die Log-Datei wird in der Konfigurationsdatei /etc/corosync/corosync.conf definiert.
Node01 ~$ sudo service corosync start Node01 ~$ ps aux | grep corosyn[c]
Läuft Corosync auf allen Nodes, wird Sheepdog installiert. Ist kein entsprechendes Paket vorhanden, sind die Quellen zu kompilieren. Dazu sind diese Pakete notwendig:
Node01 ~$ sudo apt-get install git-core automake libtool Node01 ~$ sudo apt-get install libc6 libc6-dev pkg-config Node01 ~$ sudo apt-get install debhelper
Die Quellen werden heruntergeladen und kompiliert. Für Linux-Distributionen mit RPM-Paketmanagement steht der Befehl make rpm zur Verfügung. Dieser ist hier statt make install anzuwenden.
Node01 ~$ mkdir -p ~/source Node01 ~$ cd ~/source Node01 ~$ git clone git://sheepdog.git.sf.net/gitroot/sheepdog/sheepdog Node01 ~$ cd sheepdog Node01 ~$ ./autogen.sh Node01 ~$ ./configure Node01 ~$ sudo make install Node01 ~$ cd -
Auf jedem Node ist der Sheepdog-Daemon zu starten.
Node01 ~$ sudo service sheepdog start Node01 ~$ service sheepdog status
Sheepdog legt Unterverzeichnisse und eine Log-Datei an.
Node01 ~$ ls /var/lib/sheepdog/ epoch journal obj sheep.log
Damit Sheepdog automatisch beim Boot-Vorgang gestartet wird, sind entsprechende Symlinks zu setzen.
Node01 ~$ sudo ln -s /etc/init.d/sheepdog /etc/rc1.d/K06sheepdog Node01 ~$ sudo ln -s /etc/init.d/sheepdog /etc/rc6.d/K06sheepdog Node01 ~$ sudo ln -s /etc/init.d/sheepdog /etc/rcS.d/S60sheepdog Node01 ~$ sudo reboot Node01 ~$ ps aux | grep shee[p]
Zur Administration von Sheepdog dient der Befehl collie (Sheepdog Administrator Utilty).
Node01 ~$ collie --help
Usage: collie command subcommand [options] Sheepdog Administrator Utilty Command syntax: cluster (info|format|shutdown) node (info|list) vdi (list|tree|graph|delete|object|setattr|getattr) Common parameters: -a, --address specify the daemon address (default: localhost) -p, --port specify the daemon port -h, --help display this help and exit
Die Nodes lassen sich auflisten. Mit der Default-Konfiguration sieht aber jeder Node nur sich selbst.
Node01 ~$ collie node list
Idx - Host:Port Number of vnodes ------------------------------------------------ * 0 - 127.0.0.1:7000 64
Um dies zu ändern, muss auf allen Nodes in der Datei /etc/corosync/corosync.conf die IP-Adresse des Nodes hinter bindnetaddr: eingetragen werden. Beispiel Node01:
# /etc/corosync/corosync.conf # man openais.conf totem { version: 2 token: 3000 token_retransmits_before_loss_const: 10 join: 60 consensus: 5000 vsftype: none max_messages: 20 clear_node_high_bit: yes secauth: off threads: 0 rrp_mode: none interface { ringnumber: 0 bindnetaddr: 172.16.0.0 # bindnetaddr: 127.0.0.1 bindnetaddr: 192.168.1.201 mcastaddr: 226.94.1.1 # Sende-Port=5404, Empfangs-Port=5405 mcastport: 5405 } } amf { mode: disabled } service { ver: 0 name: pacemaker } aisexec { user: root group: root } logging { fileline: off to_stderr: yes to_logfile: no to_syslog: yes syslog_facility: daemon debug: off timestamp: on logger_subsys { subsys: AMF debug: off tags: enter|leave|trace1|trace2|trace3|trace4|trace6 } }
Nach einem Neustart werden alle Nodes aufgelistet. Die Identifizierung eines Nodes erfolgt über eine eindeutige ID.
Node01 ~$ sudo reboot Node01 ~$ collie node list
Idx - Host:Port Number of vnodes ------------------------------------------------ * 0 - 192.168.1.201:7000 64 1 - 192.168.1.202:7000 64
Das Sheepdog-Cluster ist zu formatieren. Dies erfolgt auf einem Node mit dem Befehl collie cluster format. Hinter --copies= ist die Anzahl der Nodes anzugeben. Da neben den zwei Nodes auch Sheepdog auf dem QEMU-Rechner installiert werden soll, ist hier der Wert 3 vorzugeben.
Node01 ~$ collie cluster format --copies=3
Der Status des Clusters wird auf beiden Nodes überprüft.
Node01 ~$ collie cluster info running Node02 ~$ collie cluster info running
[bearbeiten] Verwalten von Images
In diesem Beispiel wird ein Image auf dem Cluster angelegt, wobei die Adressierung über den Hostnamen Node01 erfolgt. Das Port ist 7000.
Host ~$ qemu-img create sheepdog:Node01:7000:Platte.img 1G
Ein Sheepdog-Image wird in diesem Beispiel auf die lokale Platte kopiert.
Host ~$ qemu-img convert sheepdog:Node01:7000:Platte.img Platte.img
In diesem Beispiel wird ein vorhandenes Image in den Sheepdog-Cluster importiert. Es ist egal, ob hier Node01 oder Node02 verwendet wird.
Host ~$ qemu-img convert ReactOS.img sheepdog:Node02:7000:ReactOS.img
Das Gast-System auf dem importierten Sheepdog-Image wird gestartet. Es ist auch hier egal, ob Node01 oder Node02 verwendet wird.
Host ~$ qemu-system-x86_64 sheepdog:Node01:7000:ReactOS.img
VM-Snapshots lassen sich wie bei dem Format qcow2 anlegen. Der Name des neuen Snapshots ist hier vor_PatchDay.
Host ~$ qemu-img snapshot -c vor_PatchDay sheepdog:Node01:7000:ReactOS.img
Zum Booten mit dem Zustand eines VM-Snapshots hängt man dessen Namen an.
Host ~$ qemu-system-x86_64 sheepdog:Node01:7000:ReactOS.img:vor_PatchDay
Eine Overlay-Datei wird wie folgt generiert:
Host ~$ qemu-img create -b sheepdog:Node01:7000:ReactOS.img:vor_PatchDay \ sheepdog:Node01:7000:ReactOS.ovl
Zum Auflisten der virtuellen Festplatten dient der Befehl collie vdi list. Diese Befehl muss auf allen Nodes identische Ausgaben liefern.
Node01 ~$ collie vdi list
name id size used shared creation time vdi id ------------------------------------------------------------------ Platte.img 1 1.0 GB 0.0 MB 0.0 MB 2011-07-08 09:39 31040a s ReactOS.img 1 5.0 GB 192 MB 0.0 MB 2011-07-08 12:32 6634af ReactOS.img 2 5.0 GB 0.0 MB 192 MB 2011-07-08 12:46 6634b0 ReactOS.ovl 1 5.0 GB 0.0 MB 192 MB 2011-07-08 12:55 f92ee7
Mit dem Befehl collie vdi tree werden die Images mit Snapshots baumartig dargestellt.
Node01 ~$ collie vdi tree
Platte.img---(You Are Here) ReactOS.img---[2011-07-08 18:32]---(You Are Here) ReactOS.ovl---(You Are Here)
Eine grafische Darstellung wird durch den Befehl collie vdi graph ermöglicht.
Node01 ~$ collie vdi graph > grafik.dot
Aus der generierten Datei erzeugt das Tool Graphviz Grafik-Dateien. Dies kann auf einen beliebigen Rechner erfolgen.
~$ sudo apt-get install graphviz ~$ dot -Tgif grafik.dot -o grafik.gif
[bearbeiten] Ein QEMU-Host als Sheepdog-Node
Sind die Tests mit Sheepdog erfolgreich verlaufen, wird auch Sheepdog auf dem QEMU-Host installiert und in das Cluster eingebunden. Dazu sind obige Installationsschritte auf dem Host abzuarbeiten. Das Formatieren des Cluster mit dem Befehl collie cluster format ist nicht notwendig, wenn hinter --copies= bereits die entsprechende Anzahl angegeben wurde. Nach erfolgreicher Installation wird der Rechner Host als dritter Node aufgelistet.
Node01 ~$ collie node list
Idx - Host:Port Number of vnodes ------------------------------------------------ 0 - 192.168.1.100:7000 64 1 - 192.168.1.201:7000 64 * 2 - 192.168.1.202:7000 64
Die Adressierung der Sheepdog-Images vereinfacht sich. Die jeweilige Angabe des Nodes und dessen Port können entfallen.
Host ~$ qemu-img create sheepdog:Platte2.img 2G
[bearbeiten] Ausfall eines Nodes
Bei Ausfall eines Nodes wird der Betrieb der virtuellen Maschine nicht gestört.
Host ~$ qemu-system-x86_64 sheepdog:ReactOS.img Node01 ~$ sudo halt
Steht der Node wieder zur Verfügung, werden dessen Sheepdog Daten aktualisiert.
[bearbeiten] NBD-Unterstützung
Zur Unterstützung von Network Block Devices (http://qemu-buch.de/d/Speichermedien/_Network_Block_Devices) wird qemu-nbd mit dem Image gestartet.
Host ~$ qemu-nbd -t -k /var/lock/qemu-nbd sheepdog:ReactOS.img Host ~$ qemu-system-x86_64 -hda nbd:unix:/var/lock/qemu-nbd