Зачем была написана данная статья.
Как-то я очень заинтересовался технологией AoE. Несмотря на очевидные преимущесва(простая внедряемость, высокая производительность, небольшая нагрузка на хост в виду отсутствия TCP сессий), есть и недостатки, которые меня сильно огорчили. Один из них - невозможность использования блочного устройства одновременно на нескольких хостах(при использовании стандартной файловой системы). Однако, никто не запрещает использование кластерной системы поверх AoE устройства. Для этого я выбрал OCFS2. Она есть в ядре линукса и очень легко настраивается.
Настройка связки AoE+OCFS2
Вся настройка будет проводится на Debian Lenny, хотя в принципе без разницы, можно использовать любой другой дистрибутив. Сначала нужно убедится, что OCFS2 есть в вашем ядре(необходимо проделать данные действия только на узлах, где непосредственно будет монтироваться OCFS2): для этого вводим
Код: Выделить всё
#modprobe -l | grep ocfs2
Если появится что-то вроде этого:
Код: Выделить всё
/lib/modules/2.6.26-2-686/kernel/fs/ocfs2/ocfs2_stackglue.ko
/lib/modules/2.6.26-2-686/kernel/fs/ocfs2/ocfs2_stack_user.ko
/lib/modules/2.6.26-2-686/kernel/fs/ocfs2/ocfs2_stack_o2cb.ko
/lib/modules/2.6.26-2-686/kernel/fs/ocfs2/cluster/ocfs2_nodemanager.ko
/lib/modules/2.6.26-2-686/kernel/fs/ocfs2/ocfs2.ko
/lib/modules/2.6.26-2-686/kernel/fs/ocfs2/dlm/ocfs2_dlm.ko
/lib/modules/2.6.26-2-686/kernel/fs/ocfs2/dlm/ocfs2_dlmfs.ko
то всё в порядке, можно двигаться дальше. Если ничего не появляется, то либо нужно пересобрать ядро с поддержкой OCFS2, либо скомпилировать отдельно модуль, взяв исходники с сайта производителя(http://oss.oracle.com/projects/ocfs2/files/).
Итак, начнем. Сначала, необходимо определится, какое блочное устройство будем расшаривать при помощи AoE и где оно находится. У меня, например, на сервере с Debian Lenny есть программный массив Raid(1+0) из четырёх сата дисков. Его и расашарю, чтобы остальные серверы могли использовать этот массив. Сперва убедимся, что AoE есть в ядре:
Код: Выделить всё
#modprobe -l | grep aoe
ответ будет таким:
Код: Выделить всё
/lib/modules/2.6.26-2-686/kernel/drivers/block/aoe/aoe.ko
Все в порядке. Дальше ставим демона vbladed:
Код: Выделить всё
#apt-get install vbladed
Теперь простой командой экспортируем наш массив(на практике, это может быть любое блочное устройство - жесткий диск, массив и даже файл) как устройство AoE:
Код: Выделить всё
#vbladed 1 1 eth0 /dev/md0
Где первая единица - это номер дисковой стойки, вторая - номер слота в дисковой стойке, eth0 - сетевой интерфейс, через который экспортируется блочное устройство, /dev/md0 - экспортируемое блочное устройство. Далее нам нужно сделать так, чтобы при перезагрузке сервера с расделяемым блочным устройством это устройство автоматически экспортировалось в сеть. Для этого добавим модуль aoe в список автоматически загружаемых модулей:
#nano /etc/modules
Код: Выделить всё
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
# Parameters can be specified after the module name.
loop
aoe
И напишем простой скриптик(назовем его vblade):
#nano /etc/init.d/vblade
Код: Выделить всё
#! /bin/sh
/usr/sbin/vbladed 1 1 eth0 /dev/md0
сделаем его исполяемым и добавим его в автозагрузку:
Код: Выделить всё
#chmod 755 /etc/init.d/vblade
#update-rc.d vblade defaults 99
На этом настройка AoE устройств закончена.
Настройка OCFS2.
Здесь я приведу настройку кластерной файловой системы OCFS2 на первом узле, на втором она будет аналогичной.
Сначала, добавим нужные модули в список автоматически загружаемых модулей(aoe и ocfs2):
#nano /etc/modules
Код: Выделить всё
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
# Parameters can be specified after the module name.
loop
aoe
ocfs2
Далее установим пакеты для работы с AoE и OCFS2:
Код: Выделить всё
#apt-get install aoetools ocfs2-tools
Вводим следующие команды:
Код: Выделить всё
#aoe-discover
#aoe-stat
Первая начинает исследование сети на предмет AoE устройств, вторая - отображает найденные. После введения второй команды мы должны увидеть сконфигурированное ранее AoE устройство:
Код: Выделить всё
e1.1 640.1GB eth0 up
Теперь оно видно как блочное устройсто, напрямую подключенное к компьютеру:
#fdisk -l
Код: Выделить всё
Диск /dev/sda1: 134 МБ, 134217728 байт
255 heads, 63 sectors/track, 16 cylinders
Units = цилиндры of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000
На диске /dev/sda1 отсутствует верная таблица разделов
Диск /dev/sda2: 21.4 ГБ, 21474836480 байт
255 heads, 63 sectors/track, 2610 cylinders
Units = цилиндры of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000
На диске /dev/sda2 отсутствует верная таблица разделов
Диск /dev/etherd/e1.1: 640.1 ГБ, 640140443648 байт
2 heads, 4 sectors/track, 156284288 cylinders
Units = цилиндры of 8 * 512 = 4096 bytes
Disk identifier: 0x00000000
Теперь приступим к настройке OCFS2 кластера. Для этого отредактируем файл /etc/ocfs2/cluster.conf:
Код: Выделить всё
cluster:
node_count = 2
name = array
node:
ip_port = 7777
ip_address = 10.0.0.250
number = 1
name = node1
cluster = test
node:
ip_port = 7777
ip_address = 10.0.0.254
number = 2
name = node2
cluster = array
Здесь подробнее: node_count = 2 - число узлов в кластере, name = array - имя кластера, number = 1 - уникальное число от 0 до 254, name = node1 - имя узла, должно совпадать с именем хоста, cluster = array - имя кластера. Примечание: порядок записей в конфигурационном файле строгий, если его не соблюдать, то при запуске кластера появится ошибка, что якобы конфигурационный файл не найден.
Создадим файловую систему OCFS2 поверх AoE устройства:
Код: Выделить всё
mkfs.ocfs2 /dev/etherd/e1.1
Процесс не шибко быстрый, так что нужно подождать. После создания файловой системы можно запускать кластер:
Код: Выделить всё
/etc/init.d/o2cb online array
Если все в порядке, то увидим следующее:
Код: Выделить всё
Mounting configfs filesystem at /sys/kernel/config: OK
Loading stack plugin "o2cb": OK
Loading filesystem "ocfs2_dlmfs": OK
Mounting ocfs2_dlmfs filesystem at /dlm: OK
Setting cluster stack "o2cb": OK
Starting O2CB cluster array: OK
На этом всё. Единственное что осталось - это создать директорию, в которую будет монтироваться наша файловая система, а также создать скрипт автоматического монтирования файловой системы при перезагрузке:
Код: Выделить всё
#mkdir /ocfs2
#nano /etc/init.d/script
Код: Выделить всё
#! /bin/sh
/sbin/aoe-discover
/etc/init.d/o2cb online array
/bin/mount /dev/etherd/e1.1 /ocfs2 -t ocfs2
Примечание: /sbin/aoe-discover - эта команда необходима для того, чтобы наше AoE устройство нашлось до того, как запустится кластер и смонтируется файловая система, иначе - кластер не запустится, файловая система не смонтируется.
Сделаем скрипт исполняемым, добавим в автозагрузку:
Код: Выделить всё
chmod 755 /etc/init.d/script
update-rc.d script defaults 99
На втором узле все аналогично, только создавать наново файловую систему не нужно, а сразу запустить кластер после создания конфигурационного файла.