Не так давно случился переход проекта файловой системы 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
На серверах:
Загрузка дистрибутивов утилит:
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
Порядок развертывания следующий:
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
Остановимся только на следующих задачах: Добавление узла 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 автора