Задача:
* Развернуть файловый кластер на 300 Тб
* Обеспечить возможность расширения
* Обеспечить быстрый поиск файлов
* Обеспечить возможность записи и чтения для 10 клиентских подключений на скорости до 1Gbit/s
* Доступ как для linux так и для windows клиентов
* Средний размер файла - 50 MB
* Бюджет ~1.65 млн.р/53 000$
Решение - Файловая система Lustre
Введение.
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 - рассматривайте отказоустойчивое исполнение
На RAID-контроллере создаем два тома RAID5 по 12 дисков.
На тонкостях установки ОС Centos-6.2 останавливаться не буду. ОС устанавливается на software RAID1 SSD 40Гб.
На MGS/MDS сервере делается дополнительный software RAID1 SSD 120Гб md1.
На каждом из MGS/MDS/
OSS и ОSS серверов создаются два bond-интерфеса:
bond0 (2 физических интерфейса ) - FrontEnd
bond1 (4 физических интерфейса ) - BackEnd
BONDING_OPTS=“miimon=100 mode=6”
Отключается SELINUX
Устанавливается следующее по:
yum install mc openssh-clients openssh-server net-snmp man sysstat rsync htop trafshow nslookup ntp
Настраивается ntp
На всех серверах настраиваются идентичные учетные записи (uid:gid)
Изменяются параметры стека TCP в sysctl.conf
# 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
Установка Lustre
На серверах:
Загрузка дистрибутивов утилит:
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
Развертывание Lustre
На сервере 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]
Работа c Lustre
В связи с тем, что данный раздел подробно отражен в 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 отдельное, большое СПАСИБО.
Об авторе