GPFS

Коммерческая реализация кластерной системы хранения данных от IBM. Сама по себе состоит из пачки bash скриптов и нескольких исполняемых файлов, поднимается достаточно просто.

Подготовка к деплою

Перво-наперво нужно иметь авторизованный аккаунт у IBM, с хотя бы раз купленной поддержкой. После выполнения этих условий появляется доступ к заветной SpectrumScale, однако и тут не всё так просто и однозначно, как хотелось бы. IBM предоставляет два типа версий - install и update, причём вторая без первой не ставится, хоть и весит примерно столько же, так что качать следует последний install в выбранной ветке + последний update. (Ах да, нас интересует Spectrum Scale Protocols Advanced)

Итак, после долгих переходов по ссылкам и неудобному поиску получаем два вжделенных файла, например

Spectrum_Scale_install-4.1.1.0_x86_64_advanced_protocols
Spectrum_Scale_Protocols_Advanced-4.1.1.14-x86_64-Linux-update

Файлы эти представляют собой не более, чем tar gzip архив, с 400+ строчками bash кода в начале. Посему добиваем файлу исполняемый бит и, либо просто запускаем, либо указываем аргумент –dir и путь куда требуется распаковать.

На выходе получаем набор директорий, которые по сути являются отдельными репозиториями. Нас интересует только gpfs_rpms. Утаскиваем его куда-нибудь к себе на сервер с репозиториями, после чего на всех машинах прописываем новый репозиторий. Уменя получилось два файла

/etc/yum.repos.d/gpfs-4.1.1.0.repo:

[gpfs-4.1.1.0]
name=IBM GPFS 4.1.1.0
baseurl=http://repo.owlhost.in/centos/7/stable/spectrumscale/4.1.1.0/gpfs_rpms
enabled=1
gpgcheck=0

и

/etc/yum.repos.d/gpfs-4.1.1.14.repo:

[gpfs-4.1.1.14]
name=IBM GPFS 4.1.1.14
baseurl=http://repo.owlhost.in/centos/7/stable/spectrumscale/4.1.1.14/gpfs_rpms
enabled=1
gpgcheck=0

После подготовки репозиториев следует, как водится, yum clean all, после чего установить вполне определённые версии пакетов:

# yum install gpfs.msg.en_US-4.1.1-0 gpfs.gskit-8.0.50-40 gpfs.docs-4.1.1-0 gpfs.crypto-4.1.1-0 gpfs.ext-4.1.1-0 gpfs.base-4.1.1-0 gpfs.gpl-4.1.1-0

После установки базовой пачки пакетов поверх них ставим уже обновления

# yum install gpfs.msg.en_US gpfs.gskit gpfs.docs gpfs.crypto gpfs.ext gpfs.base gpfs.gpl

Следующим шагом на требуется собрать модули gpfs для ядра, делается это в несколько шагов.

  1. Доносим необходимые пакеты
    • # yum install kernel-headers kernel-devel imake gcc-c++ rpm-build
  2. Переходим в /usr/lpp/mmfs/src/ и приступаем к сборке
    • cd /usr/lpp/mmfs/src/
    • export LINUX_DISTRIBUTION=REDHAT_AS_LINUX
    • make Autoconfig
    • make World
    • make rpm
  3. На выходе получаем /root/rpmbuild/RPMS/x86_64/gpfs.gplbin*rpm, в котором обсрались нужные модули
  4. Закидываем rpm в репозиторий 4.1.1.14 и выполняем там же createrepo, чтобы он добавил к списку ещё один файл

Собственно дальше yum clean all и устанавливаем новый пакет gpfs.gplbin*.

Следующий шаг по настройке кластера будет заключаться в раскладывании пользователю root ssh-ключей по всем нодам, которые будут состоять в кластере. Можно конечно попробвать и другого пользователя создать, дать ему права в sudoers и сделать прочие ништяки, но как показал практика - игра не стоит свечь.

И вишенкой на нашем торте будет прописывание всех хостов в /etc/hosts, чтобы кластер не зависел от внешних DNS'ов и в случае “он уронил DNS” не потерял связность.

Ах да, чуть не забыл, ещё было бы неплохо подать на все ноды lun'ы с san-хранилища, хотя можно хранить данные и на локальных дисках, этого никто не запрещает делать.

Создание кластера

После того как доступы везде предоставлены, root может беспрепятственно ходить с ноды на ноду, часы отсинхронизированы, а хосты все прописаны настало время приступать к самому интересному, а именно - созданию кластера.

Всё начинается с команды:

# /usr/lpp/mmfs/bin/mmcrcluster -N owlnas-mgt1:manager-quorum -C owlnas -r /usr/bin/ssh -R /usr/bin/scp

Если возникают проблемы авторизации - возможно запрещено авторизовываться root'ом. Нужно проверить, что авторизация возможна. Если нет, то можно подкрутить следующий параметр в конфиге sshd_config:

PermitRootLogin without-password

В случае успеха можно посмотреть как чувствует себя кластер:

# /usr/lpp/mmfs/bin/mmlscluster

на что сервер должен ответить примерно такое:

GPFS cluster information
========================
  GPFS cluster name:         owlnas
  GPFS cluster id:           6990092231022051608
  GPFS UID domain:           owlnas
  Remote shell command:      /usr/bin/ssh
  Remote file copy command:  /usr/bin/scp
  Repository type:           CCR

 Node  Daemon node name    IP address       Admin node name     Designation
----------------------------------------------------------------------------
   1   owlnas-mgt1         10.1.0.1         owlnas-mgt1         quorum-manager

Теперь нужно задать серверу тип его лицензии 1)

# /usr/lpp/mmfs/bin/mmchlicense server --accept -N owlnas-mgt1

После этого пропадёт навязчивая информацию о том, что есть серверы, которым не задана лицензия. Запускаем нашу первую ноду в кластере:

# /usr/lpp/mmfs/bin/mmstartup -N owlnas-mgt1

После чего проверяем статус следующей командой

# /usr/lpp/mmfs/bin/mmgetstate -a -L

Которая поделится с нами информацией о текущем статусе нод в кластере, что-то вроде этого:

 Node number  Node name       Quorum  Nodes up  Total nodes  GPFS state  Remarks    
------------------------------------------------------------------------------------
       1      owlnas-mgt1        2        3         14       active      quorum node

Добавление нод в кластер

Собственно в уже существующий кластер нужно довабить ноды 2). Делается это достаточно простыми манипуляциями:

# /usr/lpp/mmfs/bin/mmaddnode -N owlnas-osd1,owlnas-osd2,owlnas-osd3
# /usr/lpp/mmfs/bin/mmchlicense client --accept -N owlnas-osd1,owlnas-osd2,owlnas-osd3
# /usr/lpp/mmfs/bin/mmstartup -N owlnas-osd1,owlnas-osd2,owlnas-osd3

После чего mmlscluster и mmgetstate должны показать наши три новые ноды:

GPFS cluster information
========================
  GPFS cluster name:         owlnas
  GPFS cluster id:           6990092231022051608
  GPFS UID domain:           owlnas
  Remote shell command:      /usr/bin/ssh
  Remote file copy command:  /usr/bin/scp
  Repository type:           CCR

 Node  Daemon node name    IP address       Admin node name     Designation
----------------------------------------------------------------------------
   1   owlnas-mgt1         10.1.0.1         owlnas-mgt1         quorum-manager
   2   owlnas-osd1         10.1.0.11        owlnas-osd1
   3   owlnas-osd2         10.1.0.12        owlnas-osd2
   4   owlnas-osd3         10.1.0.13        owlnas-osd3
 Node number  Node name        GPFS state 
------------------------------------------
       1      owlnas-mgt1      active
       2      owlnas-osd1      active
       3      owlnas-osd2      active
       4      owlnas-osd3      active

Похоже всё готово для добавления дисков.

Добавление дисков в кластер

Осуществляется достаточно странным образ, с помощью manifest файла. Каждый диск должен быть описан следующим блоком в текстовом файле 3)

%nsd:
device=<[vsh]d[a-z]|dm-[0-9]>
nsd=<volume-name>
usage=dataAndMetadata

После заполнения файла нужными разделами скармливаем его следующей программе

# /usr/lpp/mmfs/bin/mmcrnsd -F diskdef.txt

В случае успеха последняя отрапортует, что всё хорошо и можно будет увидеть наши диски в кластере:

# /usr/lpp/mmfs/bin/mmlsnsd 
File system Disk name NSD servers
---------------------------------------------------------------------------
(free disk) volume1  (directly attached)
(free disk) volume2  (directly attached)

В общем и целом на этом добавление дисков заканчивается.

Тюнинг кластера

Для кластера можно подкрутить некоторые важные параметры, такие как максимальный размер блока или размер страницы.

Поглядеть уже настроенное можно следующей командой:

# /usr/lpp/mmfs/bin/mmlsconfig

Подкрутить можно следующее:

  • pagepool - количество памяти, которое можно утилизировать приложениям SpectrumScale
  • maxFilesToCache - количество кэшируемых файлов и файлов метаданных
  • maxStatCache - дополнительная память для кэширования атрибутов файлов
  • maxMBpS - количество iops'ов для префетча и дозаписи
  • autoload - очевидно (значения yes|no)
  • maxblocksize - максимальный размер блока

Команда для подкручивания:

# /usr/lpp/mmfs/bin/mmchconfig key=value

Создание файловой системы

Теперь, после всех этих подготовительных работ требуется наконец создать файловую систему поверх нашего кластера:

# /usr/lpp/mmfs/bin/mmcrfs gpfs -F diskdef.txt -A yes -T /gpfs

В случае успеха и при наличии на всех нодах директории /gpfs можно наконец подмонтировать нашу кластерную ФС

# /usr/lpp/mmfs/bin/mmmount gpfs01 -a

После этой команды на всех нодах, в директории /gpfs должна быть смонтирована ФС, доступная для чтения/записи на всех нодах.

FileSet

Для разделения квот по разным группам внутри одной ФС можно использовать так называемые FileSet. Сначала мы его создаём на уже существующей ФС:

# /usr/lpp/mmfs/bin/mmcrfileset gpfs01 fs01

А потом линкуем в директорию, которая нам понравится

# /usr/lpp/mmfs/bin/mmlinkfileset gpfs01 fs01 /gpfs/fs01
TODO

Ещё разок задеплоить по инструкции, наверняка я что-то забыл.

1)
даже не вздумайте использовать SpectrumScale без приобретения нужного количества лицензий, копирасты не дремлют
2)
иначе какой же это кластер?
3)
кстати alias'ы multipath не работают, так что придётся использовать каноничные dm