===== 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. ==== 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'' ==== 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 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 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'' ==== 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. ==== Ausfall eines Nodes ==== Bei Ausfall eines Nodes wird der Betrieb der virtuellen Maschine nicht gestört. ''Host ~$ **qemu sheepdog:ReactOS.img**'' ''Node01 ~$ **sudo halt**'' Steht der Node wieder zur Verfügung, werden dessen Sheepdog Daten aktualisiert. ==== 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 -hda nbd:unix:/var/lock/qemu-nbd**''