=======Развертывание файловой системы GPFS======= ==== Введение. ==== //Данная статья описывает процесс создания отказоустойчивого файлового хранилища емкостью 90 Тб на базе файловой системы GPFS v 3.5. Файловая система развернута на трех Linux %%RedHat%% серверах c подключенными локальными дисками. В качестве клиентов файловой системы используются как Linux (Centos) так и Windows 2008R2 операционные системы. Для подключение windows клиентов используется Ethernet 1Gbit/s. В качестве %%BackEnd - Infiniband%% RDMA// **В один прекрасный день** развернутые online-сервисы [[http://www.kosmosnimki.ru|kosmosnimki.ru]] гео-пространственных данных исчерпали емкости хранилища EMC ISILON X200. Урезание бюджета потребовало найти более дешевое решение для хранения данных. (Ориентировочная стоимость хранения 1Тб данных на EMC ISILON X200 составила 120 т.р или 4k$. Достаточно "болезненно" была воспринята и стоимость продления поддержки 700 т.р/год, при стоимости решения в 4.6 млн.р за 45 ТБ хранения на SATA дисках)\\ **Особенностью хранения данных для сервиса kosmosnimki является наличие большого количества файлов (до 300000) в рамках одной директории размером ~80 MB каждый.**\\ Дополнительно появилась задача по развертыванию Active/Passive Postgresql cluster для сервиса [[http://osm.kosmosnimki.ru|osm]]. Для обеспечения высокой скорости поиска, общее хранилище должно быть на SSD. С учетом особенностей работы сервисов (обеспечения как минимального отклика так и скорости чтения/записи) было выбрано хранилище на базе GPFS. Файловая система GPFS является одним из вариантов распределенной файловой системы. К возможностям GPFS относятся: * раздельное хранения данных и мета-данных * репликация данных/мета-данных (хранение нескольких копий на разных узлах) * снапшоты * квоты * ACL (posix/NFSv4) * политики хранения данных (при наличии нескольких пулов данных) * использование как Linux так и Windows узлов одновременно * использование RDMA/Infiniband (Только для Linux узлов) ==== Архитектура GPFS. ==== **Файловая система GPFS использует следующие структуры данных:** * inodes * indirect blocks * data blocks Inodes и indirect block представляют метаданные. Data blocks - данные.\\ Inodes маленьких файлов и директорий так же содержат и данные. Для обеспечения возможности хранения (адресация) очень больших файлов используется дополнительный уровень - indirect block. Data block cостоит из 32 subblocks. При создании файловой системы необходимо выбирать размер блока равный 32*(размер блока физического носителя или RAID тома).\\ **Учитывайте , что на дисках размером более 2Тб размер блока 4k, на SSD дисках page size 8k**. **Файловая системы GPFS состоит из:** * storage pools - наборы дисков или RAID томов Диск или RAID том представляется как Network Shared Disk - NSD. NSD могут быть как локально установленными на NSD серверах так и внешними сетевыми хранилищами, подключенными к NSD серверам.\\ * policies - политики хранения данных (файлов) * filesets - возможность работы с набором данных в рамках файловой системы. (Например если вам необхоима реализация разных политик снапшотов для разных пулов. Или например привязка отдельной дирретктории к пулу.) Свойства репликации ФС задаются во время создания ФС и используют значение failure group для определения места записи данных/метаданных. Копии данных/метаданных находятся в разных failure group. Значение failure group задается при создании NSD За создание N-реплик данных отвечает клиент (в данном случае под клиентом подразумевается сторона которая записывает данные). Таким образом скорость записи данных будет не более (пропускная полоса)/(число реплик) ==== Требования и расчеты . ==== **Требуется организовать отказоустойчивое хранилище со следующими свойствами:** * Высокая скорость случайной записи/чтения * Емкость дискового пула 95 ТБ * Емкость SSD пула 1.4 ТБ * Скорость чтения записи для заданного пользователя 1.7 ГБ/c на SSD pool. * Стоимость 1Тб хранения не более 34 т.р или 1k$ **Известно:** * Средний размер файла на дисковом пуле - 50 МБ * Средний размер файла на SSD пуле - 1 МБ **Расчеты:** Обеспечение высокой скорости поиска возможно при хранении метаданных на SSD дисках.\\ Расчет необходимого дискового пространства для метаданных: * Vhdd - Объем пр-ва на дисках в байтах * Vssd - Объем пр-ва на SSD в байтах * Shdd - Cредний размер файла на дисковом пуле в байтах * Sssd - Cредний размер файла на SSD пуле в байтах * Sinode - Размер inode * Ksub - Субъективный эмпирический коэффициент учитывающий возможное кол-во директорий и очень маленьких файлов * Kext - Коэффициент масштабируемости без добавления новых дисков для хранения метаданных * Vmeta - Объем хранения для метеданных Vmeta = ( Vhdd * Ksub /Shdd + Vssd * Ksub /Sssd) * Sinode * Kext \\ Vmeta = ( 90x1012 * 8 / 50x106 + 1.4x1012 * 8 / 1x106 )* 4096 * 3 = ~320 Гб. Для обеспечение высокой скорости поиска , метаданные будут хранится на SSD (RAID 1).\\ Для обеспечения надежности выберем количество реплик для данных и метаданных - 2 . ==== Схема подключения и оборудование . ==== **Схема подключения** {{:ru:jobs:gpfs_small.jpg?800|500}} Каждый сервер gpfs-nodeX и linux-nodeX подключены к каждому из Ethernet/Linux коммутаторов. Для подключения к Ethernet коммутатору используются bonding. **Оборудование** Исходя из расчетов... Коммутаторы Infeniband (2шт) - Infiniband Mallanox IS5023\\ Коммутаторы Ethernet (2шт) - Cisco WS-C2960S-48TD-L + stack module\\ Сервера gpfs-nodeX (3шт): | Type | Model | Quantity | | Chassis| Supermicro SC846TQ-R900B| 1 | | MB| Supermicro X9SRL-F | 1 | | CPU | Intel® Xeon® Processor E5-2640 | 1| | MEM | KVR13LR9D4/16HM | 4 | | Controller |Adaptec RAID 72405 | 1 | | LAN | Intel Gigabit Adapter Quad Port (OEM) PCI-E x4 10 / 100 / 1000Mbps | 1 | | Infiniband | Mallanox MHQH29C-XTR | 1 | | IB cables | MC2206310-003 | 2 | | System HDD |600 Gb SAS 2.0 Seagate Cheetah 15K.7 < ST3600057SS> 3.5" 15000rpm 16Mb | 2 | | SSD | 240 Gb SATA 6Gb / s OCZ Vertex 3 2.5" MLC+3.5" adapter | 6 | | HDD | 4Tb SATA 6Gb / s Hitachi Ultrastar 7K4000 3.5" 7200rpm 64Mb | 16 | Количество PVU возможно посчитать [[https://www-112.ibm.com/software/howtobuy/passportadvantage/valueunitcalculator/vucalc.wss|здесь]]\\ **Стоимость оборудования включая 3 серверные и 5 клиентских лицензий IBM GPFS составила ~3.3 млн. руб или 100 k$ Таким образом стоимость стоимость 1 Тб хранения составила ~35 т.р или 1.11 k$. Так как инфраструктура (коммутаторы) позволит расширение, стоимость 1Тб хранения будет только падать** ==== Конфигурация и настройка ОС ==== **Коротко о нюансах начальной настройки ОС %%RedHat%% на узлах gpfs-nodeX и узлах linux-nodeX** 1. (для gpfs-nodeX) Для системного раздела использовались SAS диски. На контроллере были созданы два тома RAID1 и 20 single volume. **Для всех томов, предназначенных для GPFS. Необходимо отключить read/write cache. С включенным cache наблюдаласть потеря NSD, приводящая к разрушению пула и потере данных. Данная проблема возникала при перезарузке узла.** Все остальные диски подключены как single ОС устанавливалась в минимальном варианте. Использовался входящий в состав ОС %%RedHat%% и Centos стандартный набор Infiniband. Устанавливались дополнительные пакеты yum groupinstall "Infiniband Support" yum groupinstall "Development tools" yum install bc tcl tk tcsh mc ksh libaio ntp ntpdate openssh-clients wget tar net-tools rdma opensm man infiniband-diags chkconfig rdma on chkconfig opensm on 2. Все ethernet порты объединены в bond (mode 6)\\ 3. Между всеми узлами сделан без парольный доступ для пользователя root по ssh. На одном из узлов создаем ключ. ssh-keygen -t dsa (создаем ключ без пароля) cd /root/.ssh cat id_dsa.pub >> authorized_keys chown root.root authorized_keys chmod 600 authorized_keys echo "StrictHostKeyChecking no" > config Указанные файлы копируем на все узлы в директорию /root/.ssh/\\ Проверяем что все узлы доступны между собой по ssh. Перед первым запуском gpfs необходимо провести соединение по ssh между всеми узлами чтобы все узлы прописались в /root/.ssh/known_hosts\\ Возможно использовать следующий скрипт #!/bin/sh for j in gpfs-node2 #прописываем имена всех узлов do if [ `hostname` != "$j" ]; then echo "from `hostname` to $j" ssh $j hostname for i in gpfs-node2 #прописываем имена всех узлов do if [ `ssh $j hostname` != "$i" ]; then echo "from `ssh $j hostname` to $i" ssh $j "ssh $i hostname && exit" fi done fi done 4. В файле /etc/hosts прописываются все узлы.\\ 5. Проверяем наличие /usr/lib64/libibverbs.so если отсутствует ln -s /usr/lib64/libibverbs.so.1.0.0 /usr/lib64/libibverbs.so 6. Настраиаем ntpd сервисы для синхронизации времени на всех узлах\\ 7. IPTABLES\\ Разрешить все либо указать порты sshd и порты используемые в GPFS. (см. документацию на сайте IBM) 8. (Для linux-nodeX необязательно) Установлен tuned c активным профилем **latency-performance** yum install tuned tuned-adm profile latency-performance 9. Настройки sysctl.conf net.ipv4.tcp_timestamps=0 net.ipv4.tcp_sack=0 net.core.netdev_max_backlog=250000 net.core.rmem_max=16777216 net.core.wmem_max=16777216 net.core.rmem_default=16777216 net.core.wmem_default=16777216 net.core.optmem_max=16777216 net.ipv4.tcp_mem=16777216 16777216 16777216 net.ipv4.tcp_rmem=4096 87380 16777216 net.ipv4.tcp_wmem=4096 65536 16777216 10. Увеличите ограничение по кол-ву открытых файлов /etc/security/limits.conf (зависит от ваших требований) * hard nofile 1000000 * soft nofile 1000000 **Коротко о нюансах начальной настройки ОС %%Windows 2008 R2%% на узлах windows-nodeX** На нормализацию работы на windows узлах быдо потрачено 3 месяца. До выхода очередного patch общение с техподдержкой выливалось в отправку бесконечных логов и "подпирание костылями". Данной работой занимался мой коллега - Дмитрий Пугачев 1. Установка SUA\\ Utilities and SDK for Subsystem for UNIX-based Applications_AMD64.exe - служебные программы и подсистема приложений UNIX, доступна для загрузки с [[http://www.microsoft.com/en-us/download/details.aspx?id=2391|сайта]]. Описание [[http://technet.microsoft.com/ru-ru/library/cc772343.aspx|тут]] 2. Установка компонентов %%OpenSSH%%\\ * pkg-current-bootstrap60x64.exe и pkg-current-bundlecomplete60x64.exe , доступные на [[http://www.interopsystems.com|сайте]]\\ * в настройках sshd устанавливаем "StrictModes no" и перезапускаем ssh /etc/init.d/sshd stop /etc/init.d/sshd start 3. Windows6.1-KB2639164-x64.msu - [дополнительно] обновление для Windows Server 2008 R2 SP1, которое устраняет проблемы при установке GPFS\\ 4. Создание пользователя root\\ * В настройки профайла пользователя необходимо указать домашнюю папку C:\root.\\ * Добавить пользователя в группу Администраторы\\ * В указанную папку в директорию .ssh скопировать сгенерированные ключи. * В локальный политиках пользователю необходимо разрешить вход в качестве сервиса. 5. Firewall и UAC * UAC отключить * firewall либо отключить либо прописать порты GPFS (см. документацию на сайте) ==== Установка GPFS === **%%REDHAT/CENTOS%%** 1. Установка системы ./gpfs_install-3.5.0-0_x86_64 --text-only cd /usr/lpp/mmfs/3.5/ rpm -ivh *.rpm 2. Установка update-ов (перед установкой скачать в дирректорию) cd /usr/lpp/mmfs/3.5/update rpm -Uvh *.rpm 3. Компиляцию модуля ядра и установка cd /usr/lpp/mmfs/src && make Autoconfig && make World && make rpm rpm -ivh ~/rpmbuild/RPMS/x86_64/gpfs.gplbin* для Centos cd /usr/lpp/mmfs/src && make LINUX_DISTRIBUTION=REDHAT_AS_LINUX Autoconfig && make World && make rpm rpm -ivh ~/rpmbuild/RPMS/x86_64/gpfs.gplbin* 4. Прописываем пути echo 'export PATH=$PATH:/usr/lpp/mmfs/bin' > /etc/profile.d/gpfs.sh export PATH=$PATH:/usr/lpp/mmfs/bin **WINDOWS** 1. gpfs-3.5-Windows-license.msi - обязательный компонент лицензии\\ 2. gpfs-3.5.0.10-WindowsServer2008.msi - последнее обновление GPFS, на дату написания статьи. Обновления доступны на [[http://www-933.ibm.com/support/fixcentral/swg/selectFixes?parent=Cluster+software&product=ibm/power/IBM+General+Parallel+File+System&release=3.5.0&platform=Windows&function=all|странице]]\\ GPFS установлена ==== Настройка GPFS кластера==== Вся настройка выполняется с одного узла. В указанном случае для обеспечения отказоустойчивости GPFS кластера используется quorum. 1. Создание файла с описанием узлов. vi /root/gpfs_create gpfs-node1:quorum-manager gpfs-node2:quorum-manager gpfs-node3:quorum-manager linux-node1:client linux-node2:client windows-node1:client windows-node2:client 2. Создание кластера mmcrcluster -N /root/gpfs_create -p gpfs-node1 -s gpfs-node2 -r /usr/bin/ssh -R /usr/bin/scp -C gpfsstorage0 проверяем успех с помощью mmlscluster применяем лицензии mmchlicense server --accept -N gpfs-node1,gpfs-node2,gpfs-node3 mmchlicense client --accept -N linux-node1,linux-node2,windows-node1,windows-node2 проверяем лицензии mmlslicence -L 3. Создание NSD\\ В системе созданы 5 пулов. Системный, postgres и 3 пулов для дисковых данных для оптимального распределения i/o (Максимальное количество пулов в рамках одной файловой системы - 8). Данные и метаданные будут хранится отдельно. Для хранения метаданных используются SSD - диски (RAID 1). GPFS-ограничение (В рамках одной файловой системы метаданные могут хранится только на системном пуле).\\ Создание файла описания NSD. Формат: block dev:node name::type of data:failure group number:pools name: block dev - sd* type of data - metadataOnly,dataOnly,dataAndMetadata Для обеспечения отказоустойчивости на уровне узлов для каждого узла хранения используется свой номер failure group. При репликации, данные всегда реплицируюутся в рамках одного пула на NSD с разными failure group. cat /root/nsd_creation sdb:gpfs-node1::metadataOnly:3101:node1GPFSMETA:: sdc:gpfs-node1::dataOnly:3101:node1SSD240GNSD01:poolpostgres: sdd:gpfs-node1::dataOnly:3101:node1SSD240GNSD02:poolpostgres: sde:gpfs-node1::dataOnly:3101:node1SSD240GNSD03:poolpostgres: sdf:gpfs-node1::dataOnly:3101:node1SSD240GNSD04:poolpostgres: sdg:gpfs-node1::dataOnly:3101:node1HDD4TNSD01:: sdh:gpfs-node1::dataOnly:3101:node1HDD4TNSD02:: sdi:gpfs-node1::dataOnly:3101:node1HDD4TNSD03:: sdj:gpfs-node1::dataOnly:3101:node1HDD4TNSD04:: sdk:gpfs-node1::dataOnly:3101:node1HDD4TNSD05:pool1: sdl:gpfs-node1::dataOnly:3101:node1HDD4TNSD06:pool1: sdm:gpfs-node1::dataOnly:3101:node1HDD4TNSD07:pool1: sdn:gpfs-node1::dataOnly:3101:node1HDD4TNSD08:pool1: sdo:gpfs-node1::dataOnly:3101:node1HDD4TNSD09:pool2: sdp:gpfs-node1::dataOnly:3101:node1HDD4TNSD10:pool2: sdq:gpfs-node1::dataOnly:3101:node1HDD4TNSD11:pool2: sdr:gpfs-node1::dataOnly:3101:node1HDD4TNSD12:pool2: sds:gpfs-node1::dataOnly:3101:node1HDD4TNSD13:pool3: sdt:gpfs-node1::dataOnly:3101:node1HDD4TNSD14:pool3: sdv:gpfs-node1::dataOnly:3101:node1HDD4TNSD15:pool3: sdu:gpfs-node1::dataOnly:3101:node1HDD4TNSD16:pool3: sdb:gpfs-node2::metadataOnly:3201:node2GPFSMETA:: sdc:gpfs-node2::dataOnly:3201:node2SSD240GNSD01:poolpostgres: sdd:gpfs-node2::dataOnly:3201:node2SSD240GNSD02:poolpostgres: sde:gpfs-node2::dataOnly:3201:node2SSD240GNSD03:poolpostgres: sdf:gpfs-node2::dataOnly:3201:node2SSD240GNSD04:poolpostgres: sdg:gpfs-node2::dataOnly:3201:node2HDD4TNSD01:: sdh:gpfs-node2::dataOnly:3201:node2HDD4TNSD02:: sdi:gpfs-node2::dataOnly:3201:node2HDD4TNSD03:: sdj:gpfs-node2::dataOnly:3201:node2HDD4TNSD04:: sdk:gpfs-node2::dataOnly:3201:node2HDD4TNSD05:pool1: sdl:gpfs-node2::dataOnly:3201:node2HDD4TNSD06:pool1: sdm:gpfs-node2::dataOnly:3201:node2HDD4TNSD07:pool1: sdn:gpfs-node2::dataOnly:3201:node2HDD4TNSD08:pool1: sdo:gpfs-node2::dataOnly:3201:node2HDD4TNSD09:pool2: sdp:gpfs-node2::dataOnly:3201:node2HDD4TNSD10:pool2: sdq:gpfs-node2::dataOnly:3201:node2HDD4TNSD11:pool2: sdr:gpfs-node2::dataOnly:3201:node2HDD4TNSD12:pool2: sds:gpfs-node2::dataOnly:3201:node2HDD4TNSD13:pool3: sdt:gpfs-node2::dataOnly:3201:node2HDD4TNSD14:pool3: sdv:gpfs-node2::dataOnly:3201:node2HDD4TNSD15:pool3: sdu:gpfs-node2::dataOnly:3201:node2HDD4TNSD16:pool3: sdb:gpfs-node3::metadataOnly:3301:node3GPFSMETA:: sdc:gpfs-node3::dataOnly:3301:node3SSD240GNSD01:poolpostgres: sdd:gpfs-node3::dataOnly:3301:node3SSD240GNSD02:poolpostgres: sde:gpfs-node3::dataOnly:3301:node3SSD240GNSD03:poolpostgres: sdf:gpfs-node3::dataOnly:3301:node3SSD240GNSD04:poolpostgres: sdg:gpfs-node3::dataOnly:3301:node3HDD4TNSD01:: sdh:gpfs-node3::dataOnly:3301:node3HDD4TNSD02:: sdi:gpfs-node3::dataOnly:3301:node3HDD4TNSD03:: sdj:gpfs-node3::dataOnly:3301:node3HDD4TNSD04:: sdk:gpfs-node3::dataOnly:3301:node3HDD4TNSD05:pool1: sdl:gpfs-node3::dataOnly:3301:node3HDD4TNSD06:pool1: sdm:gpfs-node3::dataOnly:3301:node3HDD4TNSD07:pool1: sdn:gpfs-node3::dataOnly:3301:node3HDD4TNSD08:pool1: sdo:gpfs-node3::dataOnly:3301:node3HDD4TNSD09:pool2: sdp:gpfs-node3::dataOnly:3301:node3HDD4TNSD10:pool2: sdq:gpfs-node3::dataOnly:3301:node3HDD4TNSD11:pool2: sdr:gpfs-node3::dataOnly:3301:node3HDD4TNSD12:pool2: sds:gpfs-node3::dataOnly:3301:node3HDD4TNSD13:pool3: sdt:gpfs-node3::dataOnly:3301:node3HDD4TNSD14:pool3: sdv:gpfs-node3::dataOnly:3301:node3HDD4TNSD15:pool3: sdu:gpfs-node3::dataOnly:3301:node3HDD4TNSD16:pool3: 4. Настройки и запуск GPFS Для использования RDMA необходимо в рамках gpfs mmchconfig verbsRdma=enable\\ mmchconfig verbsPorts="mlx4_0/1 mlx4_0/2" -N gpfs-node1,gpfs-node2,gpfs-node3,linux-node1,linux-node2\\ Для оптимизации производительности mmchconfig maxMBpS=16000 (значение по умолчанию для версии GPFS 3.5 - 2048)\\ mmchconfig pagepool=32000M (размер cache)\\ Запуск GPFS. (На всех узлах) mmstartup -a Проверить mmgetstate -a Node number Node name GPFS state ------------------------------------------ 1 gpfs-node1 active 2 gpfs-node2 active 3 gpfs-node3 active 5 linux-node1 active 7 linux-node2 active 8 windows-node1 active 9 windows-node2 active Проверка работы RDMA в логах (Не для Windows nodes): cat /var/adm/ras/mmfs.log.latest Thu Jul 4 21:14:49.084 2013: mmfsd initializing. {Version: 3.5.0.9 Built: Mar 28 2013 20:10:14} ... Thu Jul 4 21:14:51.132 2013: VERBS RDMA starting. Thu Jul 4 21:14:51.133 2013: VERBS RDMA library libibverbs.so (version >= 1.1) loaded and initialized. Thu Jul 4 21:14:51.225 2013: VERBS RDMA device mlx4_0 port 1 opened. Thu Jul 4 21:14:51.226 2013: VERBS RDMA device mlx4_0 port 2 opened. Thu Jul 4 21:14:51.227 2013: VERBS RDMA started. ==== Создание файловой системы и установка политик размещения, cписков NFSv4 доступа и снапшотов==== 1. Создание файловой системы mmcrfs /gpfsbig /dev/gpfsbig -F /root/nsd_creation -A yes -B 256K -Q no -v yes -r 2 -R 2 -m 2 -M 2 2. Политики размещения файлов на пулах Для балансировки данных между пулами system и pool1-4 используется функция RAND. Как выяснилось, функция RAND имеет не линейное распределение, в отличии о отакойже функции C random().\\ Опытным путем були получены следующие результаты.\\ Тестирование проводилось при помощи записи 6000 файлов, просмотра распределения файлов по пулам и итерационного изменения политик размещения.\\ ** Функция RAND не работает с Windows узлами. При использовании ниже приведенной политики, все данные сохраняемые на windows узлах будут положены в default pool**\\ Ниже тестовая политика.\\ mmlspolicy gpfsbig -L RULE 'LIST_1' LIST 'allfiles' FROM POOL 'system' RULE 'LIST_2' LIST 'allfiles' FROM POOL 'pool1' RULE 'LIST_3' LIST 'allfiles' FROM POOL 'pool2' RULE 'LIST_4' LIST 'allfiles' FROM POOL 'pool3' RULE 'to_pool1' SET POOL 'pool2' LIMIT(99) WHERE INTEGER(RAND()*100)<24 RULE 'to_pool2' SET POOL 'pool3' LIMIT(99) WHERE INTEGER(RAND()*100)<34 RULE 'to_pool3' SET POOL 'pool4' LIMIT(99) WHERE INTEGER(RAND()*100)<50 RULE DEFAULT SET POOL 'system' Приведены два независимых результата распределения файлов по пулам\\ 1.\\ Rule# Hit_Cnt KB_Hit Chosen KB_Chosen KB_Ill Rule 0 1476 0 1476 0 0 RULE 'LIST_1' LIST 'allfiles' FROM POOL 'system' 1 1436 0 1436 0 0 RULE 'LIST_2' LIST 'allfiles' FROM POOL 'pool1' 2 1581 0 1581 0 0 RULE 'LIST_3' LIST 'allfiles' FROM POOL 'pool2' 3 1507 0 1507 0 0 RULE 'LIST_4' LIST 'allfiles' FROM POOL 'pool3' 2.\\ 0 1446 0 1446 0 0 RULE 'LIST_1' LIST 'allfiles' FROM POOL 'system' 1 1524 0 1524 0 0 RULE 'LIST_2' LIST 'allfiles' FROM POOL 'pool1' 2 1574 0 1574 0 0 RULE 'LIST_3' LIST 'allfiles' FROM POOL 'pool2' 3 1456 0 1456 0 0 RULE 'LIST_4' LIST 'allfiles' FROM POOL 'pool3' Итоговая политика\\ cat /root/policy RULE 'ssd' SET POOL 'poolpostges' WHERE USER_ID = 26 RULE 'to_pool1' SET POOL 'pool1' LIMIT(99) WHERE INTEGER(RAND()*100)<24 RULE 'to_pool2' SET POOL 'pool2' LIMIT(99) WHERE INTEGER(RAND()*100)<34 RULE 'to_pool3' SET POOL 'pool3' LIMIT(99) WHERE INTEGER(RAND()*100)<50 RULE DEFAULT SET POOL 'system' Тестирование политик mmchpolicy gpfsbig /root/policy -I test Установка политик mmchpolicy gpfsbig /root/policy -I yes Проверка установленных политик mmlspolicy gpfsbig -L 3. Списки доступа NFSv4 Лучший способ создания NFSv4 acl - использование windows сервера. Под Linux создается файл или директория с правами root:root и 777. Затем права меняются под windows. mmgetacl /gpfsbig/Departments/planning/ #NFSv4 ACL #owner:root #group:root #ACL flags: # DACL_PRESENT # DACL_AUTO_INHERITED special:owner@:rwxc:allow (X)READ/LIST (X)WRITE/CREATE (X)MKDIR (X)SYNCHRONIZE (X)READ_ACL (X)READ_ATTR (X)READ_NAMED (-)DELETE (X)DELETE_CHILD (X)CHOWN (X)EXEC/SEARCH (X)WRITE_ACL (X)WRITE_ATTR (X)WRITE_NAMED special:group@:r-x-:allow (X)READ/LIST (-)WRITE/CREATE (-)MKDIR (X)SYNCHRONIZE (X)READ_ACL (X)READ_ATTR (X)READ_NAMED (-)DELETE (-)DELETE_CHILD (-)CHOWN (X)EXEC/SEARCH (-)WRITE_ACL (-)WRITE_ATTR (-)WRITE_NAMED group:SCANEX\dg_itengineer:rwxc:allow:FileInherit:DirInherit (X)READ/LIST (X)WRITE/CREATE (X)MKDIR (X)SYNCHRONIZE (X)READ_ACL (X)READ_ATTR (X)READ_NAMED (X)DELETE (X)DELETE_CHILD (X)CHOWN (X)EXEC/SEARCH (X)WRITE_ACL (X)WRITE_ATTR (X)WRITE_NAMED 4. Снапшоты\\ Скрипт создает снапшот и удаляет снапшот созданный 30 днями ранее. Запускается на gpfs-node1 по cron раз в сутки cat /scripts/gpfs_snap_cr #!/bin/sh num=`/bin/date "+%Y%m%d"` nums=`/bin/date "+%s"` numms=`expr $nums - 2592000` numm=`/bin/date --date=@$numms "+%Y%m%d"` /usr/lpp/mmfs/bin/mmcrsnapshot gpfsbig gpfsbig$num /usr/lpp/mmfs/bin/mmdelsnapshot gpfsbig gpfsbig$numm ==== Монтирование ==== mmmount gpfsbig На Linux-нодах появится смонтированные раздел /gpfsbig\\ На Windows-нодах необходимо раздел смонтировать вручную mmmount gpfsbig Y ==== Тестирование ==== Для тестирования скорости записи i/o использовался скрипт #!/bin/sh k=1 if [ $k -le 2 ]; then count=30000 fi if [[ $k -le 6 ] && [ $k -gt 1 ]]; then count=10000 fi if [ $k -gt 5 ]; then count=3000 fi for ((i=1; i<=$k; i++ )) do dd if=/dev/zero of=/gpfsbig/tests/test$k$i.iso bs=1M count=$count &>/gpfsbig/tests/$k$i & done Для тестирования скорости чтения i/o #!/bin/sh k=1 if [ $k -le 2 ]; then count=30000 fi if [[ $k -le 6 ] && [ $k -gt 1 ]]; then count=10000 fi if [ $k -gt 5 ]; then count=3000 fi for ((i=1; i<=$k; i++ )) do dd if=/gpfsbig/tests/test$k$i.iso of=/dev/null bs=1M count=$count &>/gpfsbig/tests/rd$k$i & done Использовались следующие значения k 1,2,4,8,16,32,64 one file average write speed (k=1) - 190 MB/s\\ one file average write speed (k=2) - 176 MB/s\\ one file average write speed (k=4) - 130 MB/s\\ one file average write speed (k=8) - 55.3 MB/s\\ one file average write speed (k=16) - 20.5 MB/s\\ one file average write speed (k=32) - 15.7 MB/s\\ one file average write speed (k=64) - 8.2 MB/s\\ one file average read speed (k=1) - 290 MB/s\\ one file average read speed (k=2) - 227 MB/s\\ one file average read speed (k=4) - 186 MB/s\\ one file average read speed (k=8) - 76 MB/s\\ one file average read speed (k=16) - 32 MB/s\\ one file average read speed (k=32) - 20.7 MB/s\\ one file average read speed (k=64) - 11.9MB/s\\ Все то же для SSD. one file average write speed (k=1) - 1.7 GB/s\\ one file average write speed (k=2) - 930 MB/s\\ one file average write speed (k=4) - 449 MB/s\\ one file average write speed (k=8) - 235 MB/s\\ one file average write speed (k=16) - 112 MB/s\\ one file average write speed (k=32) - 50 MB/s\\ one file average write speed (k=64) - 21 MB/s\\ one file average read speed (k=1) - 3.6 GB/s\\ one file average read speed (k=2) - 1.8 GB/s\\ one file average read speed (k=4) - 889 MB/s\\ one file average read speed (k=8) - 446 MB/s\\ one file average read speed (k=16) - 222 MB/s\\ one file average read speed (k=32) - 110 MB/s\\ one file average read speed (k=64) - 55 MB/s\\ При записи и чтении на HDD , в случае одного пула при малых k были в 3 три раза выше. Но вероятность потери пула из-за выхода из строя диска , тоже выше.\\ ==== Заключение. ==== Файловая система GPFS оказалась очень производительной и полностью оправдала потраченное время.\\ Для оптимизации стоимости лицензий лучше взять процессор Intel® Xeon® Processor E5-2643. Если вы не собираетесь узлы хранения использовать как нагруженные сервера NFS,Samba то взять Intel® Xeon® Processor E5-2609.\\ Удачного развертывания.\\ ==== Об авторе ==== [[https://www.linkedin.com/pub/alexey-vyrodov/59/976/16b|Profile]] автора ==== Ссылки. ==== 1. [[http://publib.boulder.ibm.com/infocenter/clresctr/vxrx/index.jsp?topic=%2Fcom.ibm.cluster.gpfs.doc%2Fgpfsbooks.html|Official documentation General Parallel File System (GPFS)]]\\ 2. [[http://www.redbooks.ibm.com/abstracts/SG247844.html?Open|RedBook IBM Implementing the IBM General Parallel File System (GPFS) in a Cross Platform Environment]]\\ 3. [[http://publib.boulder.ibm.com|IBM Cluster Information Center Website]]\\ 4. [[https://agenda.infn.it/getFile.py/access?sessionId=13&resId=0&materialId=0&confId=5516|Tutorial for GPFS v.3.4 from V.Sapunenko]]