* Развернуть файловый кластер на 300 Тб * Обеспечить возможность расширения * Обеспечить быстрый поиск файлов * Обеспечить возможность записи и чтения для 10 клиентских подключений на скорости до 1Gbit/s * Доступ как для linux так и для windows клиентов * Средний размер файла - 50 MB * Бюджет ~1.65 млн.р/53 000$
Lustre - распределенная файловая система с раздельным хранением данных и метаданных. Непосредственно для хранения данных и метаданных на узлах используется файловая система ext3. Описание установки over ZFS : тут (в данной работе мы не будем его касаться).
Lustre состоит из следующих компонентов:
Хранит информацию обо всех файловых системах в кластере (в кластере может быть только один MGS).
Обменивается этой информацией со всем компонентами.
Обеспечивает работу с метаданными, хранящимися на одном или нескольких Metadata Target далее MDT (в рамках одной файловой системы может быть только один MDS).
Обеспечивает работу с данными, хранящимися на одном или нескольких Object Storage Target далее OST
Сетевая сестема, обеспечивающая возможность обмена информацией в рамках кластера. Работает поверх Ethernet или InfiniBand
Узлы с развернутым программным обеспечением Lustre client , обеспечивающим доступ к файловым системам кластера
Ниже приведена схема-пример из официальной документации.
* Все дальнейшие рассуждения и расчеты приведены для связок
MGS/MDS/OSS - CentOS 6.2 x64 + Lustre Whamcloud 2.1.2
Lustre Client - CentOS 5.8 x64 + Lustre Whamcloud 1.8.8
Разные версии ПО связаны с найденными проблемами по утечке памяти на клиентах с CentOS 6.2 + Lustre Whamcloud 2.1.2 и не возможностью замены всей инфраструктуры на более раннюю версию.
С учетом ограниченности бюджета использовали следующую схему схему:
Один узел с функциями - MGS,MDS,OSS.
Четыре узла - OSS.
Требования к оперативной памяти:
Оперативная память для каждого из MGS,MDS,OSS,Lustre client - должна быть не менее 4Гб. Необходимо так же учитывать тот факт, что по умолчанию на узлах OSS включен кэш (возможно выключить).
Для Lustre client по умолчанию кэш занимает до 3/4 доступной оперативной памяти.
Требования к процессорной мощности:
Lustre - достаточно производительная система способная работать на достаточно медленных процессорах (4-х ядерного Xeon 3000 серии будет достаточно), но для уменьшения возможных задержек были выбраны 2xIntel Xeon E5620
Для узла MGS/MDS/OSS - 48Гб
Для узлов OSS - 24Гб
Для узлов клиентов - 24Гб (Данный параметр выбран с учетом функционала клиентов. По факту 8Гб более чем достаточно для сервера клиента. При 4Гб наблюдались серьезные задержки в связи с выгрузкой данных в swap)
Требования к объему MDT:
Объем хранилища 300TB/Средний размер файла 50MB * 2K (размер Inode) = 12.228 Гб.
Для обеспечения высокой скорости работы с метаданными решено использовать SSD
Сетевые требования:
Для обеспечения требуемых характеристик с учетом бюджета использовали Ethernet в качестве BackEnd-сети.
Конфигурация сервера MGS/MDS/OSS:
Тип комплектующих | Модель | Кол-во (шт) |
---|---|---|
Шасси | Supermicro SC846TQ-R900B | 1 |
Материнская плата | Supermicro X8DTN+-F | 1 |
Оперативная память | KVR1333D3E9SK3/12G | 2 |
Процессор | Intel® Xeon® Processor E5620 | 2 |
Контроллер RAID | Adaptec RAID 52445 | 1 |
Кабель | Cable SAS SFF8087 - 4*SATA MS36-4SATA-100 | 6 |
Жесткий диск | Seagate ST3000DM001 | 24 |
Карта 4-х портовая | Intel <E1G44HT> Gigabit Adapter Quad Port (OEM) PCI-E 4×10/100/1000Mbps | 1 |
Твердотельный диск | 40 Gb SATA-II 300 Intel 320 Series <SSDSA2CT040G3K5> | 2 |
Твердотельный диск | 120 Gb SATA 6Gb / s Intel 520 Series < SSDSC2CW120A310 / 01> 2.5“ MLC | 2 |
Конфигурация сервера OSS:
Тип комплектующих | Модель | Кол-во (шт) |
---|---|---|
Шасси | Supermicro SC846TQ-R900B | 1 |
Материнская плата | Supermicro X8DTN+-F | 1 |
Оперативная память | KVR1333D3E9SK3/12G | 2 |
Процессор | Intel® Xeon® Processor E5620 | 2 |
Контроллер RAID | Adaptec RAID 52445 | 1 |
Кабель | Cable SAS SFF8087 - 4*SATA MS36-4SATA-100 | 6 |
Жесткий диск | Seagate ST3000DM001 | 24 |
Карта 4-х портовая | Intel <E1G44HT> Gigabit Adapter Quad Port (OEM) PCI-E 4×10/100/1000Mbps | 1 |
Твердотельный диск | 40 Gb SATA-II 300 Intel 320 Series <SSDSA2CT040G3K5> | 2 |
Конфигурация сервера Lustre-lient:*
*данная конфигурация бала в наличии.
Тип комплектующих | Модель | Кол-во (шт) |
---|---|---|
Сервер | HP DL160R06 E5520 DL160 G6 E5620 2.40ГГц, 8ГБ (590161-421) | 1 |
Процессорный комплект | Intel Xeon E5620 (2,40 ГГц/4-ядерный/80 Вт/12 МБ) для HP DL160 G6 (589711-B21) | 1 |
Оперативная память | MEM 4GB (1x4Gb 2Rank) 2Rx4 PC3-10600R-9 Registered DIMM (500658-B21) | 4 |
Жесткие диски | HDD 450GB 15k 6G LFF SAS 3.5” HotPlug Dual Port Universal Hard Drive (516816-B21) | 2 |
Коммутатор:
Тип комплектующих | Модель | Кол-во (шт) |
---|---|---|
Коммутатор | Сisco WS-C2960S-24TS-L | 2 |
Стековый модуль | Cisco Catalyst 2960S FlexStack Stack Module optional for LAN Base [C2960S-STACK] | 2 |
В бюджет также вошла стойка HP, ИБП 5000VA, и KVM.
На вопрос: куда подключены SSD если корзин только 24? К материнской плате и лежат внутри сервера (благо места достаточно).
Производственные требования к нашему сервису позволяли его отключение на время до 10 мин. Если ваши требования жестче подключайте диски к HOTSWAP корзинам, увеличивая их кол-во или выбирая жесткие диски большего объема (4ТБ). Если же условия 24/7 - рассматривайте отказоустойчивое исполнение
# increase Linux TCP buffer limits\\ net.core.rmem_max = 8388608\\ net.core.wmem_max = 8388608\\ # increase default and maximum Linux TCP buffer sizes\\ net.ipv4.tcp_rmem = 4096 262144 8388608\\ net.ipv4.tcp_wmem = 4096 262144 8388608\\ # increase max backlog to avoid dropped packets\\ net.core.netdev_max_backlog=2500\\ net.ipv4.tcp_mem=8388608 8388608 8388608\\ sysctl net.ipv4.tcp_ecn=0
На серверах:
Загрузка дистрибутивов утилит:
http://downloads.whamcloud.com/public/e2fsprogs/1.42.3.wc1/el6/RPMS/x86_64/
и непосредственно lustre:
http://downloads.whamcloud.com/public/lustre/lustre-2.1.2/el6/server/RPMS/x86_64/\\
Установка утилит:
rpm -e e2fsprogs-1.41.12-11.el6.x86_64 rpm -e e2fsprogs-libs-1.41.12-11.el6.x86_64 rpm -Uvh e2fsprogs-libs-1.42.3.wc1-7.el6.x86_64.rpm rpm -Uvh e2fsprogs-1.42.3.wc1-7.el6.x86_64.rpm rpm -Uvh libss-1.42.3.wc1-7.el6.x86_64.rpm rpm -Uvh libcom_err-1.42.3.wc1-7.el6.x86_64.rpm
Установка Lustre:
rpm -ivh kernel-firmware-2.6.32-220.el6_lustre.g4554b65.x86_64.rpm\\ rpm -ivh kernel-2.6.32-220.el6_lustre.g4554b65.x86_64.rpm\\ rpm -ivh lustre-ldiskfs-3.3.0-2.6.32_220.el6_lustre.g4554b65.x86_64.x86_64.rpm\\ rpm -ivh perf-2.6.32-220.el6_lustre.g4554b65.x86_64.rpm\\ rpm -ivh lustre-modules-2.1.1-2.6.32_220.el6_lustre.g4554b65.x86_64.x86_64.rpm\\ rpm -ivh lustre-2.1.1-2.6.32_220.el6_lustre.g4554b65.x86_64.x86_64.rpm\\
Необходимо удостовериться что именно lustre kernel выбрано по умолчанию при загрузке в /boot/grub/grub.conf
Настройка сети LNET:
echo "options lnet networks=tcp0(bond1)" > /etc/modprobe.d/lustre.conf\\
Перезагрузка узлов
reboot
На клиентах:
Обновление ядра:
yum update kernel-2.6.18-308.4.1.el5.x86_64 reboot
Загрузка дистрибутивов утилит:
http://downloads.whamcloud.com/public/e2fsprogs/1.41.90.wc4/el5/x86_64/
и непосредственно lustre:
http://downloads.whamcloud.com/public/lustre/lustre-1.8.8-wc1/el5/client/RPMS/x86_64/
Установка утилит:
rpm -Uvh --nodeps e2fsprogs-1.41.90.wc4-0redhat.x86_64.rpm rpm -ivh uuidd-1.41.90.wc4-0redhat.x86_64.rpm
Установка Lustre:
rpm -ivh lustre-client-modules-1.8.8-wc1_2.6.18_308.4.1.el5_gbc88c4c.x86_64.rpm rpm -ivh lustre-client-1.8.8-wc1_2.6.18_308.4.1.el5_gbc88c4c.x86_64.rpm
Настраиваем сеть LNET:
echo "options lnet networks=tcp0(eth1)" > /etc/modprobe.d/lustre.conf
Перезагрузка узлов
reboot
На сервере MGS/MDS/OSS:
mkfs.lustre --fsname=FS --mgs --mdt --index=0 /dev/md1// (Где /dev/md1 - устройство software RAID1) mkdir /mdt mount -t lustre /dev/md1 /mdt echo "/dev/md1 /mdt lustre defaults,_netdev 0 0" >> /etc/fstab//
mkfs.lustre --fsname=FS --mgsnode=10.255.255.1@tcp0 --ost --index=0 /dev/sda// (Где /dev/sda - том RAID5) mkfs.lustre --fsname=FS --mgsnode=10.255.255.1@tcp0 --ost --index=1 /dev/sdb// (Где /dev/sdb - том RAID5)
mkdir /ost0 mkdir /ost1
mount -t lustre /dev/sda /ost0 mount -t lustre /dev/sdb /ost1
echo "/dev/sda /ost0 lustre defaults,_netdev 0 0" >> /etc/fstab echo "/dev/sdb /ost1 lustre defaults,_netdev 0 0" >> /etc/fstab
mkdir /FS mount -t lustre /FS echo "10.255.255.1@tcp0:/temp /FS lustre defaults,_netdev 0 0" >> /etc/fstab
На серверах OSS:
mkfs.lustre --fsname=FS --mgsnode=10.255.255.1@tcp0 --ost --index=N /dev/sda// (Где N-номер узла, /dev/sda - том RAID5) mkfs.lustre --fsname=FS --mgsnode=10.255.255.1@tcp0 --ost --index=N+1 /dev/sdb// (Где N-номер узла, /dev/sdb - том RAID5)
mkdir /ostN mkdir /ostN+1
mount -t lustre /dev/sda /ostN mount -t lustre /dev/sdb /ostN+1
echo "/dev/sda /ostN lustre defaults,_netdev 0 0" >> /etc/fstab echo "/dev/sdb /ostN+1 lustre defaults,_netdev 0 0" >> /etc/fstab
mkdir /FS mount -t lustre /FS echo "10.255.255.1@tcp0:/temp /FS lustre defaults,_netdev 0 0" >> /etc/fstab
Так же для каждого OST возможно без перерыва в работе и в любое время освободить 5% свободного места
tune2fs -m 0 /dev/sda//
На клиентах:
mkdir /FS mount -t lustre /FS echo "10.255.255.1@tcp0:/temp /FS lustre defaults,_netdev 0 0" >> /etc/fstab
Теперь на любом из узлов возможен просмотр текущего состояние файловой системы:
lfs df -h FS-MDT0000_UUID 83.8G 2.2G 76.1G 3% /FS[MDT:0] FS-OST0000_UUID 30.0T 28.6T 1.4T 95% /FS[OST:0] FS-OST0001_UUID 30.0T 28.7T 1.3T 96% /FS[OST:1] FS-OST0002_UUID 30.0T 28.6T 1.3T 96% /FS[OST:2] FS-OST0003_UUID 30.0T 28.7T 1.3T 96% /FS[OST:3] FS-OST0004_UUID 30.0T 28.3T 1.7T 94% /FS[OST:4] FS-OST0005_UUID 30.0T 28.2T 1.8T 94% /FS[OST:5] FS-OST0006_UUID 30.0T 28.3T 1.7T 94% /FS[OST:6] FS-OST0007_UUID 30.0T 28.2T 1.7T 94% /FS[OST:7] FS-OST0008_UUID 30.0T 28.3T 1.7T 94% /FS[OST:8] FS-OST0009_UUID 30.0T 28.2T 1.8T 94% /FS[OST:9]
В связи с тем, что данный раздел подробно отражен в Manual остановимся только на двух задачах:
1. Добавление нового узла и как следствие дисбаланс сохраненных данных на OST Пример:
FS-MDT0000_UUID 83.8G 2.2G 76.1G 3% /FS[MDT:0] FS-OST0000_UUID 30.0T 28.6T 1.4T 95% /FS[OST:0] FS-OST0001_UUID 30.0T 28.7T 1.3T 96% /FS[OST:1] FS-OST0002_UUID 30.0T 28.6T 1.3T 96% /FS[OST:2] FS-OST0003_UUID 30.0T 28.7T 1.3T 96% /FS[OST:3] FS-OST0004_UUID 30.0T 28.3T 1.7T 94% /FS[OST:4] FS-OST0005_UUID 30.0T 28.2T 1.8T 94% /FS[OST:5] FS-OST0006_UUID 30.0T 28.3T 1.7T 94% /FS[OST:6] FS-OST0007_UUID 30.0T 28.2T 1.7T 94% /FS[OST:7] FS-OST0008_UUID 30.0T 28.3T 1.7T 94% /FS[OST:8] FS-OST0009_UUID 30.0T 28.2T 1.8T 94% /FS[OST:9] FS-OST000a_UUID 30.0T 2.1T 27.9T 7% /FS[OST:10] FS-OST000b_UUID 30.0T 2.2T 27.8T 7% /FS[OST:11]
При добавлении дополнительного узла как правило могут возникают две ситуации:
1.1 Невозможность записи файла в связи с отсутствием свободного места на одном из OST (при этом на файловой системе места может быть предостаточно)
1.2 Увеличение нагрузки ввода/вывода на новый добавленный узел.
В такой ситуации необходимо, если есть возможность перебрасывать данные с занятых OST на свободные.
Решается это следующим алгоритмом:
Пример:
lctl --device N deactivate lfs find --ost {OST_UUID} -size +1G | lfs_migrate -y lctl --device N activate
2.Резервное копирование
Для решения задачи резервного копирования вам необходимо остановить запись данных (как вариант путем деактивации).
Естественно возможно решить задачу с помощью LVM2 snapshot, но как показывает практика производительность сильно падает.
Далее воспользоваться backup на уровне устройств или файлов как описано в инструкции.
В настоящий момент я рекомендую использовать версию Lustre 1.88wc4 в связке с Centos 5.8, как наиболее стабильное решение. (2.3 еще не пробовал)
В целом уровень документации на сайте Whamcloud Manual - исчерпывающий за что Whamcloud отдельное, большое СПАСИБО.
Profile автора