Xen Cluster Management Mit Ganeti Auf Debian Etch

Version 1.0
Author: Falko Timme


Ganeti ist ein Cluster-Virtualisierungs-Management-System, das auf Xen basiert. In dieser Anleitung werde ich erklären, wie man eine virtuelle Xen Maschine (instance genannt) auf einem Cluster von zwei physikalischen Systemen erstellt und wie man diese Instance verwaltet und diese virtuelle Maschine ohne Ausfall betreiben kann, wenn eines der beiden Systeme ausfällt.

Diese Anleitung ist ohne jegliche Gewähr! Ich übernehme keine Garantie, dass dies auch bei Dir funktionieren wird!

1 Vorbemerkung

Ganeti befindet sich noch immer in einem frühen Stadium. Momentan kann es auf Debian Etch Systemen installiert werden. Weiterhin kannst Du damit virtuelle Maschinen erstellen, die auch Debian Etch verwenden. Andere Linux Distributionen sollten theoretisch auch funktionieren, es gibt allerdings noch keinerlei Dokumentation darüber.

In dieser Anleitung verwende ich die physikalischen Systeme node1.example.com und node2.example.com:
  • node1.example.com: IP Adresse 192.168.0.100; wird der Master des Clusters sein.
  • node2.example.com: IP Adresse 192.168.0.101; wird das primäre System der virtuellen Maschine sein (auch bekannt als instance).
Beide haben eine 50GB Festplatte, von denen ich 10GB für die / Partition und 1GB für Swap verwende und den Rest unpartitioniert lasse, sodass der Rest von Ganeti genutzt werden kann (das Minimum sind 20GB!). Natürlich kannst Du die Partitionierung an Deine Wünsche anpassen, aber denke an das Minimum des ungenutzten Speicherplatzes.

Das Cluster, das ich erstellen möchte, wird cluster1.example.com genannt und wird auch die IP Adresse 192.168.0.100 haben.

Die Xen virtuelle Maschine (instance in Ganeti-Sprache genannt) wird die Bezeichnung inst1.example.com tragen mit der IP Adresse 192.168.0.105. inst1.example.com wird zwischen den beiden physikalischen Systemen gespiegelt unter Verwendung von DRBD - Du siehst, dies ist eine Art Netzwerk-RAID1.

Wie Du siehst, wird node1.example.com der Cluster Master sein, das heißt die Maschine, von der aus Du das Cluster kontrollieren und managen kannst. node2.example.com wird das primäre System von inst1.example.com sein, das heißt inst1.example.com wird auf node2.example.com laufen (alle Änderungen auf inst1.example.com werden auf node1.example.com mit DRBD zurückgespiegelt) bis node1.example.com übernimmt (zum Beispiel wenn Du node2.example.com zu Wartungszwecken runterfährst). Dies ist eine aktiv-passiv Konfiguration.

Ich denke es macht sich ganz gut die Rollen zwischen den beiden Systemen aufzuteilen, damit Du den Cluster Master und das primäre System nicht auf einmal verlierst, sollte ein System ausfallen.

In meinen Tests habe ich zwei Systeme mit jeweils 204MB RAM für node1 und node2 verwendet. Das ist ziemlich wenig und Du solltest deutlich mehr RAM verwenden, besonders auf Produktionssystemen. Für meine Tests war es jedoch ausreichend. Wegen des wenigem RAM habe ich mein Xen dom0s (node1 und node2) auf 64MB RAM begrenzt. Der Ganeti Installationsleitfaden besagt, dass 512MB vernünftig sind - ich finde 256MB sollten auch funktionieren. Wie auch immer, Dein System muss mehr RAM aufweisen als das, was Du für dom0 festlegst, damit genügend RAM für die virtuelle(n) Maschine(n) übrig ist.

Eine letzte Sache, die Du beachten solltest, ist, dass alle Hostnamen, die hier erwähnt werden, von allen Hosts aufgelöst werden sollten, was bedeutet, dass sie entweder in DNS existieren müssen oder Du alle Hostnamen in die /etc/hosts Datei auf allen Hosts setzen musst (das werde ich hier durchführen).

Ok, lass uns anfangen...

2 Installation Eines Basis-Debian-Systems Auf Den Physikalischen Systemen

Richte ein Basis-Debian-Etch-System auf node1 und node2 ein:

node1/node2:

Lege Deine Debian Etch Netinstall CD ein und starte von ihr. Drücke ENTER um hochzufahren:


Die Installation startet. Als Erstes musst Du eine Sprache wählen:


Wähle dann Deinen Standort:



Wähle ein Tastaturlayout:


Der Installer überprüft die Installations-CD, Deine Festplatte und konfiguriert das Netzwerk mit DHCP, falls ein DHCP Server im Netzwerk vorhanden ist:


Gib den Hostnamen an. Für node1.example.com gib node1, für node2.example.com gib node2 ein:


Gib Deinen Domain-Namen ein. In diesem Beispiel ist das example.com:



Nun müssen wir die Festplatte partitionieren. Wie in Kapitel 1 erwähnt, möchte ich eine 10GB / Partition, eine 1GB Swap Partition und den Rest unpartitioniert haben. Wähle Manual als Partitionsschema:


Wähle die Festplatte aus:


Wähle Yes wenn Du Folgendes gefragt wirst Create new empty partition table on this device?:


Wähle den freien Speicherplatz auf Deiner Festplatte aus:


Wähle Create a new partition:


Gib 10 GB als Partitionsgröße an (oder die Größe, die die / Partition haben soll):


Wähle Primary als Partitionstyp:


Wähle Beginning:


Pass auf, dass Du Bootable flag auf on setzt, wähle dann Done setting up the partition:


Die / Partition ist nun eingerichtet. Lass uns nun die Swap Partition erstellen. Wähle erneut den freien Speicherplatz:


Wähle wieder Create a new partition :



Gib 1 GB als Partitionsgröße an (oder die Größe, die Deine Swap Partition haben soll):


Wähle Primary:


Wähle Beginning:


Gehe dann zur Use as: Zeile und drücke ENTER:


Wähle swap area:


Wähle danach Done setting up the partition:


Wähle danach Finish partitioning and write changes to disk (pass auf, dass Du mindestens 20 GB unpartitionierten Platz hast):


Wähle Yes wenn Du gefragt wirst Write changes to disks?:


Danach werden Deine neuen Partitionen erstellt und formatiert:


Weise danach dem Root-Benutzer ein Passwort zu:


Bestätige dieses Passwort um Tippfehler zu vermeiden:



Erstelle ein normales Benutzer-Konto, zum Beispiel den Benutzer Administrator mit dem Benutzernamen administrator (verwende nicht den Benutzernamen admin da dieser auf Debian Etch ein reservierter Name ist):





Nun wird das Basissystem installiert:


Als Nächstes müssen wir apt konfigurieren. Da Du die Debian Etch Netinstall CD verwendest, die nur einen geringen Satz von Paketen enthält, musst Du einen Netzwerkspiegel verwenden:


Wähle das Land, in dem sich der Netzwerkspiegel, den Du verwenden möchtest, befindet (für gewöhnlich ist es das Land, in dem sich Dein Debian Etch System befindet):


Wähle dann den Spiegel aus, den Du verwenden möchtest (z.B. ftp2.de.debian.org):


Wenn Du kein HTTP Proxy verwendest, lass folgendes Feld frei und drücke Continue:


Apt aktualisiert nun seine Paketdatenbanken:



Du kannst die Umfrage bezüglich der Paketverwendung übespringen, indem Du No wählst:


Wir möchten ein Basissystem, daher wählen wir nur Standard system und drücken Continue:


Die benötigten Pakete werden auf dem System installiert:


Wenn Du gefragt wirst: Install the GRUB boot loader to the master boot record, wähle Yes:


Die Installation des Basissystems ist nun abgeschlossen. Entferne die Debian Etch Netinstall CD aus dem CD Laufwerk und drücke Continue um das System neu zu starten:


Weiter zum nächsten Schritt...

3 Die Physikalischen Systeme Vorbereiten

node1/node2:

Zunächst aktualisieren wir die Paketdatenbank:

apt-get update

Dann installieren wir OpenSSH sowie einen voll ausgestatteten vim Text Editor (wenn Du keinen anderen Text Editor bevorzugst, wie zum Beispiel nano):

apt-get install ssh openssh-server vim-full

node1:

Da der Debian Etch Installer unser System so konfiguriert hat, dass es seine Netzwerkeinstellungen via DHCP bezieht, müssen wir dies nun ändern, da ein Server eine statische IP Adresse haben sollte. Bearbeite /etc/network/interfaces und passe sie an Deine Bedürfnisse an (bitte beachte, dass ich allow-hotplug eth0 mit auto eth0 ersetze; sonst funktioniert der Neustart des Systems nicht und wir müssten dann das ganze System neu starten):

vi /etc/network/interfaces


# The loopback network interface
auto lo iface lo inet loopback # The primary network interface #allow-hotplug eth0 #iface eth0 inet dhcp auto eth0 iface eth0 inet static address 192.168.0.100 netmask 255.255.255.0 network 192.168.0.0 broadcast 192.168.0.255 gateway 192.168.0.1
Starte dann Dein Netzwerk neu:

/etc/init.d/networking restart

Bearbeite dann /etc/hosts damit es so aussieht:

vi /etc/hosts


127.0.0.1       localhost.localdomain   localhost
192.168.0.100 node1.example.com node1 cluster1.example.com cluster1 192.168.0.101 node2.example.com node2 192.168.0.105 inst1.example.com inst1 # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts
Als Nächstes müssen wir sicherstellen, dass die Befehle

hostname

und

hostname -f

den vollständigen Hostname (node1.example.com) ausgibt. Wenn Du etwas anders erhältst (z.B. nur node1), führe Folgendes aus:

echo node1.example.com > /etc/hostname
/etc/init.d/hostname.sh start

Danach sollten die hostname Befehle den vollständigen Hostnamen ausgeben.

node2:

Nun führen wir das Gleiche auf node2.example.com aus:

vi /etc/network/interfaces


# The loopback network interface
auto lo iface lo inet loopback # The primary network interface #allow-hotplug eth0 #iface eth0 inet dhcp auto eth0 iface eth0 inet static address 192.168.0.101 netmask 255.255.255.0 network 192.168.0.0 broadcast 192.168.0.255 gateway 192.168.0.1
/etc/init.d/networking restart

vi /etc/hosts


127.0.0.1       localhost.localdomain   localhost
192.168.0.100 node1.example.com node1 cluster1.example.com cluster1 192.168.0.101 node2.example.com node2 192.168.0.105 inst1.example.com inst1 # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts

echo node2.example.com > /etc/hostname
/etc/init.d/hostname.sh start

node1/node2:

Bearbeite /etc/apt/sources.list. Kommentiere die CD aus. So sollte dies aussehen:

vi /etc/apt/sources.list


#
# deb cdrom:[Debian GNU/Linux 4.0 r0 _Etch_ - Official i386 NETINST Binary-1 20070407-11:29]/ etch contrib main #deb cdrom:[Debian GNU/Linux 4.0 r0 _Etch_ - Official i386 NETINST Binary-1 20070407-11:29]/ etch contrib main deb http://ftp2.de.debian.org/debian/ etch main deb-src http://ftp2.de.debian.org/debian/ etch main deb http://security.debian.org/ etch/updates main contrib deb-src http://security.debian.org/ etch/updates main contrib

Lass dann dies laufen

apt-get update

um die apt Paketdatenbank zu aktualisieren und

apt-get upgrade

die neusten Updates zu installieren (wenn es welche gibt). Installiere danach das build-essential Paket:

apt-get install build-essential


4 Installation von Xen

node1/node2:

Als Nächstes installieren wir Xen auf beiden physikalischen Systemen:

apt-get install xen-linux-system-2.6.18-5-xen-686 libc6-xen

Dann bearbeiten wir /etc/xen/xend-config.sxp und ändern die dom0-min-mem Zeile so, dass sie wie folgt aussieht:

vi /etc/xen/xend-config.sxp


[...]
# Dom0 will balloon out when needed to free memory for domU. # dom0-min-mem is the lowest memory level (in MB) dom0 will get down to. # If dom0-min-mem=0, dom0 will never balloon out. (dom0-min-mem 0) [...]
Öffne als Nächstes /boot/grub/menu.lst, suche die # xenhopt= und # xenkopt= Zeilen und bearbeite sie wie folgt (entferne nicht das # am Anfang!):

vi /boot/grub/menu.lst


[...]
## Xen hypervisor options to use with the default Xen boot option # xenhopt=dom0_mem=64M ## Xen Linux kernel options to use with the default Xen boot option # xenkopt=console=tty0 nosmp [...]
(Denke daran, was ich über RAM in Kapitel 1 gesagt habe. Falls Du genügend RAM hast, solltest Du hier wahrscheinlich 256M oder 512M verwenden, zumindest auf Produktionssystemen.)

Aktualisiere danach den GRUB Boot Loader:

update-grub

und starte beide physikalischen Systeme neu:

shutdown -r now

Wähle bei der Startaufforderung den neuen Xen Kernel aus und starte von ihm aus.

Nachdem die Systeme hochgefahren sind, führe Folgendes aus:

cd /boot
ln -s vmlinuz-`uname -r` vmlinuz-2.6-xenU
ln -s initrd.img-`uname -r` initrd-2.6-xenU

5 Installation von DRBD

node1/node2:

Als Nächstes installieren wir DRBD:

apt-get install drbd0.7-module-source drbd0.7-utils

Nun müssen wir das DRBD Kernel Modul erstellen und aktivieren:

m-a update

m-a a-i drbd0.7


echo drbd minor_count=64 >> /etc/modules
modprobe drbd minor_count=64

6 Installation von LVM Und ein paar anderen benötigten Paketen

node1/node2:

Nun installieren wir LVM und ein paar andere benötigte Pakete:

apt-get install lvm2 ssh bridge-utils iproute iputils-arping fping python2.4 python-twisted-core python-pyopenssl openssl mdadm

Diese Frage wird auftauchen:

MD arrays needed for the root filesystem: <-- all

7 Rekonfiguration des Netzwerks für Ganeti

Ganeti ist darauf angewiesen, dass Xen im Bridge Modus läuft, unter Verwendung einer Bridge namens xen-br0 auf dom0. Daher müssen wir das Netzwerk auf unseren pshysikalischen Systemen rekonfigurieren (dom0):

node1:

Bearbeite /etc/network/interfaces und ersetze die eth0 Zeile mit einer Zeile für xen-br0 sodass es so aussieht:

vi /etc/network/interfaces


# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo iface lo inet loopback # The primary network interface #allow-hotplug eth0 #iface eth0 inet dhcp auto xen-br0 iface xen-br0 inet static address 192.168.0.100 netmask 255.255.255.0 network 192.168.0.0 broadcast 192.168.0.255 gateway 192.168.0.1 bridge_ports eth0 bridge_stp off bridge_fd 0
Stoppe dann eth0 und starte xen-br0:

ifdown eth0
ifup xen-br0

Überprüfe danach, ob Deine neue Bridge funktioniert:

ip a show xen-br0


node1:~# ip a show xen-br0
4: xen-br0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc noqueue
link/ether 00:0c:29:d6:b1:55 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.100/24 brd 192.168.0.255 scope global xen-br0
inet6 fe80::20c:29ff:fed6:b155/64 scope link
valid_lft forever preferred_lft forever
node1:~#

brctl show xen-br0


node1:~# brctl show xen-br0
bridge name bridge id STP enabled interfaces
xen-br0 8000.000c29d6b155 no eth0
node1:~#

ifconfig


node1:~# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:D6:B1:55
inet6 addr: fe80::20c:29ff:fed6:b155/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:26917 errors:7 dropped:1408 overruns:0 frame:0
TX packets:1571 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:22665198 (21.6 MiB) TX bytes:178098 (173.9 KiB)
Interrupt:17 Base address:0x1400

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:560 (560.0 b) TX bytes:560 (560.0 b)

xen-br0 Link encap:Ethernet HWaddr 00:0C:29:D6:B1:55
inet addr:192.168.0.100 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fed6:b155/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:101 errors:0 dropped:0 overruns:0 frame:0
TX packets:96 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:6727 (6.5 KiB) TX bytes:10936 (10.6 KiB)

node1:~#

node2:

Führ nun das Gleiche auf node2.example.com aus:

vi /etc/network/interfaces


# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo iface lo inet loopback # The primary network interface #allow-hotplug eth0 #iface eth0 inet dhcp auto xen-br0 iface xen-br0 inet static address 192.168.0.101 netmask 255.255.255.0 network 192.168.0.0 broadcast 192.168.0.255 gateway 192.168.0.1 bridge_ports eth0 bridge_stp off bridge_fd 0

ifdown eth0
ifup xen-br0

ip a show xen-br0


node2:~# ip a show xen-br0
4: xen-br0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc noqueue
link/ether 00:0c:29:d0:19:53 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.101/24 brd 192.168.0.255 scope global xen-br0
inet6 fe80::20c:29ff:fed0:1953/64 scope link
valid_lft forever preferred_lft forever
node2:~#

brctl show xen-br0


node2:~# brctl show xen-br0
bridge name bridge id STP enabled interfaces
xen-br0 8000.000c29d01953 no eth0
node2:~#

ifconfig


node2:~# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:D0:19:53
inet6 addr: fe80::20c:29ff:fed0:1953/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:9469 errors:8 dropped:3521 overruns:0 frame:0
TX packets:1655 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:8597242 (8.1 MiB) TX bytes:183126 (178.8 KiB)
Interrupt:16 Base address:0x1400

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:560 (560.0 b) TX bytes:560 (560.0 b)

xen-br0 Link encap:Ethernet HWaddr 00:0C:29:D0:19:53
inet addr:192.168.0.101 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fed0:1953/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:18 errors:0 dropped:0 overruns:0 frame:0
TX packets:24 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1070 (1.0 KiB) TX bytes:2832 (2.7 KiB)

node2:~#

8 LVM Auf Dem Freien HDD Speicherplatz Einrichten

node1/node2:

Lass uns nun etwas über unsere Festplatte herausfinden:

fdisk -l

node1:~# fdisk -l


Disk /dev/sda: 53.6 GB, 53687091200 bytes
255 heads, 63 sectors/track, 6527 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 * 1 1216 9767488+ 83 Linux
/dev/sda2 1217 1338 979965 82 Linux swap / Solaris
node1:~#

Wir werden jetzt die Partition /dev/sda3 erstellen (auf beiden physikalischen Systemen) indem wir den Rest der Festplatte verwenden und für LVM vorbereiten:

fdisk /dev/sda

node1:~# fdisk /dev/sda


Die Zahl der Zylinder für diese Festplatte ist auf 6527 eingestellt.
Das ist völlig in Ordnung, jedoch ist dies größer als 1024 und könnte in bestimmten Setups folgende Probleme verursachen:
1) Probleme mit der Software, die beim Hochfahren des Rechners startet (z.B. alte Versionen von LILO)
2) Probleme mit dem Boot Loader und Partitionierungssoftware von anderen Betriebssystemen (z.B DOS FDISK, OS/2 FDISK)

Command (m for help): <-- m
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)

Command (m for help): <-- n
Command action
e extended
p primary partition (1-4)
<-- p
Partition number (1-4): <-- 3
First cylinder (1339-6527, default 1339): <-- ENTER
Using default value 1339
Last cylinder or +size or +sizeM or +sizeK (1339-6527, default 6527): <-- ENTER
Using default value 6527

Command (m for help): <-- t
Partition number (1-4): <-- 3
Hex code (type L to list codes): <-- L

0 Empty 1e Hidden W95 FAT1 80 Old Minix be Solaris boot
1 FAT12 24 NEC DOS 81 Minix / old Lin bf Solaris
2 XENIX root 39 Plan 9 82 Linux swap / So c1 DRDOS/sec (FAT-
3 XENIX usr 3c PartitionMagic 83 Linux c4 DRDOS/sec (FAT-
4 FAT16 <32M 40 Venix 80286 84 OS/2 hidden C: c6 DRDOS/sec (FAT-
5 Extended 41 PPC PReP Boot 85 Linux extended c7 Syrinx
6 FAT16 42 SFS 86 NTFS volume set da Non-FS data
7 HPFS/NTFS 4d QNX4.x 87 NTFS volume set db CP/M / CTOS / .
8 AIX 4e QNX4.x 2nd part 88 Linux plaintext de Dell Utility
9 AIX bootable 4f QNX4.x 3rd part 8e Linux LVM df BootIt
a OS/2 Boot Manag 50 OnTrack DM 93 Amoeba e1 DOS access
b W95 FAT32 51 OnTrack DM6 Aux 94 Amoeba BBT e3 DOS R/O
c W95 FAT32 (LBA) 52 CP/M 9f BSD/OS e4 SpeedStor
e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a0 IBM Thinkpad hi eb BeOS fs
f W95 Ext'd (LBA) 54 OnTrackDM6 a5 FreeBSD ee EFI GPT
10 OPUS 55 EZ-Drive a6 OpenBSD ef EFI (FAT-12/16/
11 Hidden FAT12 56 Golden Bow a7 NeXTSTEP f0 Linux/PA-RISC b
12 Compaq diagnost 5c Priam Edisk a8 Darwin UFS f1 SpeedStor
14 Hidden FAT16 <3 61 SpeedStor a9 NetBSD f4 SpeedStor
16 Hidden FAT16 63 GNU HURD or Sys ab Darwin boot f2 DOS secondary
17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fd Linux raid auto
18 AST SmartSleep 65 Novell Netware b8 BSDI swap fe LANstep
1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid ff BBT
1c Hidden W95 FAT3 75 PC/IX
Hex code (type L to list codes): <-- 8e
Changed system type of partition 3 to 8e (Linux LVM)

Command (m for help): <-- w
The partition table has been altered!

Calling ioctl() to re-read partition table.


WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.
node1:~#

Lass uns nun noch mal einen Blick auf unsere Festplatte werfen:

fdisk -l

node1:~# fdisk -l


Disk /dev/sda: 53.6 GB, 53687091200 bytes
255 heads, 63 sectors/track, 6527 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 * 1 1216 9767488+ 83 Linux
/dev/sda2 1217 1338 979965 82 Linux swap / Solaris
/dev/sda3 1339 6527 41680642+ 8e Linux LVM
node1:~#

Sieht gut aus. Nun müssen wir beide physikalischen Systeme neu starten, sodass der Kernel in der neuen Partitionstabelle lesen kann:

shutdown -r now

Nach dem Neustart bereiten wir /dev/sda3 für LVM auf beiden Systemen vor und fügen sie der Volume Group xenvg hinzu:

pvcreate /dev/sda3
vgcreate xenvg /dev/sda3

Es empfiehlt sich, LVM so zu konfigurieren, dass es die DRBD Geräte nicht scannt. Daher öffnen wir /etc/lvm/lvm.conf und ersetzen die filter Zeile wie folgt:

vi /etc/lvm/lvm.conf


[...]
filter = [ "r|/dev/cdrom|", "r|/dev/drbd[0-9]+|" ] [...]

9 Installation von Ganeti

node1/node2:

Installiere zunächst docbook-utils:

apt-get install docbook-utils

Lade dann Ganeti runter und installiere es wie folgt:

cd /tmp
wget http://ganeti.googlecode.com/files/ganeti-1.2b1.tar.gz
tar xvzf ganeti-1.2b1.tar.gz
cd ganeti-1.2b1
./configure --localstatedir=/var
make
make install
mkdir /srv/ganeti/ /srv/ganeti/os /srv/ganeti/export

Kopiere das Ganeti init Skript nach /etc/init.d...

cp docs/examples/ganeti.initd /etc/init.d/ganeti

... und teile beiden Systemen mit, dass sie Ganeti beim Hochfahren starten:

update-rc.d ganeti defaults 20 80


10 Installation Des Ganeti Skripts Für Debian Etch Instances

node1/node2:

Als Nächstes installieren wir die Skripte, die Ganeti benötigt, um Debian Etch in einer virtuellen Maschine (oder instance) zu installieren:

cd /srv/ganeti/os
wget http://ganeti.googlecode.com/files/instance-debian-etch-0.1.tar
tar xvf instance-debian-etch-0.1.tar
mv instance-debian-etch-0.1 debian-etch

Wir brauchen außerdem das debootstrap Paket:

apt-get install debootstrap


11 Initialisierung Des Clusters

Node 1:

Nun können wir unser Cluster initialisieren (dies muss nur einmal pro Cluster erfogen). Unser Clustername ist cluster1.example.com und ich möchte, dass node1.example.com der Master ist. Daher lassen wir folgenden Befehl auf node1.example.com laufen:

gnt-cluster init cluster1.example.com


12 node2.example.com Dem Cluster Hinzufügen

Node 1:

Da nun node1 unser Master ist, lassen wir alle Befehle zur Verwaltung des Clusters auf on node1 laufen. Um node2.example.com dem Cluster hinzuzufügen, führen wir Folgendes aus:

gnt-node add node2.example.com

Dies wird wie folgt aussehen:

node1:/srv/ganeti/os# gnt-node add node2.example.com
The authenticity of host 'node2.example.com (192.168.0.101)' can't be established.
RSA key fingerprint is 1c:83:24:cc:05:ab:9a:d6:51:ba:4d:31:42:1f:0a:6f.
Are you sure you want to continue connecting (yes/no)? <-- yes
root@node2.example.com's password:
node1:/srv/ganeti/os#

Lass uns nun überprüfen, ob unser Cluster wirklich aus node1 und node2 besteht:

gnt-node list

Etwas in der Art solltest Du erhalten:

node1:/srv/ganeti/os# gnt-node list
Node DTotal DFree MTotal MNode MFree Pinst Sinst
node1.example.com 40700 40700 203 64 124 0 0
node2.example.com 40700 40700 203 64 124 0 0
node1:/srv/ganeti/os#

13 Eine Instanz einrichten

node1:

Lass uns nun unsere erste virtuelle Maschine erstellen (in Ganeti Sprache Instanz genannt), inst1.example.com. Ich möchte dafür DRBD (entferntes RAID1) verwenden, node2 soll das primäre System sein und die Instanz soll 5 GB Festplattenspeicher, 256 MB Swap und 64 MB RAM haben. Nochmals lassen wir den Befehl auf dem Cluster Master, node1.example.com, laufen:

gnt-instance add -t remote_raid1 -n node2.example.com --secondary-node node1.example.com -o debian-etch -s 5g --swap-size 256 -m 64 inst1.example.com

Das kann etwas dauern. So sieht die Ausgabe dann aus:

node1:~# gnt-instance add -t remote_raid1 -n node2.example.com --secondary-node node1.example.com -o debian-etch -s 5g --swap-size 256 -m 64 inst1.example.com
* creating instance disks...
adding instance inst1.example.com to cluster config
Waiting for instance inst1.example.com to sync disks.
- device sda: 18.90% done, 2661 estimated seconds remaining
- device sda: 22.10% done, 1278 estimated seconds remaining
- device sda: 26.40% done, 1611 estimated seconds remaining
- device sda: 30.70% done, 1301 estimated seconds remaining
- device sda: 34.70% done, 1524 estimated seconds remaining
- device sda: 38.80% done, 894 estimated seconds remaining
- device sda: 43.30% done, 1753 estimated seconds remaining
- device sda: 48.40% done, 1195 estimated seconds remaining
- device sda: 52.70% done, 1213 estimated seconds remaining
- device sda: 57.70% done, 1011 estimated seconds remaining
- device sda: 61.10% done, 730 estimated seconds remaining
- device sda: 64.60% done, 698 estimated seconds remaining
- device sda: 69.40% done, 595 estimated seconds remaining
- device sda: 73.80% done, 430 estimated seconds remaining
- device sda: 78.30% done, 438 estimated seconds remaining
- device sda: 82.00% done, 169 estimated seconds remaining
- device sda: 85.80% done, 298 estimated seconds remaining
- device sda: 91.20% done, 146 estimated seconds remaining
- device sda: 95.50% done, 85 estimated seconds remaining
- device sda: 99.20% done, 18 estimated seconds remaining
Instance inst1.example.com's disks are in sync.
creating os for instance inst1.example.com on node node2.example.com
* running the instance OS create scripts...
* starting instance...
node1:~#

Ganeti hat eine komplette virtuelle Maschine erstellt (mittels Debian Etch), die Du jetzt nutzen kannst.

14 Die Instanz Konfigurieren

node1:

Um zur Kommandozeile von inst1.example.com zu gelangen, führen wir Folgendes auf node 1 aus

gnt-instance console inst1.example.com

inst1.example.com:

Nun kannst Du Dich auf inst1.example.com anmelden. Der Benutzername ist Root ohne Passwort. Daher werden wir nachdem wir uns angemeldet haben, gleich ein Passwort für Root anlegen:

passwd

Als Nächstes müssen wir eine Zeile für eth0 zu /etc/network/interfaces hinzufügen. Momentan hat inst1.example.com keine Netzwerkverbindung da nur lo (das loopback Interface) an ist.

Wie bereits in Kapitel 1 erwähnt, möchte ich, dass inst1.example.com die IP Adresse 192.168.0.105 hat:

vi /etc/network/interfaces


auto lo
iface lo inet loopback auto eth0 iface eth0 inet static address 192.168.0.105 netmask 255.255.255.0 network 192.168.0.0 broadcast 192.168.0.255 gateway 192.168.0.1
Starte danach das Netzwerk neu:

/etc/init.d/networking restart

Führe Folgendes aus

apt-get update

um die Paketdatenbank auf inst 1 zu aktualisieren und installiere dann OpenSSH und einen voll ausgestattenten vim:

apt-get install ssh openssh-server vim-full

Nun kannst Du Dich mit einem SSH Klienten wie PuTTY auf der IP Adresse 192.168.0.105 mit inst1.example.com verbinden.

Um inst1's Konsole zu verlassen und zu node1 zurückzukehren, tippe CTRL+] wenn Du die Konsole verwendest oder CTRL+5 wenn Du PuTTY verwendest (das ist das Gleiche als würdest Du Xen's xm Befehl verwenden an Stelle von Ganeti).

15 Weitere Ganeti Befehle

Um mehr zu erfahren, was Du alles mit Ganeti ausführen kannst, sieh Dir folgende Man Pages an:

man gnt-instance

man gnt-cluster

man gnt-node

man gnt-os

man gnt-backup

man 7 ganeti

man 7 ganeti-os-interface

sowie den Leitfaden für den Administrator, der im Ganeti Paket enthalten ist (in /docs/admin.html). Das Ganeti installation tutorial hat ebenfalls ein paar Hinweise.

Die interessantesten Befehle sind diese:

Eine Instanz starten:

gnt-instance startup inst1.example.com

Eine Instanz stoppen:

gnt-instance shutdown inst1.example.com

Zu der Konsole einer Instanz gehen:

gnt-instance console inst1.example.com

Eine Instanz auf den zweiten node umschalten (failover):

gnt-instance failover inst1.example.com

Eine Instanz löschen:

gnt-instance remove inst1.example.com

Eine Liste von Instanzen beziehen:

gnt-instance list


node1:~# gnt-instance list
Instance OS Primary_node Autostart Status Memory
inst1.example.com debian-etch node2.example.com yes running 64
node1:~#

Für mehr Informationen über Instanzen:

gnt-instance info


node1:~# gnt-instance info
Instance name: inst1.example.com
State: configured to be up, actual state is up
Nodes:
- primary: node2.example.com
- secondaries: node1.example.com
Operating system: debian-etch
Hardware:
- memory: 64MiB
- NICs: {MAC: aa:00:00:ac:67:3a, IP: None, bridge: xen-br0}
Block devices:
- sda, type: md_raid1, physical_id: a8984725:92a66329:e9453b29:5f438b80
primary: /dev/md0 (9:0) in sync, status ok
- type: drbd, logical_id: ('node2.example.com', 'node1.example.com', 11000)
primary: /dev/drbd0 (147:0) in sync, status ok
secondary: /dev/drbd0 (147:0) in sync, status ok
- type: lvm, logical_id: ('xenvg', '577164fd-b0cb-4043-9d57-aa59f41fddf1.sda_data')
primary: /dev/xenvg/577164fd-b0cb-4043-9d57-aa59f41fddf1.sda_data (253:0)
secondary: /dev/xenvg/577164fd-b0cb-4043-9d57-aa59f41fddf1.sda_data (253:0)
- type: lvm, logical_id: ('xenvg', '22071c7b-37e7-4aa1-be4a-74021599c1a7.sda_meta')
primary: /dev/xenvg/22071c7b-37e7-4aa1-be4a-74021599c1a7.sda_meta (253:1)
secondary: /dev/xenvg/22071c7b-37e7-4aa1-be4a-74021599c1a7.sda_meta (253:1)
- sdb, type: md_raid1, physical_id: 1e974569:29fa6cab:e9453b29:5f438b80
primary: /dev/md1 (9:1) in sync, status ok
- type: drbd, logical_id: ('node2.example.com', 'node1.example.com', 11001)
primary: /dev/drbd1 (147:1) in sync, status ok
secondary: /dev/drbd1 (147:1) in sync, status ok
- type: lvm, logical_id: ('xenvg', 'd89067b9-cae6-4b15-ba3b-76f17f70553e.sdb_data')
primary: /dev/xenvg/d89067b9-cae6-4b15-ba3b-76f17f70553e.sdb_data (253:2)
secondary: /dev/xenvg/d89067b9-cae6-4b15-ba3b-76f17f70553e.sdb_data (253:2)
- type: lvm, logical_id: ('xenvg', 'c17a8468-b3f5-4aa3-8644-0a2c890d68be.sdb_meta')
primary: /dev/xenvg/c17a8468-b3f5-4aa3-8644-0a2c890d68be.sdb_meta (253:3)
secondary: /dev/xenvg/c17a8468-b3f5-4aa3-8644-0a2c890d68be.sdb_meta (253:3)
node1:~#

Für mehr Informationen über ein Cluster:

gnt-cluster info


node1:~# gnt-cluster info
Cluster name: node1.example.com
Master node: node1.example.com
Architecture (this node): 32bit (i686)
node1:~#

Überprüfe, ob mit dem Cluster alles in Ordnung ist:

gnt-cluster verify


node1:~# gnt-cluster verify
* Verifying global settings
* Gathering data (2 nodes)
* Verifying node node1.example.com
* Verifying node node2.example.com
* Verifying instance inst1.example.com
* Verifying orphan volumes
* Verifying remaining instances
node1:~#

Finde heraus, wer der Master des Clusters ist:

gnt-cluster getmaster

Den Master umstellen, falls der Master ausfällt (stellt den Master auf den node um, auf dem der Befehl ausgeführt wird):

gnt-cluster masterfailover

Beziehe Informationen über die Instanz Volumes auf den Cluster Nodes:

gnt-node volumes


node1:~# gnt-node volumes
Node PhysDev VG Name Size Instance
node1.example.com /dev/sda3 xenvg 22071c7b-37e7-4aa1-be4a-74021599c1a7.sda_meta 128 inst1.example.com
node1.example.com /dev/sda3 xenvg 577164fd-b0cb-4043-9d57-aa59f41fddf1.sda_data 10240 inst1.example.com
node1.example.com /dev/sda3 xenvg c17a8468-b3f5-4aa3-8644-0a2c890d68be.sdb_meta 128 inst1.example.com
node1.example.com /dev/sda3 xenvg d89067b9-cae6-4b15-ba3b-76f17f70553e.sdb_data 4096 inst1.example.com
node2.example.com /dev/sda3 xenvg 22071c7b-37e7-4aa1-be4a-74021599c1a7.sda_meta 128 inst1.example.com
node2.example.com /dev/sda3 xenvg 577164fd-b0cb-4043-9d57-aa59f41fddf1.sda_data 10240 inst1.example.com
node2.example.com /dev/sda3 xenvg c17a8468-b3f5-4aa3-8644-0a2c890d68be.sdb_meta 128 inst1.example.com
node2.example.com /dev/sda3 xenvg d89067b9-cae6-4b15-ba3b-76f17f70553e.sdb_data 4096 inst1.example.com
node1:~#

Ein Node von einem Cluster entfernen:

gnt-node remove node2.example.com

Um etwas über das Betriebssystem in Erfahrung zu bringen, das vom Cluster unterstützt wird (momentan auf Debian Etch):

gnt-os list


16 A Failover Example

Lass uns annehmen, dass Du node2.example.com wegen Wartungsarbeiten runter fahren möchtest, aber inst1.example.com weiter laufen soll.

Lass uns zunächst etwas über unsere Instanzen in Erfahrung bringen:

node1:

gnt-instance list

Wie Du siehst, ist node2 das primäre System:

node1:~# gnt-instance list
Instance OS Primary_node Autostart Status Memory
inst1.example.com debian-etch node2.example.com yes running 64
node1:~#

Um inst1.example.com auf node1 umzuschalten (failover), lass wir folgenden Befehl laufen (wieder auf node1):

gnt-instance failover inst1.example.com

Danach lassen wir Folgendes erneut laufen

gnt-instance list

node1 sollte nun das primäre System sein:

node1:~# gnt-instance list
Instance OS Primary_node Autostart Status Memory
inst1.example.com debian-etch node1.example.com yes running 64
node1:~#

Nun kannst Du node2 runter fahren:

node2:

shutdown -h now

Nachdem node2 runter gefahren ist, kannst Du versuchen, Dich mit inst1.example.com zu verbinden - es sollte immer noch laufen.

Nachdem wir node2 gewartet und neu gestartet haben, möchten wir, dass node2 wieder der erste node wird.

Dafür versuchen wir wieder auf node1 umzuschalten (failover):

node1:

gnt-instance failover inst1.example.com

Dieses Mal erhalten wir dies:

node1:~# gnt-instance failover inst1.example.com
Failover will happen to image inst1.example.com. This requires a
shutdown of the instance. Continue?
y/[n]: <-- y
* checking disk consistency between source and target
Can't get any data from node node2.example.com
Failure: command execution error:
Disk sda is degraded on target node, aborting failover.
node1:~#

Das Umschalten funktioniert nicht, da die Festplatte von inst1.example.com auf node2 nicht mehr synchron läuft.

Um dies zu beheben, könnnen wir die Festplatte von inst1.example.com auf node2 ersetzen, indem wir die Festplatte vom derzeitigen primären node1 auf node2 spiegeln:

node1:

gnt-instance replace-disks -n node2.example.com inst1.example.com

Während dieses Vorgangs (der etwas dauern kann) kann inst1.example.com weiter laufen.

node1:~# gnt-instance replace-disks -n node2.example.com inst1.example.com
Waiting for instance inst1.example.com to sync disks.
- device sda: 0.47% done, 474386 estimated seconds remaining
- device sdb: 22.51% done, 593 estimated seconds remaining
- device sda: 0.68% done, 157798 estimated seconds remaining
- device sdb: 70.50% done, 242 estimated seconds remaining
- device sda: 0.87% done, 288736 estimated seconds remaining
- device sda: 0.98% done, 225709 estimated seconds remaining
- device sda: 1.10% done, 576135 estimated seconds remaining
- device sda: 1.22% done, 161835 estimated seconds remaining
- device sda: 1.32% done, 739075 estimated seconds remaining
- device sda: 1.53% done, 120064 estimated seconds remaining
- device sda: 1.71% done, 257668 estimated seconds remaining
- device sda: 1.84% done, 257310 estimated seconds remaining
- device sda: 3.43% done, 4831 estimated seconds remaining
- device sda: 6.56% done, 4774 estimated seconds remaining
- device sda: 8.74% done, 4700 estimated seconds remaining
- device sda: 11.20% done, 4595 estimated seconds remaining
- device sda: 13.49% done, 4554 estimated seconds remaining
- device sda: 15.57% done, 4087 estimated seconds remaining
- device sda: 17.49% done, 3758 estimated seconds remaining
- device sda: 19.82% done, 4166 estimated seconds remaining
- device sda: 22.11% done, 4075 estimated seconds remaining
- device sda: 23.94% done, 3651 estimated seconds remaining
- device sda: 26.69% done, 3945 estimated seconds remaining
- device sda: 29.06% done, 3745 estimated seconds remaining
- device sda: 31.07% done, 3567 estimated seconds remaining
- device sda: 33.41% done, 3498 estimated seconds remaining
- device sda: 35.77% done, 3364 estimated seconds remaining
- device sda: 38.05% done, 3274 estimated seconds remaining
- device sda: 41.17% done, 3109 estimated seconds remaining
- device sda: 44.11% done, 2974 estimated seconds remaining
- device sda: 46.21% done, 2655 estimated seconds remaining
- device sda: 48.40% done, 2696 estimated seconds remaining
- device sda: 50.84% done, 2635 estimated seconds remaining
- device sda: 53.33% done, 2449 estimated seconds remaining
- device sda: 55.75% done, 2362 estimated seconds remaining
- device sda: 58.73% done, 2172 estimated seconds remaining
- device sda: 60.91% done, 2015 estimated seconds remaining
- device sda: 63.16% done, 1914 estimated seconds remaining
- device sda: 65.41% done, 1760 estimated seconds remaining
- device sda: 68.15% done, 1681 estimated seconds remaining
- device sda: 70.61% done, 1562 estimated seconds remaining
- device sda: 73.55% done, 1370 estimated seconds remaining
- device sda: 76.01% done, 1269 estimated seconds remaining
- device sda: 78.14% done, 1108 estimated seconds remaining
- device sda: 80.59% done, 1011 estimated seconds remaining
- device sda: 82.86% done, 858 estimated seconds remaining
- device sda: 85.25% done, 674 estimated seconds remaining
- device sda: 87.74% done, 638 estimated seconds remaining
- device sda: 90.01% done, 518 estimated seconds remaining
- device sda: 92.40% done, 392 estimated seconds remaining
- device sda: 94.87% done, 265 estimated seconds remaining
- device sda: 97.10% done, 147 estimated seconds remaining
- device sda: 99.38% done, 30 estimated seconds remaining
Instance inst1.example.com's disks are in sync.
node1:~#

Danach können wir inst1.example.com auf node2 umschalten (failover):

gnt-instance failover inst1.example.com

node2 sollte nun wieder der erste node sein:

gnt-instance list

node1:~# gnt-instance list
Instance OS Primary_node Autostart Status Memory
inst1.example.com debian-etch node2.example.com yes running 64
node1:~#

17 Links