На прикладі нашого кластера опишу в деталях процес підготовки Lustre до роботи. Короткий огляд "люстри" в попередньому пості. Перш ніж читати далі, варто із ним ознайомитися, інакше вам будуть незрозумілі більшість термінів та причини чому щось робиться саме так а не по іншому. (Тим же, хто досвідчені у роботі з Lustre, навряд чи згодиться що той пост, що цей :)
По структурі текст ближчий до How-to, аж ніяк не є вичерпним описом всіх варіантів. Ну і, навіть в аналогічній конфігурації, ваші результати можуть відрізнятися :-)
За відгуки, виявлені помилки та пропозиції по тексту буду вдячним.
Базове середовище:
- Операційна система - Linux.
- Дистрибутив - Rocks 5.3, на базі CentOS, який, у свою чергу, є варіантом RedHat Enterprise 5, очищеним від не-вільного вмісту.
- Апаратна конфігурація: один вузол виділено для MGS та MDS, два - під OSS. (Для простоти тут описуватиметься інсталяція лише одного OSS).
- Мережевий інтерфейс до решти кластера - Gigabit Ethernet.
- Вузол із MDS містить три HDD невеликого (80Гб) розміру, OSS - по 6 великих HDD (1-2Tb).
- На MGS/MDS використовується RAID1, в конфігурації 2 активних, один запасний (spare).
- На OSS використовується RAID6, без запасних HDD.
- Завантаження OS можливе з будь-якого з дисків, щоб вихід з ладу якогось конкретного диску не зробив всю систему збереження даних (СЗД) недоступною. root-розділ теж розташовано на RAID.
Детальніше почитати про окремі компоненти Lustre можна тут: http://wiki.lustre.org/index.php/Subsystem_Map. Правда, на офіційному сайті з документацією бардак... Особливо стосовно версії 2.0, в певній мірі осиротілої.
1. Інсталяція пакетів.
Для x86 та x64_86, RPM, сумісні з CentOS/RHEL 5 та 6, можна скачати тут: http://downloads.whamcloud.com/public/. Якщо вони не підходять - доведеться компілювати самостійно, згідно інструкції: 29. Installing Lustre from Source Code. Вимоги до апаратної частини див. тут: 5. Setting Up a Lustre File System (Hardware Considerations і т.д.)
Знадобляться такі пакети (див. також тут, конкретні версії, звичайно, можуть відрізнятися) :
- kernel-2.6.18-164.11.1.el5_lustre.2.0.0.1.x86_64.rpm
- lustre-modules-2.0.0.1-2.6.18_164.11.1.el5_lustre.2.0.0.1.x86_64.rpm
- lustre-ldiskfs-3.2.0-2.6.18_164.11.1.el5_lustre.2.0.0.1.x86_64.rpm
- kernel-devel-2.6.18-164.11.1.el5_lustre.2.0.0.1.x86_64.rpm
- kernel-headers-2.6.18-164.11.1.el5_lustre.2.0.0.1.x86_64.rpm
- lustre-2.0.0.1-2.6.18_164.11.1.el5_lustre.2.0.0.1.x86_64.rpm
- lustre-client-2.0.0.1-2.6.18_164.11.1.el5_lustre.2.0.0.1.x86_64.rpm
- lustre-client-modules-2.0.0.1-2.6.18_164.11.1.el5_lustre.2.0.0.1.x86_64.rpm
- lustre-client-tests-2.0.0.1-2.6.18_164.11.1.el5_lustre.2.0.0.1.x86_64.rpm
- lustre-tests-2.0.0.1-2.6.18_164.11.1.el5_lustre.2.0.0.1.x86_64.rpm
- e2fsprogs-1.41.90.wc3-0redhat.x86_64.rpm
На вузлах вони потрібні не всі. Однак для простоти тут аналізувати необхідність пакетів не будемо. Зауважу тільки, що ядро клієнтів може бути цілком без латок Lustre (patchless). Сумісність із різними версіями ядер можна побачити тут (Lustre Test Matrix). При тому e2fsprogs бажані, крім серверів, хоча б на одному клієнті, щоб можна було тестувати "люстру" як ціле, не монтуючи її на серверах. (Останнє можливе, але в реальних системах може породжувати труднощі.)
Інсталюємо якось так:
rpm -ivh kernel-2.6.18-164.11.1.el5_lustre.2.0.0.1.x86_64.rpm \
lustre-modules-2.0.0.1-2.6.18_164.11.1.el5_lustre.2.0.0.1.x86_64.rpm \
lustre-ldiskfs-3.2.0-2.6.18_164.11.1.el5_lustre.2.0.0.1.x86_64.rpm
rpm -Uvh kernel-devel-2.6.18-164.11.1.el5_lustre.2.0.0.1.x86_64.rpm \
kernel-headers-2.6.18-164.11.1.el5_lustre.2.0.0.1.x86_64.rpm
rpm -Uvh lustre-2.0.0.1-2.6.18_164.11.1.el5_lustre.2.0.0.1.x86_64.rpm \
lustre-client-2.0.0.1-2.6.18_164.11.1.el5_lustre.2.0.0.1.x86_64.rpm \
lustre-client-modules-2.0.0.1-2.6.18_164.11.1.el5_lustre.2.0.0.1.x86_64.rpm \
lustre-client-tests-2.0.0.1-2.6.18_164.11.1.el5_lustre.2.0.0.1.x86_64.rpm \
lustre-tests-2.0.0.1-2.6.18_164.11.1.el5_lustre.2.0.0.1.x86_64.rpm
rpm -U e2fsprogs-1.41.90.wc3-0redhat.x86_64.rpm
Дві останніх команди роблять update, так як є конфлікт по файлах, з пакетами, що вже існують в CentOS. (Для дотошних - необхідними є не всі пакети :)
Попередження типу:
"WARNING: /lib/modules/2.6.18-164.11.1.el5_lustre.2.0.0.1/kernel/fs/lustre/fsfilt_ldiskfs.ko needs unknown symbol ldiskfs_free_blocks"
на першому етапі, чи
"/sbin/ldconfig: /share/apps/opt/lib64/libstdc++.so.6.0.14-gdb.py is not an ELF file - it has the wrong magic bytes at the start."
при інсталяції e2fsprogs, -- це нормально.
Зауваження: на координуючій машині Rocks 5.3 e2fsprogs заінсталювати не вдасться, через конфлікт залежностей. Насильно, напевне теж не варто. Точно не знаю -- не пробував.
Пакети, в процесі інсталяції, модифікують /boot/grub/grub.conf належним чином, але про всяк випадок варто перевірити. У ньому з'явиться запис типу:
title CentOS (2.6.18-164.11.1.el5_lustre.2.0.0.1)
root (hd0,0)
kernel /boot/vmlinuz-2.6.18-164.11.1.el5_lustre.2.0.0.1 ro root=LABEL=/
initrd /boot/initrd-2.6.18-164.11.1.el5_lustre.2.0.0.1.img
який вантажитиметься по замовчуванню. За бажанням можна його переіменувати :-)
Після успішної інсталяції та перевірки grub.conf слід перевантажити всі вузли (та бажано хоча б один з майбутніх клієнтів -- для випробовувань). Якщо вузли завантажилися успішно, можна переходити до наступного етапу.
2. Вибір параметрів файлових систем.
Додаткова інформація. При першому ознайомленні можна ігнорувати -- вибір по замовчуванню цілком нормальний, хоча і не оптимальний.
Вибір параметрів stride і stripe_width для OSS.
Описано, як вибрати дані параметри тут: "6.4.1 Computing file system parameters for mkfs" (Lustre 2.0 Operations Manual). Також варто проглянути документацію по цьому питанню для Lustre 1.8. Як на мене, там викладено дещо послідовніше (чітко розділено, скажімо, величини chunk_size i chunk_blocks): "10.1.1 Selecting Storage for the MDS or OSTs" (Lustre 1.8 Operations Manual). Пов'язаною темою є також конфігурація striping, смуг файлів, що йтимуть на різні OST в межах одного OSS: "18.2 Lustre File Striping Considerations", (Lustre 2.0 Operations Manual).
Ідея в тому, що коли звертання Lustre до RAID відбуваються "шматками", кратними до природних величин рейда, chunk size, швидкодія може сильно зрости. Також, для покращення продуктивності, деякі структури "Люстри", такі як allocation bitmap, варто розташовувати на різних дисках.
chunk_blocks -- кількість 4Кб блоків, що писатимуться на один фізичний диск у рейді, перш ніж переходити до іншого (RAID stripe size). Lustre оперує блоками даних, розміром 1Мб (1 MB Lustre RPCs), і зручно щоб один такий блок вписувався якраз в stripe ("смугу") RAID. (Щодо розміру блоку, 1Мб, або я чогось не розумію і мова про різні страйпи, або розділ 6.4.1 документації трішки суперечить 18.2.1: "select <chunkblocks>, such that <stripe_width_blocks> is close to 1 MB, but not larger." і "A good stripe size for sequential I/O using high-speed networks is between 1 MB and 4 MB". Хоча, неузгодженостей в новій документації трохи є.)
Отож, слід добитися виконання рівності:
<stripe_width_blocks> = <chunk_blocks> * <number_of_data_disks> = 1 MB/4096
де number_of_data_disks -- кількість реальних дисків з даними у рейді (повна кількість активних дисків мінус 1 для RAID5 і повна кількість активних мінус 2 для RAID6). У нас 6 дисків, у рейді рівня 6, тому number_of_data_disks=4.
Якщо підігнати так не вдається (кількість дисків з даними не є степінню двійки, на яку ділиться без остачі 1Мб), слід використовувати такий chunk_blocks, щоб <stripe_width_blocks> було трохи менше 1Мб (але не більше!).
У нас:
<number_of_data_disks>=4
<chunk_blocks> <= 1024KB/4 = 256KB = 64 блоки. (Нагадуємо, блок - 4Кб)
<stripe_width_blocks> = 1Мб = 256 блоків, бо кількість дисків є степенню двійки і брати менше значення немає потреби.
Отож, створюючи файлову систему для OSS, можемо використати наступні додаткові опції:
--mkfsoptions "<other options> -E stride=64,stripe_width=256"
Окремий журнал для RAID під OSS.
Чи дасть такий окремий журнал якийсь виграш, якщо він фізично розташований на тих же дисках, що і OSS -- не впевнений. Але документація каже, що він бажаний...
Розмір такого зовнішнього журналу має бути мінімум 400Мб ("6.4.2 Choosing Parameters for an External Journal"). Є неоднозначні дані, що його зростання до 1Гб трішки підвищує продуктивність. Крім того, в майбутньому може виникнути потреба в більшому журналі, тому зупинилися на розмірі 1Гб.
Створення зовнішнього журналу виглядатиме якось так:
- Створюємо RAID1 розділ розміром 1Гб .
- Створюємо "пристрій журналювання" (journal device)
[oss#] mke2fs -b 4096 -O journal_dev /dev/<jdevice> <journal_size>
<journal_size> -- в 4096-байтових (4Кб) блоках. Наприклад 262144 відповідає журналу 1Гб.
В нашому випадку: [oss#] mke2fs -b 4096 -O journal_dev /dev/md<jdevice> 262144 - Створюється OST:
[oss#] mkfs.lustre --ost --mgsnode=mds@osib --mkfsoptions="-J device=/dev/<jdevice> <other_options>" /dev/<ost_device>
Де other_options може включати, в тому числі, "-E stride=64, stripe_width=256"
3.0 Мережа
Lustre по своїй природі мережева система, і їй потрібно надати відповідний доступ. По замовчуванню для комунікації використовується порт 988, протокол TCP. Тому на серверах Lustre він має бути відкритим.
Щоб дозволити, якщо ваш фаєрвол - iptables, слід до /etc/sysconfig/iptables додати рядок типу:
-A INPUT -p tcp --dport 988 -j ACCEPT
і перевантажити iptables.
3.1 MGS
Блочний пристрій для MGS -- /dev/md3. Послідовність команд така:
mkdir /mnt/mgs mkfs.lustre --mgs /dev/md3 mount -t lustre /dev/md3 /mnt/mgs
Форматуючи, вказуємо що це буде MGS: --mgs. Монтується файлова система з типом lustre. Драйвер сам визначатиме, якому елементу Люстри дана файлова система належить.
Їх робота виглядатиме якось так:
та завершиться швидко, MDS крихітний.
Якщо монтування відбулося успішно, MGS готовий до роботи і можна перейти до наступного етапу.
3.2 MDS
Блочний пристрій для MDS -- /dev/md4. IP-адреса вузла MDS -- 192.168.1.123. Файлову систему вирішено назвати lustre0 (по замовчуванню -- lustre). Послідовність команд така:
mkdir /mnt/mdt mkfs.lustre --mdt --mgsnode=192.168.1.123@tcp0 --fsname=lustre0 /dev/md4 mount -t lustre /dev/md4 /mnt/mdt
Форматуючи, вказуємо що це MDS: --mdt, IP-адресу вузла MGS(192.168.1.123) та протокол доступу (tcp0), --fsname=lustre0 задає ім'я файлової системи, під яким вона потім буде доступна. Бажано вказувати саме IP-адресу, а не hostname, інакше можуть бути проблеми.
Результат роботи цих команд:
Форматування може бути відносно тривалим. Якщо монтування відбулося успішно, MDS готовий до роботи і можна перейти до наступного етапу.
3.3 OSS
3.3.1 OSS RAID Journal
Для нього на кожному вузлі OSS у нас виділено md3.
mke2fs -b 4096 -O journal_dev /dev/md3 263040
Зауваження -- md3 у нас має 1052160 1Кб блоків (так показуватиме mdadm --detail /dev/md3 чи /proc/mdstat), але для mke2fs слід вказувати розмір в 4Кб блоках: 1052160/4=263040. (А можна і взагалі не вказувати -- воно непогано автодетектується).
Форматування відбудеться відносно швидко, але не миттєво.
3.3.2 OSS
OST, цільовий пристрій OSS, знаходитиметься на md4. Послідовність команд така:
mkdir /mnt/ost
mkfs.lustre --ost --mgsnode=192.168.1.123@tcp0 --fsname=lustre0 --mkfsoptions="-J device=/dev/md3 -E stride=64,stripe_width=256" --param failover.mode=failout /dev/md4
mount -t lustre /dev/md4 /mnt/ost0
Вказуємо тип пристрою: --ost, IP-адресу та тип мережі для доступу до MDS: --mgsnode=192.168.1.123@tcp0, ім'я файлової системи, якій належатиме цей OST/OSS: --fsname=lustre0, --mkfsoptions задає додаткові опції форматування. Це створений на попередньому кроці пристрій журналювання -J device=/dev/md3 і параметри смуг, що визначалися в розділі 2: -E stride=64,stripe_width=256 (після коми не має бути пробіла, а якщо його поставити, повідомлення про помилку будуть незрозумілими). Ще одна важлива для невеликих lustre-систем опція це --param failover.mode=failout, яка може сильно полегшити життя при різноманітних проблемах з файловою системою. Детальніше про неї див. "13.5 Specifying Failout/Failover Mode for OSTs" (Lustre 2.0 Operations Manual).
Робота цих команд виглядатиме так:
Форматування триватиме доволі довго -- OST великі.
Якщо OST змонтувався/змонтувалися успішно, Lustre готова до роботи!
3.4 Автоматичне монтування сервісів Lustre
Щоб Lustre завантажувалася автоматично, слід до /etc/fstab додати рядки наведені нижче.
На MGS:
/dev/<mgs-block-device> /dev/mgs lustre defaults,_netdev 0 0
На MDS (який може співпадати з MGS):
/dev/<mdt-block-device> /dev/mdt lustre defaults,_netdev 0 0
і на кожному OSS:
/dev/<ost-block-device> /dev/ostX lustre defaults,_netdev 0 0
_netdev вказує що це мережева файлова система і її слід монтувати після запуску мережевих інтерфейсів.
4. Клієнти
На клієнтах щойно створена файлова система монтується так:
mount -t lustre 192.168.1.123@tcp0:/lustre0 /lustre_mount_poin
де вказується тип, lustre, адресу, мережевий інтерфейс MGS: 192.168.1.123@tcp0, назву конкретної файлової системи /lustre0 та точку монтування /lustre_mount_poin.
Також можна додати її в /etc/fstab:
192.168.1.123@tcp0:/lustre0 /lustre_mount_poin lustre defaults,_netdev 0 0
Тепер "люстрою" можна користуватися як і будь-якою іншою POSIX-сумісною файловою системою.
Немає коментарів:
Дописати коментар