Table of Contents

Решение - Файловая система Lustre over ZFS

Введение.

Не так давно случился переход проекта файловой системы Lustre под крыло Intel. Данный переход позитивным образом сказался на частоте обновлений системы. В том числе и на внедрение ZFS. Пришло время обновлений…

Данная статья описывает UPGRADE кластера описанного в более ранней статье с небольшими изменениями.
Все последующее действительно для версии Lustre 2.5.3

Схема и конфигурации оборудования.


300
Используется следующая конфигурация:
Один сервер MGS/MDS/OSS и пять OSS серверов.

Конфигурация MGS/MDS/OSS сервера:
Proc Intel Xeon 56xx 2×2.4Ggz
Mem 72Gb*
Net 6x1Gbit/s
SSD 2x120Gb
HDD RAID6+HS - 24x3TB disks

*Большое количество памяти выбрано с учетом того , что данный сервер так же экспортирует ФС по протоколам NFS,SMB

Конфигурация OSS сервера:
Proc Intel Xeon 56xx 2×2.4Ggz
Mem 12Gb
Net 4x1Gbit/s
HDD Adaptec RAID6+HS - 24x3TB disks

Ceть:
Все сервера объединены в одном vlan. (Отсутсвует разделение на Backend и Frontend)

ОС на всех серверах: Centos 6.5

Подготовка ОС и тюнинг

На вопрос: куда подключены SSD если корзин только 24? К материнской плате и лежат внутри сервера (благо места достаточно).

* Установка ОС Centos 6.5 * Обновление и установка необходимых компонентов

 yum --exlude=kernel/* update -y
 yum localinstall --nogpgcheck https://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
 yum localinstall --nogpgcheck http://archive.zfsonlinux.org/epel/zfs-release.el6.noarch.rpm
 yum install zfs strace sysstat man wget net-snmp openssh-clients ntp ntpdate tuned

Обязательно проверить скомпилировался ли ZFS модуль. (Версия lustre 2.5.3 совместима с ZFS 0.6.3)

* На каждом из MGS/MDS/OSS и ОSS серверов создаются bond-интерфесы:

 bond0 
 BONDING_OPTS="miimon=100 mode=0"

* Отключается SELINUX
* Устанавливается следующее по:

 yum install mc openssh-clients openssh-server net-snmp man sysstat rsync htop trafshow nslookup ntp

* Настраивается ntp
* На всех серверах настраиваются идентичные учетные записи (uid:gid)
* Настраиваются параметры scheduler: tuned-adm profile latency-performance
* Изменяются параметры стека 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

На серверах:

Загрузка дистрибутивов утилит:

wget -r https://downloads.hpdd.intel.com/public/e2fsprogs/1.42.9.wc1/el6/RPMS/x86_64/\\

и непосредственно lustre:

wget -r https://downloads.hpdd.intel.com/public/lustre/lustre-2.5.3/el6/server/RPMS/x86_64/\\

Установка утилит:
Перед установкой необходимо удалить текущиe версии утилит (rpm -e –nodeps) e2fsprogs e2fsprogs-libs libcom_err libss

Установить новые:

 rpm -ivh libcom_err-1.42.9.wc1-7.el6.x86_64.rpm
 rpm -ivh e2fsprogs-libs-1.42.9.wc1-7.el6.x86_64.rpm
 rpm -ivh e2fsprogs-1.42.9.wc1-7.el6.x86_64.rpm

Установка Lustre:

rpm -ivh --force kernel-2.6.32-431.23.3.el6_lustre.x86_64.rpm
rpm -ivh lustre-modules-2.5.3-2.6.32_431.23.3.el6_lustre.x86_64.x86_64.rpm
rpm -ivh lustre-modules-2.5.3-2.6.32_431.23.3.el6_lustre.x86_64.x86_64.rpm
rpm -ivh lustre-osd-zfs-2.5.3-2.6.32_431.23.3.el6_lustre.x86_64.x86_64.rpm
rpm -ivh lustre-osd-ldiskfs-2.5.3-2.6.32_431.23.3.el6_lustre.x86_64.x86_64.rpm
rpm -ivh lustre-2.5.3-2.6.32_431.23.3.el6_lustre.x86_64.x86_64.rpm

Необходимо удостовериться что именно lustre kernel выбрано по умолчанию при загрузке в /boot/grub/grub.conf

Настройка сети LNET:

echo "options lnet networks=tcp0(bond0)" > /etc/modprobe.d/lustre.conf

Перезагрузка узлов

reboot

На клиентах:

Загрузка и установка утилит как на серверах.

Обновление ядра:

yum install -y kernel-2.6.32-431.23.3.el6
reboot

Загрузка lustre:

wget -r https://downloads.hpdd.intel.com/public/lustre/lustre-2.5.3/el6/client/RPMS/x86_64/

Установка Lustre:

rpm -ivh lustre-client-modules-2.5.3-2.6.32_431.23.3.el6.x86_64.x86_64.rpm
rpm -ivh lustre-client-2.5.3-2.6.32_431.23.3.el6.x86_64.x86_64.rpm

Развертывание Lustre

Порядок развертывания следующий:
1. Создается и поднимается MGS/MDS.
2. Созадются OSS/OST

На сервере MGS/MDS/OSS:

На всякий случай:
ln -s /lib64/libzfs.so.2.0.0 libzfs.so.2
Далее
mkfs.lustre --reformat --mgs --backfstype=zfs --fsname=lustrerr rumrrlustre-mdt0msg/mgs mirror /dev/sdd /dev/sde
mkfs.lustre --mdt --backfstype=zfs --index=0 --fsname=lustrerr --mgsnode=192.168.5.182@tcp0 rumrrlustre-mdt0msg/mdt0

Создание файла  /etc/ldev.conf
 # exampl mple /etc/ldev.conf
 #
 # local  foreign/-  label       [md|zfs:]device-path     [journal-path]
 #
 ls-1 - MGS                    zfs:rumrrlustre-mdt0msg/mgs
 ls-1 - lustrerr:MDT0000       zfs:rumrrlustre-mdt0msg/mdt0
 ls-1 - lustrerr:OST0000       zfs:rumrrlustre-oss0/ost0

    
 service lustre start MGS
 service lustre start MDT0000
 

Если сервис не поднимается, необходимо проверить работы модуля подсети lustre - LNET
lctl list_nids.

Если указывается что сеть не настроена - lctl network up

 mkfs.lustre --ost --backfstype=zfs --index=0 --fsname=lustrerr --mgsnode=192.168.5.182@tcp0 rumrrlustre-oss0/ost0 /dev/ost-drive
 ost-drive -RAID6 устройство. Название согласно созданному udev правилу.
 mkdir /lustre

 /etc/fstab
 192.168.5.182@tcp0:/lustrerr /lustre lustre defaults,_netdev 0 0

На серверах OSS:

mkfs.lustre --ost --backfstype=zfs --index=**N** --fsname=lustrerr --mgsnode=192.168.5.182@tcp0 rumrrlustre-oss**N**/ost0 /dev/ost-drive
где N-порядковый индекс.
Например mkfs.lustre --ost --backfstype=zfs --index=1 --fsname=lustrerr --mgsnode=192.168.5.182@tcp0 rumrrlustre-oss1/ost0 /dev/ost-drive

Создание файла  /etc/ldev.conf
 # exampl mple /etc/ldev.conf
 #
 # local  foreign/-  label       [md|zfs:]device-path     [journal-path]
 #
 ls-M - lustrerr:OST000N       zfs:rumrrlustre-ossN/ost0
 #где Номер сервера равный M = N+1

На клиентах:

 mkdir /lustre
 /etc/fstab
 192.168.5.182@tcp0:/lustrerr /lustre lustre defaults,_netdev 0 0

Теперь на любом из узлов со смонтированной системой возможен просмотр текущего состояние файловой системы:

 lfs df -h
 UUID                       bytes        Used   Available Use% Mounted on
 lustrerr-MDT0000_UUID      108.4G        2.1G      106.2G   2% /lustre[MDT:0]
 lustrerr-OST0000_UUID       55.7T        6.7T       48.9T  12% /lustre[OST:0]
 lustrerr-OST0001_UUID       55.7T        6.8T       48.9T  12% /lustre[OST:1]
 lustrerr-OST0002_UUID       55.7T        6.8T       48.9T  12% /lustre[OST:2]
 lustrerr-OST0003_UUID       55.7T        6.7T       48.9T  12% /lustre[OST:3]
 lustrerr-OST0004_UUID       55.7T        6.9T       48.8T  12% /lustre[OST:4]
 lustrerr-OST0005_UUID       55.7T        6.7T       48.9T  12% /lustre[OST:5]
 filesystem summary:       334.0T       40.6T      293.4T  12% /lustre  

Работа c Lustre

Остановимся только на следующих задачах: Добавление узла OST, удаление узла OST, резервное копирование, восстановление удаленных данных

1. Добавление нового узла и как следствие дисбаланс сохраненных данных на OST Пример:

 lfs df -h
 UUID                       bytes        Used   Available Use% Mounted on
 lustrerr-MDT0000_UUID      108.4G        2.1G      106.2G   2% /lustre[MDT:0]
 lustrerr-OST0000_UUID       55.7T        6.7T       48.9T  12% /lustre[OST:0]
 lustrerr-OST0001_UUID       55.7T        6.8T       48.9T  12% /lustre[OST:1]
 lustrerr-OST0002_UUID       55.7T        6.8T       48.9T  12% /lustre[OST:2]
 lustrerr-OST0003_UUID       55.7T        6.7T       48.9T  12% /lustre[OST:3]
 lustrerr-OST0004_UUID       55.7T        6.9T       48.8T  12% /lustre[OST:4]
 lustrerr-OST0005_UUID       55.7T        6.7T       48.9T  12% /lustre[OST:5]
 filesystem summary:       334.0T       40.6T      293.4T  12% /lustre  

При добавлении дополнительного узла как правило могут возникают две ситуации:
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. Удаление узла (OST)

Полное удаление узла в системе не возможно. Узел будет всегда видеться как inactive device.
Решается это следующим алгоритмом:

 
lctl --device FS-OST0003_UUID deactivate #temporary deactivate
lfs find --obd FS-OST0003_UUID /lustre | lfs_migrate -y #migrate data
lctl conf_param FS-OST0003_UUID.osc.active=0 #permanently deactivate

В итоге увидим:

lfs df -h
UUID                       bytes        Used   Available Use% Mounted on
lustrerr-MDT0000_UUID      108.4G        2.1G      106.2G   2% /lustre[MDT:0]
lustrerr-OST0000_UUID       55.7T        6.7T       48.9T  12% /lustre[OST:0]
lustrerr-OST0001_UUID       55.7T        6.8T       48.9T  12% /lustre[OST:1]
lustrerr-OST0002_UUID       55.7T        6.8T       48.9T  12% /lustre[OST:2]
lustrerr-OST0003_UUID       : inactive device
lustrerr-OST0004_UUID       55.7T        6.9T       48.8T  12% /lustre[OST:4]
lustrerr-OST0005_UUID       55.7T        6.7T       48.9T  12% /lustre[OST:5] 

3.Резервное копирование.

Решается путем создания snapshots и последующего перемещения на свободный носитель или узел. Пример простого скрипта для резервирования MDT (OST закоментарен).

vi /usr/local/bin/snapscript.sh

#!/bin/sh
currdate=`/bin/date +%Y-%m-%0e`
olddate=`/bin/date --date="21 days ago" +%Y-%m-%0e`
chk=`zfs list -t snapshot | grep $olddate`
#creating snapshots for vol1 and Avol2 pools
/sbin/zfs snapshot rumrrlustre-mdt0msg/mdt0@$currdate
#/sbin/zfs snapshot rumrrlustre-ossN/ost0@$currdate #must be started on every ost. Also it can be started with ssh -X 
#deleting 21-days old snapshots (if they are exists)
/sbin/zfs destroy rumrrlustre-mdt0msg/mdt0@$olddate
#/sbin/zfs destroy rumrrlustre-ossN/ost0@$olddate #for ost
/sbin/zfs send -p rumrrlustre-mdt0msg/mdt0@$currdate | /bin/gzip > /root/meta-snap.gz #backup only mdt
# also mdt and ost can be backuped to remote node 
# example: zfs send -R rumrrlustre-mdt0msg/mdt0@$currdate | ssh some-node zfs receive rumrrlustre-mdt0msg/mdt0@$currdate

Восстановление из backup (пример только для mdt)

service lustre stop lustrerr:MDT0000
zfs rename rumrrlustre-mdt0msg/mdt0 rumrrlustre-mdt0msg/mdt0-old
gunzip -c /root/meta-snap.gz | zfs receive rumrrlustre-mdt0msg/mdt0
service lustre start lustrerz:MDT0000

В логах увидим:

Oct 14 14:12:44 ls-1 kernel: Lustre: lustrerr-MDT0000: Imperative Recovery enabled, recovery window shrunk from 300-900 down to 150-450
Oct 14 14:13:08 ls-1 kernel: Lustre: 3937:0:(client.c:1901:ptlrpc_expire_one_request()) @@@ Request sent has timed out for slow reply: [sent 1413281557/real 1413281557]  req@ffff880c60512c00 x1474855950917400/t0(0) o38->lustrerz-    MDT0000-mdc-ffff880463edc000@0@lo:12/10 lens 400/544 e 0 to 1 dl 1413281588 ref 1 fl Rpc:XN/0/ffffffff rc 0/-1
Oct 14 14:13:08 ls-1 kernel: Lustre: 3937:0:(client.c:1901:ptlrpc_expire_one_request()) Skipped 71364 previous similar messages
Oct 14 14:13:08 ls-1 kernel: Lustre: lustrerr-MDT0000: Will be in recovery for at least 2:30, or until 1 client reconnects
Oct 14 14:13:08 ls-1 kernel: LustreError: 3937:0:(import.c:1000:ptlrpc_connect_interpret()) lustrerr-MDT0000_UUID went back in time (transno 55834576660 was previously committed, server now claims 55834576659)!  See   https://bugzilla.lustre.org/show_bug.cgi?id=9646
Oct 14 14:13:08 ls-1 kernel: Lustre: lustrerr-MDT0000: Recovery over after 0:01, of 1 clients 1 recovered and 0 were evicted.
Oct 14 14:13:08 ls-1 kernel: Lustre: lustrerr-MDT0000-mdc-ffff880463edc000: Connection restored to lustrerz-MDT0000 (at 0@lo)
Oct 14 14:13:08 ls-1 kernel: Lustre: Skipped 1 previous similar message
Oct 14 14:13:08 ls-1 kernel: Lustre: lustrerr-OST0000: deleting orphan objects from 0x0:1571748 to 0x0:1571857
Oct 14 14:13:33 ls-1 kernel: LustreError: 167-0: lustrerz-MDT0000-lwp-OST0000: This client was evicted by lustrerz-MDT0000; in progress operations using this service will fail.
Oct 14 14:13:33 ls-1 kernel: Lustre: lustrerr-MDT0000-lwp-OST0000: Connection restored to lustrerz-MDT0000 (at 0@lo)

4. Восстановление удаленных файлов используя snapshot.

Используется скрипт из резервного копирования.
4.1.
vi /usr/local/bin/snapscript.sh

#!/bin/sh
currdate=`/bin/date +%Y-%m-%0e`
olddate=`/bin/date --date="21 days ago" +%Y-%m-%0e`
chk=`zfs list -t snapshot | grep $olddate`
#creating snapshots for vol1 and Avol2 pools
/sbin/zfs snapshot rumrrlustre-mdt0msg/mdt0@$currdate
/sbin/zfs snapshot rumrrlustre-ossN/ost0@$currdate #must be started on every ost. Also it can be started with ssh -X 
#deleting 21-days old snapshots (if they are exists)
/sbin/zfs destroy rumrrlustre-mdt0msg/mdt0@$olddate
/sbin/zfs destroy rumrrlustre-ossN/ost0@$olddate #for ost

4.2.
Для восстановления файлов требуемой даты. Для MDT:

 zfs clone -o canmount=off -o xattr=sa -o lustre:svname=lustrerz-MDT0000 -o lustre:mgsnode=192.168.5.182@tcp -o lustre:flags=1 -o lustre:fsname=lustrerr -o lustre:index=0 -o lustre:version=1  rumrrlustre-mdt0msg/mdt0@date rumrrlustre-mdt0msg/mdt00

4.3.
Для каждого OST (N-номер ost)

 zfs clone -o canmount=off -o xattr=sa -o lustre:svname=lustrerz-OST000N  -o lustre:mgsnode=192.168.5.182@tcp -o lustre:flags=34 -o lustre:fsname=lustrerr -o lustre:index=N -o lustre:version=1  rumrrlustre-ossN/ost0@date rumrrlustre-ossN/ostN0

4.4.
Остановить lustre (на всех узлах)

 service lustre stop

4.5.
В файле /etc/ldev (Пример для первого узла. Необходима правка на всех узлах)

ls-1.scanex.ru - lustrerr:MDT0000       zfs:rumrrlustre-mdt0msg/mdt00
ls-1.scanex.ru - lustrerr:OST000N       zfs:rumrrlustre-ossN/ostN0

4.6.
Запуск lustre (на всех узлах)

service lustre start

4.7.
Скопировать необходимые данные во временную локальную или удаленную папку. Затем остановить lustre на всех узлах

service lustre stop

4.8.
Восстановить первоначальную конфигурацию /etc/ldev.conf и запустить lustre.

service lustre start

4.9.
Скопировать данные из временной локальной или удаленной папки в файловую систему. (Данные во временных папках удалить)

4.10.

Удалить zfs-клоны через zfs destroy. См. документацию

Послесловие

После перехода под крыло Intel система стала стабильнее (с точки зрения использования последних версий).

Об авторе

Profile автора