====== Задача: ====== * Развернуть файловый кластер на 300 Тб * Обеспечить возможность расширения * Обеспечить быстрый поиск файлов * Обеспечить возможность записи и чтения для 10 клиентских подключений на скорости до 1Gbit/s * Доступ как для linux так и для windows клиентов * Средний размер файла - 50 MB * Бюджет ~1.65 млн.р/53 000$ ====== Решение - Файловая система Lustre ====== ==== Введение. ==== Lustre - распределенная файловая система с раздельным хранением данных и метаданных. Непосредственно для хранения данных и метаданных на узлах используется файловая система **ext3**. Описание установки over ZFS : [[http://myitnotes.info/doku.php?id=ru:jobs:lustrefszfs|тут]] (в данной работе мы не будем его касаться). **Lustre состоит из следующих компонентов:**\\ * **Management Server - MGS**\\ Хранит информацию обо всех файловых системах в кластере (в кластере может быть только один MGS).\\ Обменивается этой информацией со всем компонентами. * **Metadata Server - MDS**\\ Обеспечивает работу с метаданными, хранящимися на одном или нескольких Metadata Target далее MDT (в рамках одной файловой системы может быть только один MDS). * **Object Storage Server - ОSS**\\ Обеспечивает работу с данными, хранящимися на одном или нескольких Object Storage Target далее OST * **Lustre networking - LNET**\\ Сетевая сестема, обеспечивающая возможность обмена информацией в рамках кластера. Работает поверх Ethernet или %%InfiniBand%%\\ * **Lustre client**\\ Узлы с развернутым программным обеспечением Lustre client , обеспечивающим доступ к файловым системам кластера Ниже приведена схема-пример из официальной документации. {{:ru:jobs:lustrecomp.jpg?600|300}} ==== Выбор аппаратного обеспечения узлов*. ==== *** Все дальнейшие рассуждения и расчеты приведены для связок 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%%-сети. ====Итоговая схема и конфигурации оборудования.==== \\ {{:ru:jobs:lustre-cluster.jpg?600|300}} **Конфигурация сервера 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 Gigabit Adapter Quad Port (OEM) PCI-E 4x10/100/1000Mbps | 1 | | Твердотельный диск | 40 Gb SATA-II 300 Intel 320 Series | 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 Gigabit Adapter Quad Port (OEM) PCI-E 4x10/100/1000Mbps | 1 | | Твердотельный диск | 40 Gb SATA-II 300 Intel 320 Series | 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==== В связи с тем, что данный раздел подробно отражен в [[http://build.whamcloud.com/job/lustre-manual/lastSuccessfulBuild/artifact/lustre_manual.pdf|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 на свободные.\\ Решается это следующим алгоритмом:\\ * Деактивация переполненных OST (при указанном режиме данные доступны только для чтения) * Переброс данных на свободные OST * Обратная активация 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 [[http://build.whamcloud.com/job/lustre-manual/lastSuccessfulBuild/artifact/lustre_manual.pdf|Manual]] - исчерпывающий за что Whamcloud отдельное, большое СПАСИБО.\\ ==== Об авторе ==== [[https://www.linkedin.com/pub/alexey-vyrodov/59/976/16b|Profile]] автора