====== Решение - Файловая система Lustre over ZFS ====== ==== Введение. ==== Не так давно случился переход проекта файловой системы Lustre под крыло Intel. Данный переход позитивным образом сказался на частоте обновлений системы. В том числе и на внедрение ZFS. Пришло время обновлений...\\ Данная статья описывает UPGRADE кластера описанного в более ранней [[http://myitnotes.info/doku.php?id=ru:jobs:lustrefs|статье]] с небольшими изменениями.\\ Все последующее действительно для [[https://wiki.hpdd.intel.com/display/PUB/Lustre+Releases|версии Lustre 2.5.3]]\\ ====Схема и конфигурации оборудования.==== \\ {{:ru:jobs:lustre-cluster-ex.png?600|300}} \\ **Используется следующая конфигурация:**\\ Один сервер MGS/MDS/OSS и пять OSS серверов.\\ **Конфигурация MGS/MDS/OSS сервера:** \\ Proc Intel Xeon 56xx 2x2.4Ggz\\ Mem 72Gb*\\ Net 6x1Gbit/s\\ SSD 2x120Gb\\ HDD RAID6+HS - 24x3TB disks\\ *Большое количество памяти выбрано с учетом того , что данный сервер так же экспортирует ФС по протоколам NFS,SMB **Конфигурация OSS сервера:** \\ Proc Intel Xeon 56xx 2x2.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 на свободные.\\ Решается это следующим алгоритмом:\\ * Деактивация переполненных OST (при указанном режиме данные доступны только для чтения) * Переброс данных на свободные OST * Обратная активация 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. [[http://docs.oracle.com/cd/E19253-01/819-5461/gammq/index.html|См. документацию]] ====Послесловие==== После перехода под крыло Intel система стала стабильнее (с точки зрения использования последних версий). \\ ==== Об авторе ==== [[https://www.linkedin.com/pub/alexey-vyrodov/59/976/16b|Profile]] автора