Решение - Файловая система Lustre over ZFS
Введение.
Не так давно случился переход проекта файловой системы Lustre под крыло Intel. Данный переход позитивным образом сказался на частоте обновлений системы.
В том числе и на внедрение ZFS. Пришло время обновлений…
Данная статья описывает UPGRADE кластера описанного в более ранней статье с небольшими изменениями.
Все последующее действительно для версии Lustre 2.5.3
Схема и конфигурации оборудования.
Используется следующая конфигурация:
Один сервер 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.
Решается это следующим алгоритмом:
Деактивация OST (при указанном режиме данные доступны только для чтения)
Переброс данных на свободные OST
Постоянная деактивация OST
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 система стала стабильнее (с точки зрения использования последних версий).
Об авторе