Управление кластерами · 7 min read · Jan 30, 2026

Управление кластером Xen с помощью Ganeti на Debian Lenny

Управление кластером Xen с помощью Ganeti на Debian Lenny

Версия 1.0
Автор: Фалко Тимме

Ganeti — это система управления виртуализацией кластера на основе Xen. В этом руководстве я объясню, как создать одну виртуальную Xen машину (называемую экземпляром) на кластере из двух физических узлов и как управлять и переключать этот экземпляр между двумя физическими узлами.

Этот документ предоставляется без каких-либо гарантий! Я не даю никаких гарантий, что это будет работать для вас!

[Обновление 21/01/2010] Я получил сообщение от команды разработчиков Ganeti:
[…] В последние месяцы мы заметили печальный факт, что люди пытаются следовать вашим инструкциям дословно и в итоге устанавливают старые или очень старые версии Ganeti. Не могли бы вы обновить оба руководства с примечаниями, что они не обновлены для более новых версий Ganeti и попросить людей ознакомиться с актуальной документацией на http://docs.ganeti.org/ganeti/?

Это руководство основано на старой версии Ganeti. Пожалуйста, обратитесь к актуальной документации на http://docs.ganeti.org/ganeti/.

1 Предварительная заметка

В этом руководстве я буду использовать физические узлы node1.example.com и node2.example.com:

  • node1.example.com: IP-адрес 192.168.0.100; будет мастером кластера.
  • node2.example.com: IP-адрес 192.168.0.101; будет основным узлом виртуальной машины (также известной как экземпляр).

Оба имеют жесткий диск на 500 ГБ, из которых я использую 20 ГБ для раздела /, 1 ГБ для swap и оставляю остальное без разделов, чтобы его мог использовать Ganeti (минимум — 20 ГБ!). Конечно, вы можете изменить разметку по своему усмотрению, но не забывайте о минимальном неиспользуемом пространстве.

Кластер, который я собираюсь создать, будет называться cluster1.example.com, и у него будет IP-адрес 192.168.0.102. IP-адрес кластера 192.168.0.102 всегда будет привязан к кластерному мастеру, так что даже если вы не знаете, какой узел является мастером, вы можете использовать IP-адрес кластера (или имя хоста cluster1.example.com) для подключения к мастеру с помощью SSH.

Виртуальная машина Xen (называемая экземпляром в терминах Ganeti) будет называться inst1.example.com с IP-адресом 192.168.0.105. inst1.example.com будет зеркалироваться между двумя физическими узлами с использованием DRBD — вы можете рассматривать это как своего рода сетевой RAID1.

Как вы видите, node1.example.com будет кластерным мастером, т.е. машиной, с которой вы можете контролировать и управлять кластером, а node2.example.com будет основным узлом inst1.example.com, т.е. inst1.example.com будет работать на node2.example.com (со всеми изменениями на inst1.example.com, зеркалируемыми обратно на node1.example.com с помощью DRBD) до тех пор, пока вы не переключите его на node1.example.com (например, если вы хотите отключить node2.example.com для обслуживания). Это активная-пассивная конфигурация.

Я считаю хорошей практикой разделить роли между двумя узлами, чтобы не потерять кластерного мастера и основной узел одновременно, если один узел выйдет из строя.

Важно, чтобы все упомянутые здесь имена хостов были разрешимы для всех хостов, что означает, что они должны либо существовать в DNS, либо вы должны поместить все имена хостов во все файлы /etc/hosts на всех хостах (что я и сделаю здесь).

Все узлы кластера должны использовать один и тот же сетевой интерфейс (например, eth0). Если один узел использует eth0, а другой eth1, то Ganeti больше не будет работать корректно.

Хорошо, давайте начнем…

2 Подготовка физических узлов

node1:

Я хочу, чтобы node1 имел статический IP-адрес 192.168.0.100, поэтому мой файл /etc/network/interfaces выглядит следующим образом (обратите внимание, что я заменяю allow-hotplug eth0 на auto eth0; в противном случае перезапуск сети не работает, и нам придется перезагрузить всю систему):

vi /etc/network/interfaces

| # Интерфейс сети обратной связи auto lo iface lo inet loopback # Основной сетевой интерфейс #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 |

Если вы изменили файл, перезапустите свою сеть:

/etc/init.d/networking restart

Затем отредактируйте /etc/hosts. Сделайте его таким:

vi /etc/hosts

| 127.0.0.1 localhost.localdomain localhost 192.168.0.100 node1.example.com node1 192.168.0.101 node2.example.com node2 192.168.0.102 cluster1.example.com cluster1 192.168.0.105 inst1.example.com inst1 # Следующие строки желательны для хостов, поддерживающих IPv6 ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts |

Далее мы должны убедиться, что команды

hostname

и

hostname -f

выводят полное имя хоста (node1.example.com). Если вы получите что-то другое (например, просто node1), сделайте это:

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

После этого команды hostname должны показывать полное имя хоста.

Затем обновите систему:

aptitude update
aptitude safe-upgrade

node2:

Теперь мы делаем то же самое на node2.example.com (пожалуйста, имейте в виду, что у node2 другой IP!):

vi /etc/network/interfaces

| # Интерфейс сети обратной связи auto lo iface lo inet loopback # Основной сетевой интерфейс #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 192.168.0.101 node2.example.com node2 192.168.0.102 cluster1.example.com cluster1 192.168.0.105 inst1.example.com inst1 # Следующие строки желательны для хостов, поддерживающих IPv6 ::1 localhost 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
aptitude update
aptitude safe-upgrade

3 Настройка LVM на свободном пространстве HDD

node1/node2:

Давайте узнаем о нашем жестком диске:

fdisk -l
node1:~# fdisk -l  

Диск /dev/sda: 500.1 ГБ, 500107862016 байт  
255 голов, 63 сектора/диск, 60801 цилиндров  
Единицы = цилиндры по 16065 * 512 = 8225280 байт  
Идентификатор диска: 0x00023cd1  

   Устройство Загруз.  Начало       Конец      Блоки   Id  Система  
/dev/sda1   *           1          62      497983+  83  Linux  
/dev/sda2           63        6141    48829567+  8e  Linux LVM  
node1:~#

Теперь мы создадим раздел /dev/sda3 (на обоих физических узлах), используя остаток жесткого диска, и подготовим его для LVM:

fdisk /dev/sda

node1:~# fdisk /dev/sda

Количество цилиндров для этого диска установлено на 60801.
С этим нет ничего плохого, но это больше, чем 1024,
и может в некоторых настройках вызвать проблемы с:

  1. программным обеспечением, которое работает во время загрузки
    (например, старые версии LILO)
  2. загрузкой и программным обеспечением для разметки
    с других ОС
    (например, DOS FDISK, OS/2 FDISK)

Команда (m для помощи): <– n
Команда действия
e расширенный
p основной раздел (1-4)
<– p
Номер раздела (1-4): <– 3
Первый цилиндр (6142-60801, по умолчанию 6142): <– ENTER
Используя значение по умолчанию 6142
Последний цилиндр или +размер или +размерM или +размерK (6142-60801, по умолчанию 60801): <– ENTER
Используя значение по умолчанию 60801

Команда (m для помощи): <– t
Номер раздела (1-4): <– 3
Шестнадцатеричный код (тип L для списка кодов): <– L

0 Пусто 1e Скрытый W95 FAT1 80 Старый Minix be Загрузочный Solaris
1 FAT12 24 NEC DOS 81 Minix / старый 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 скрытый C: c6 DRDOS/sec (FAT-
5 Расширенный 41 PPC PReP Boot 85 Linux расширенный c7 Syrinx
6 FAT16 42 SFS 86 NTFS volume set da Не-FS данные
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 загрузочный 4f QNX4.x 3rd part 8e Linux LVM df BootIt
a OS/2 Boot Manag 50 OnTrack DM 93 Amoeba e1 DOS доступ
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 Скрытый FAT12 56 Golden Bow a7 NeXTSTEP f0 Linux/PA-RISC b
12 Диагностика Compaq 5c Priam Edisk a8 Darwin UFS f1 SpeedStor
14 Скрытый FAT16 <3 61 SpeedStor a9 NetBSD f4 SpeedStor
16 Скрытый FAT16 63 GNU HURD или Sys ab Darwin boot f2 DOS вторичный
17 Скрытый HPFS/NTF 64 Novell Netware b7 BSDI fs fd Linux raid auto
18 AST SmartSleep 65 Novell Netware b8 BSDI swap fe LANstep
1b Скрытый W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid ff BBT
1c Скрытый W95 FAT3 75 PC/IX
Шестнадцатеричный код (тип L для списка кодов): <– 8e
Изменен тип системы раздела 3 на 8e (Linux LVM)

Команда (m для помощи): <– w
Таблица разделов была изменена!

Вызов ioctl() для повторного чтения таблицы разделов.

ПРЕДУПРЕЖДЕНИЕ: Повторное чтение таблицы разделов завершилось неудачей с ошибкой 16: Устройство или ресурс заняты.
Ядро все еще использует старую таблицу.
Новая таблица будет использоваться при следующей перезагрузке.
Синхронизация дисков.
node1:~#


Теперь давайте снова взглянем на наш жесткий диск:

fdisk -l

node1:~# fdisk -l

Диск /dev/sda: 500.1 ГБ, 500107862016 байт
255 голов, 63 сектора/диск, 60801 цилиндров
Единицы = цилиндры по 16065 * 512 = 8225280 байт
Идентификатор диска: 0x00023cd1

Устройство Загруз. Начало Конец Блоки Id Система
/dev/sda1 * 1 62 497983+ 83 Linux
/dev/sda2 63 6141 48829567+ 8e Linux LVM
/dev/sda3 6142 60801 439056450 8e Linux LVM
node1:~#


Выглядит хорошо. Теперь мы должны перезагрузить оба физических узла, чтобы ядро могло прочитать новую таблицу разделов:

reboot


После перезагрузки мы устанавливаем LVM (возможно, он уже установлен, но лучше убедиться):

aptitude install lvm2


После перезагрузки мы подготавливаем /dev/sda3 для LVM на обоих узлах и добавляем его в группу томов xenvg:

pvcreate /dev/sda3
vgcreate xenvg /dev/sda3


(Ганети хочет использовать свою собственную группу томов, поэтому мы создаем xenvg; теоретически мы могли бы использовать существующую группу томов с достаточным количеством нераспределенного пространства, но команда gnt-cluster verify будет жаловаться на это.)
Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.