Записки сисадмина

Или помойное ведро идей


Выделенные сервера от $130
VDS/VPS от $20

Организация бюджетной SAN с помощью ATAoE

Передо мной недавно встал ребром вопрос организации Storage Area Network (SAN), с которым в дальнейшем будет работать кластер.

Насколько я понимаю, Storage Area Network – Это совокупность дисков (или дисковых массивов), которые посредством некой технологии подключены одновременно к нескольким нодам кластера, которые, в свою очередь посредством некой технологии одновременно с этими дисками работают. И все эти диски на каждой ноде видны как локальные диски. Ну что то вроде этого:

Storage Area Network

Наиболее популярная технология организации SAN – Fibre Channel. Присмотревшись поближе к этой штуковине и ее реализациям, а особенно к ценам, мне захотелось посмотреть на что нибудь еще :)

Тут я вспомнил, что при компиляции ядра Linux часто натыкался на опцию «ATA Over Ethenet Support«. Порывшись детальнее, обнаружил сайт разработчиков ATAoE – Coraid Co.

В отличии популярной технологии iSCSI и GEOM GATE (FreeBSD), ATAoE работает на уровне Ethernet (тогда как iSCSI & GEOM GATE работает на TCP/IP уровне). Это есть преимущество и недостаток ATAoE – ATAoE будет работать только в зоне локальной сети, но зато не будет сжирать процессорное время на обработку TCP/IP протокола.

Поскольку разворачивать SAN в глобальных масштабах мне не нужно, я остановился на ATAoE.

Технология ATAoE базируется на двух, я бы сказал, точках:

  1. ATAoE Target (vblade). Демон, который экспортирует локальные блочные устройства, или даже, файлы, прямиком в Ethernet. Этот демон ставится на каждый сервер, который будет выступать в роли Storage и предоставлять свои блочные устройства для всего кластера. Доступен как vblade package проекта AOE Tools.
  2. ATAoE инициатор. Модуль ядра «aoe» и сопутствующие утилиты – AOE Tools. Это хозяйство ставится на стороне каждой ноды кластера и импортирует блочные устройства из Ethernet как локальные блочные устройства.

Должен сказать, что приемлемая платформа для всего этого софта – Linux. У меня успешно работало в CentOS и Gentoo. Лично я не вижу причин, по которым AOE может не работать в каком то другом линуксе. Теоретически, vblade способен работать на FreeBSD. Но мне не удалось сделать удачный экспорт блочного устройства во фре. Да и не очень хотелось. Инициатор – Линукс, поскольку это есть модуль ядра :)

Хотя вот покопавшись, нашел виндовый драйвер-инициатор AOE. И еще немного покопавшись, нашел AOE драйвера под FreeBSD

Ну вообще саппорт рекомендовал использовать линуксовые дровишки

Установка ATAoE Target.

Скачиваем последнюю версию vblade-XX.tgz, распаковываем.

Установка довольно простая – make install.

Если вы юзаете Gentoo Linux, установите из портов командой «emerge vblade», при этом лучше предварительно сделать «emerge –sync». Плюсы такой установки – emerge установит дополнительные RC скрипты и параметры conf.d

Запускается vblade весьма просто

# vblade {SHELF} {SLOT} {NETIF} {FILE}

  • {SHELF} – логический «номер» сервера, на котором установлен vblade (1 и более), например, 1
  • {SLOT} – логический «номер» блочного устройства для экспорта (от 0 до 15 вроде), например, 0
  • {NETIF} – интерфейс для экспорта, например, eth0
  • {FILE} – обычный файл или блочное устройство, которое будет экспортироваться в Ethernet. Например, /dev/sdb. Можно так же экспортировать раздел диска (/dev/sdb1) или даже обычный файл (/home/usr/file.dat)

Например, экспорт трех локальных винчестеров:

# vblade 1 0 eth0 /dev/sdb
# vblade 1 1 eth0 /dev/sdc
# vblade 1 3 eth0 /dev/sdc

Из этого следует, что на каждое экспортируемое блочное устройство нужно запускать отдельный демон.

vblade на Gentoo Linux.

Установка и запуск довольно просты

# emerge vblade

Это поставит вам на сервер vblade, и дополнительно создаст конфигурационные файлы и RC скрипт.

/etc/conf.d/vblade: здесь нужно будет прописать для каждого экспортируемого блочного устройства строку:

config_vblade0=»1 0 eth0 /dev/sdb»
config_vblade1=»1 1 eth0 /dev/sdc»
config_vblade2=»1 2 eth0 /dev/sdd»

Так же будет доступен RC скрипт /etc/init.d/vblade.vblade0

В нашем примере экспортируется три блочных устройства, по этому нужно создать еще два RC-скрипта простой ссылкой:

# ln -s /etc/init.d/vblade.vblade0 /etc/init.d/vblade.1
# ln -s /etc/init.d/vblade.vblade0 /etc/init.d/vblade.2

После этого проверить работу:

# /etc/init.d/vblade.vblade0 start
# /etc/init.d/vblade.vblade1 start
# /etc/init.d/vblade.vblade2 start

Предположим, все нормально – прописываем стартап

# rc-update add vblade.vblade0 default
# rc-update add vblade.vblade1 default
# rc-update add vblade.vblade2 default

Для остальных линуксов, стартап и RC скрипты по ходу прийдется делать ручками или гуглить.

Все вышеописанные телодвижения проделать на всех Target серверах, которые будут расшаривать свои винчестеры.

Установка ATAoE инициатора.

Тексь. Винчестеры расшарили. Теперь их нужно собрать в кучу на некоторой ноде кластера, которая включена непосредственно в Ethernet вместе с Target-машинами.

Скачиваем последнюю версию aoetools-XX.tar.gz, распаковываем.

Смотрим Makefile на предмет тюннинга, например NPERSHELF (количество слотов на шелф, проще говоря, максимальное количество винтов на сервер-экспортер). Делаем make install. Это скомпилирует и установит модуль ядра aoe и сопутствующие утилиты.

Прежде чем выполнить «modprobe aoe», думаю стоит покурить сырцы на дополнительные настройки:

  • параметр «aoe_maxsectors» – в его описании написано только «Специально для GPFS» :) Уточнив у разработчика что он значит, пишу сюда – максимальное количество секторов за одну IO операцию, т.е. размер блока будущей файловой системы в байтах, деленный на 512. Я поставил здесь 4096.
  • параметр «aoe_deadsecs» – таймаут ответа от vblade-сервера, после которого выдается «IO Error». Мне по душе пришлось значение в 5 секунд вместо дефолтных три минуты. UPDATE: Саппорт мне настойчиво порекомендовал оставить здесь дефолтные 180 минут
  • параметр «aoe_iflist» – интерфейс(ы) на котором aoe будет сканировать девайсы. Чем разделяются интерфейсы хз – я использую всего один.
  • параметр «aoe_maxout» – загадочный, по словам саппорта, ключевой параметр. Сюда нужно поставить целое число, которое высчитывается по алгоритму: 500/NUM_AOE/SLOTS_PER_SHELF. NUM_AOE – суммарное количество AOE клиентов, SLOTS_PER_SHELF – сколько в среднем слотов на один шелф (а-ля сколько винтов в тазике). Саппорт сказал, что занижение этого числа будет приводить к тормозам, а завышение – у меня кернел матерился на eth0 txqueuelength.

Прописываем параметры в /etc/modprobe.conf:

alias aoe aoe aoe_maxsectors=4096 aoe_deadsecs=180 aoe_maxout=32 aoe_iflist=eth2

Затаив дыхание, набираем команду:

# modprobe aoe

Не выдыхая, смотрим dmesg. Если там есть чето вроде:

aoe: AoE v62 initialised.
aoe: e2.0: setting 1024 byte data frames
aoe: e3.1: setting 1024 byte data frames
aoe: e4.1: setting 1024 byte data frames
aoe: e4.0: setting 1024 byte data frames
aoe: e3.0: setting 1024 byte data frames
aoe: 00179a38b604 e2.0 v400c has 138448107 sectors
aoe: 001cf0f986b4 e3.1 v400c has 156301488 sectors
aoe: 001cf0f98700 e4.1 v400c has 156301488 sectors
aoe: 001cf0f98700 e4.0 v400c has 138448107 sectors
aoe: 001cf0f986b4 e3.0 v400c has 138448107 sectors
etherd/e2.0: unknown partition table
etherd/e3.1:
etherd/e4.1:
etherd/e4.0: unknown partition table
etherd/e3.0: unknown partition table

То с ликующими воплями идем за пивом. Иначе – бьемся головой об клаву и ищем ошибку. Дефолтная установка aoe расчитана на udev. Желательно обновить правила udev, которые лежат в исходниках aoetools в «linux/Documentation/aoe» и перегрузить драйвер. Без udev, устройства надо будет создавать вручную.

В моем примере появилось пять блочных устройств с трех различных серверов vblade:

/dev/etherd/e2.0
/dev/etherd/e3.1
/dev/ etherd/e4.1
/dev/ etherd/e4.0
/dev/ etherd/e3.0

Где каждое блочное устройств видно как /dev/etherd/e{SHELF}.{SLOT}[.p{PARTITION}]. {SHELF}, {SLOT} – соответствующие параметры запуска удаленного vblade. Суффикс .p{PARTITION} – номер логического диска, если есть таблица разделов.

Каждое из них, равно как и всех разом, можно использовать как угодно и где угодно. Можно инициализировать таблицу разделов, создать логические диски, сделать software raid, отформатировать, замонтировать и т.д.

На сообщения ioctl «unknown partition table» можно не обращать внимания, это значит таблица разделов не была инциализирована и не удается распознать логические диски на блочном устройстве.

Инициатор aoe можно так же установить на еще одном (двух, трех,…) сервере в локальной сети, и он увидит те же диски под теми же именами в том же порядке.

Однако совокупить эти все диски в нечто целое, и создать на этом нечто кластерную файловую систему, которую можно будет монтировать в режиме rw в нескольких местах – это уже вопрос кластерных файловых систем.

Можно покопать в сторону RedHat GFS, IBM GPFS. Или почитать мой небольшой дайджест кластерных файловых систем.

Описание установки GPFS на таком вот SAN будет чуть позже.

Производительность

Очевидно, что 1GBPs сеть и карты будут работать шустрее 100 Mbps.

Очевидно, что Ethernet свитч будет работать быстрее обычного хаба.

Очевидно, что настроенные Jumbo Frames на сетевухах будут давать бОльшую пропускную способность. Jumbo Frames – это специальная технология для MTU > 1500 (обычно MTU 9000). Ее должны поддерживать как сетевухи, так и свитч.

Очевидно, что короткие кабеля 6й категории тоже свое дело сделают в сравнении с длинными кабелями 5й категории.

Очевидно, что выделенный свитч (или VLAN) под АТАоЕ и выделенные сетевухи повысят потолок пропускной способности.

Личные впечатления

Сейчас немного напишу, потом добавлю конкретику. Добивался линейной скорости чтения до 250 Мбит/сек (dd) на не самых лучших эзернет кабелях. Линейная скорость записи на моей памяти была 12 Мбайт/сек.

Поставил на реальную площадку. Итак, очень хорошая сеть, очень хорошие свитчи (циски), кабели кат6, жамбо фреймы с МТУ 4200. Таргеты стоят на Plan 9.

Скорость записи:

[tmp]# dd if=/dev/urandom of=./r bs=1024 count=220000
[tmp]# dd if=./r of=/dev/etherd/e1.10
440000+0 records in
440000+0 records out
225280000 bytes (225 MB) copied, 6.75752 seconds, 33.3 MB/s

Скорость чтения:

[tmp]# dd if=/dev/etherd/e1.10 of=./q bs=4096 count=100000
100000+0 records in
100000+0 records out
409600000 bytes (410 MB) copied, 8.83615 seconds, 46.4 MB/s

[tmp]# hdparm -tT /dev/etherd/e1.10

/dev/etherd/e1.10:
Timing cached reads: 13816 MB in 2.00 seconds = 6914.77 MB/sec
Timing buffered disk reads: 130 MB in 3.02 seconds = 42.98 MB/sec

Так же замечу, что при распаковке весьма немалого tar с не одним миллионом файлов различной длины, суммарная скорость записи на 20 AOE девайсов под управлением IBM GPFS составила ~ 600 Мбит/сек (показания MRTG, которые подтвердились расчетами времени распаковки) = 75 МБайт/сек. И это еще с двойной репликацией данных и метаданных на блочном уровне GPFS.

Мини-креш тест. Включаю запись, выдираю из свитча сетевой кабель. АОЕ локает записывающий процесс, ждет положенные 5 секунд и выдает IO Error в dmesg. После подключения сети обратно, винты появились как ни в чем не бывало и с ними можно было работать (хотя fsck не помешал бы).

Диск дисковер работает отлично, АОЕ довольно быстро сам находит новые винты.

Естественно, ни о какой безопасности тут нет и речи. Не помню точно, есть ли ограничения по MAC, но АОЕ расчитан на локалку и работает в локалке. И довольно шустро.

Еще порадовало то, что в ATAoE можно осуществлять опрос S.M.A.R.T. удаленного винчестера. Однако пока что руками :) Ждем решения от smartmontools.

Ссылки

Coraid Co, официальный разработчик
Портирование под FreeBSD
АОЕ драйверы под винды
Аналог во FreeBSD – GEOM GATE
Собственно, iSCSI протокол
Все остальное :)

15.07.2008 Автор admin | Кластерные системы, Очумелые ручки | 10 comments

Комментарии (10) »

  1. Всего 12 мбайт/сек записи? Не опечатка?

    Комментарий от art | 17 июля 2008

  2. Это на память. И записывал по фтп, надо попробовать прямой дд

    Комментарий от admin | 17 июля 2008

  3. А мультипас сюда прикрутить реально?

    Комментарий от Woland | 18 июля 2008

  4. Хорошо бы протестировать на 1GBPs сети. Боюсь, что скорость записи не подымется выше 25-30 Мбайт/сек.

    Комментарий от beza | 18 июля 2008

  5. Насчет multipath,
    http://support.coraid.com/support/sr/ANSR001.pdf

    Вообще я думаю теоретически реально поднять vblad’ы с двумя разными шелфами (например, 0 и 1000, 1 и 1001 и т.д.) на двух интерфейсах таргет-сервера, подсоединить их к двум разным свитчам и туда же воткнуть два интерфейса инициатора.

    Тогда девайсы будут
    /dev/etherd/e0.0 /dev/etherd/e1000.0
    /dev/etherd/e0.1 /dev/etherd/e1001.1

    Теоретически можно устроить мультипас.

    Комментарий от admin | 18 июля 2008

  6. Итак, очень хорошая сеть, очень хорошие свитчи (циски), кабели кат6, жамбо фреймы с МТУ 4200:

    Запись:
    [tmp]# dd if=/dev/urandom of=./r bs=1024 count=220000
    [tmp]# dd if=./r of=/dev/etherd/e1.10
    440000+0 records in
    440000+0 records out
    225280000 bytes (225 MB) copied, 6.75752 seconds, 33.3 MB/s

    Чтение:
    [tmp]# dd if=/dev/etherd/e1.10 of=./q bs=4096 count=100000
    100000+0 records in
    100000+0 records out
    409600000 bytes (410 MB) copied, 8.83615 seconds, 46.4 MB/s

    Таргеты стоят на Plan 9.

    Комментарий от admin | 19 июля 2008

  7. >Установка ATAoE Target.

    >Скачиваем последнюю версию vblade-XX.tgz, распаковываем.

    >Установка довольно простая – make install.

    на 99% правильнее было бользовать аппаратные Target особенно при их копеечной стоимости.

    Комментарий от Vitaly | 28 июля 2008

  8. >Однако совокупить эти все диски в нечто целое, и создать на этом нечто кластерную файловую систему, которую можно будет монтировать в режиме rw в нескольких местах – это уже вопрос кластерных файловых систем.

    >Можно покопать в сторону RedHat GFS, IBM GPFS. Или почитать мой небольшой дайджест кластерных файловых систем.

    >Описание установки GPFS на таком вот SAN будет чуть позже.

    я считаю опрометчивым ставить кластерные файлухи в режиме rw на девайсы подключенные по ATAoE. могут быть грабли в самом неожиданном месте так как изначально эти две технологии были несовместимыми.

    Комментарий от Vitaly | 28 июля 2008

  9. Я итак использую аппаратные таргеты SR1521 – http://www.coraid.com/s.nl/sc.9/category.992/.f

    «так как изначально эти две технологии были несовместимыми» – хмм, а саппорт корейдов другого мнения. К тому же я сейчас использую GPFS на таких вот таргетах, монтированную в режиме rw с нескольких мест и ниче, крутится, нагрузка тяжелая.

    Комментарий от admin | 28 июля 2008

  10. Не слишком ли низкие показатели скорости?
    sata2+ext4+1gbit/sec+nfs дают 40-50 мбайт/секунду.
    тут получается блочное распаралеливание, то есть возможно реализовать «резиновый» размер хранилища. а можно ли каким то образом увеличить скорость чтения/записи? чтобы при чтении файла байт с одного нода, бай с другого, итд?
    Спасибо!

    Комментарий от Алексей | 16 ноября 2009

Оставить комментарий