Как сократить время развертывания окружения

IT-копирайтер
Время чтения: 8 минут
Дисковая подсистема является “бутылочным горлышком” почти для всех серверов, исключая разве что комплексы в датацентрах с SAN хранилищами на базе SSD дисков.
Каждая операция ввода/вывода занимает миллисекунды, а процессор и память успевают произвести за это же время миллионы операций.
Поэтому развертывание массивов данных, состоящих из большого количества маленьких файлов, зачастую занимает слишком много времени и ведет к перерасходам бюджета. В этом материале я хочу рассказать о методике, которая позволяет значительно сократить время развертывания окружения.
Характеристики тестового окружения
Развертывание производится на базе виртуальной машины с 3мя ядрами Core i3 и 4мя ГБ ОЗУ. При уменьшении данных параметров до 2х ядер и 2ГБ ОЗУ система также работает стабильно (но не менее, поскольку используемая технология требовательна к ресурсам).
Все тестовые машины развернуты на базе ОС Debian7, хост машина — на базе Windows7. В реальных условиях можно использовать любое подходящее окружение.
Пакет тестовых данных состоит из более чем 2х миллионов файлов малого размера, суммарный объем — около 5Гб. Упаковка данных занимает примерно 4 часа при минимальном приоритете по процессору и дисковым операциям.
Окружение разработчиков создается на базе резервной копии с сервера продакшена. Этот массив реальных данных содержит ежедневные копии базы данных и недельные полные копии файлов приложения. Данные упаковываются на сервере продакшена и выгружаются в директорию на сервере хранилища.
После распаковки данных мы получаем Большую Директорию. Процесс распаковки занимает около получаса, полный листинг файлов тоже занимает достаточно много времени. Копирование упакованных данных идет порядка 10 минут, а копирование распакованных данных — почти час.
В этом случае развертывание для 4х разработчиков занимает не менее 40 минут для каждой машины и сопровождается большой нагрузкой на дисковую подсистему.
Если разработчик повредит свои данные, процесс придется начинать заново, что чревато большими потерями времени.
Мы хотели сделать процесс развертывания окружения быстрым, простым и дешевым.
Наша схема базируется на возможностях файловой системы ZFS:
- Создание снапшотов без значительных потерь дискового пространства;
- Создание редактируемых клонов на базе снапшотов;
- Простота в использовании;
- Отказоустойчивость;
- Наличие встроенного аналога RAID из коробки.
Вы можете найти дополнительную информацию об установке ZFS для Linux на домашней странице проекта.
Итак, приступим!
1. Добавляем репозиторий проекта, устанавливаем пакеты для работы с ФС
$ su - # wget http://archive.zfsonlinux.org/debian/pool/main/z/zfsonlinux/zfsonlinux_5_all.deb # dpkg -i zfsonlinux_5_all.deb # wget http://zfsonlinux.org/4D5843EA.asc -O - | apt-key add - # apt-get update # apt-get install debian-zfs
Для создания хранилища с использованием ZFS RAIDZ необходимо три виртуальных диска, четвертый — системный.
root@debian-7-64-storage:/# parted -l Model: VBOX HARDDISK (scsi) Disk /dev/sda: 51.5GB Sector size (logical/physical): 512B/512B Partition Table: gpt Number Start End Size File system Name Flags 1 2097kB 51.5GB 51.5GB zfs primary Model: VBOX HARDDISK (scsi) Disk /dev/sdb: 51.5GB Sector size (logical/physical): 512B/512B Partition Table: gpt Number Start End Size File system Name Flags 1 2097kB 51.5GB 51.5GB zfs primary Model: VBOX HARDDISK (scsi) Disk /dev/sdc: 51.5GB Sector size (logical/physical): 512B/512B Partition Table: gpt Number Start End Size File system Name Flags 1 2097kB 51.5GB 51.5GB zfs primary Model: ATA VBOX HARDDISK (scsi) Disk /dev/sdd: 51.5GB Sector size (logical/physical): 512B/512B Partition Table: msdos Number Start End Size Type File system Flags 1 1049kB 49.4GB 49.4GB primary ext4 boot 2 49.4GB 51.5GB 2137MB extended 5 49.4GB 51.5GB 2137MB logical linux-swap(v1)
Создаем хранилище:
root@debian-7-64-storage:~# zpool create main-storage raidz /dev/sda1 /dev/sdb1 /dev/sdc1
root@debian-7-64-storage:~# zpool list NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT main-storage 143G 232K 143G 0% 1.00x ONLINE - root@debian-7-64-storage:~# zfs create main-storage/dev-storage -o mountpoint=/dev-storage root@debian-7-64-storage:~# zfs list NAME USED AVAIL REFER MOUNTPOINT main-storage 195K 93.8G 38.6K /main-storage main-storage/dev-storage 38.6K 93.8G 38.6K /dev-storage
2. Развертывание данных
Распаковываем данные начальной копии:
root@debian-7-64-storage:/dev-storage# time tar -xvf ./dataset.tar | wc -l 1038756 real 29m27.212s user 5m17.373s sys 3m25.046s
После распаковки создаем несколько копий для усложнения задачи:
root@debian-7-64-storage:/# ls -1l /dev-storage/ total 14 ... drwxr-xr-x 6 root root 6 Mar 27 19:19 stage1 drwxr-xr-x 6 root root 6 Mar 27 19:19 stage2
3. Развертываем копии для разработчиков
Создаем начальный снапшот. На его базе будет создаваться все остальное.
root@debian-7-64-storage:~# zfs snapshot main-storage/dev-storage@initial
root@debian-7-64-storage:~# zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT main-storage/dev-storage@initial 0 - 8.37G -
Снапшот доступен только для чтения. Чтобы открыть возможность редактирования набора данных, создаем клоны снапшота.
root@debian-7-64-storage:~# mkdir -p /snapshots/dev-{1,2} root@debian-7-64-storage:~# zfs clone main-storage/dev-storage@initial main-storage/dev-1 -o mountpoint=/snapshots/dev-1 root@debian-7-64-storage:~# zfs clone main-storage/dev-storage@initial main-storage/dev-2 -o mountpoint=/snapshots/dev-2
root@debian-7-64-storage:~# zfs list NAME USED AVAIL REFER MOUNTPOINT main-storage 8.37G 85.4G 38.6K /main-storage main-storage/dev-1 128K 85.4G 8.37G /snapshots/dev-1 main-storage/dev-2 1.33K 85.4G 8.37G /snapshots/dev-2 main-storage/dev-storage 8.37G 85.4G 8.37G /dev-storage
После создания клонов делаем снапшоты клонов. Благодаря этому можно быстро откатиться в случае, если разработчик повредит свой набор данных.
root@debian-7-64-storage:~# zfs snapshot main-storage/dev-1@initial
root@debian-7-64-storage:~# zfs snapshot main-storage/dev-2@initial
root@debian-7-64-storage:~# zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT main-storage/dev-1@initial 1.33K - 8.37G - main-storage/dev-2@initial 0 - 8.37G - main-storage/dev-storage@initial 131K - 8.37G -
Мы не устанавливали квоты на запись в клоны, но это возможно. Для этого достаточно установить свойство “quota=” через утилиту zfs.
4. Развертывание данных в песочницах.
Теперь у нас есть две полноценные примонтированные копии данных. Осталось экспортировать их в песочницы разработчиков.
root@debian-7-64-storage:~# mount ….. main-storage on /main-storage type zfs (rw,relatime,xattr,noacl) main-storage/dev-storage on /dev-storage type zfs (rw,relatime,xattr,noacl) main-storage/dev-1 on /snapshots/dev-1 type zfs (rw,relatime,xattr,noacl) nfsd on /proc/fs/nfsd type nfsd (rw,relatime) main-storage/dev-2 on /snapshots/dev-2 type zfs (rw,relatime,xattr,noacl)
Мы выбрали в качестве транспорта систему NFS как простую, быструю и нетребовательную к ресурсам.
root@debian-7-64-storage:~# ip addr show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 08:00:27:a3:f7:15 brd ff:ff:ff:ff:ff:ff inet 172.16.0.111/16 brd 172.16.255.255 scope global eth0
root@debian-7-64-dev:~# ip addr show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 08:00:27:e9:e5:ba brd ff:ff:ff:ff:ff:ff inet 172.16.0.105/16 brd 172.16.255.255 scope global eth0
Для ускорения работы на сетевых интерфейсах можно активировать технологию Jumbo Frames.
root@debian-7-64-storage:~# ifconfig eth0 mtu 9000 root@debian-7-64-dev:~# ifconfig eth0 mtu 9000
root@debian-7-64-storage:~# netstat -i Kernel Interface table Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg eth0 9000 0 2367100 0 0 0 2702231 0 0 0 BMRU
Проверяем ее работу:
root@debian-7-64-storage:~# ping 172.16.0.105 -M do -s 8972 PING 172.16.0.105 (172.16.0.105) 8972(9000) bytes of data. 8980 bytes from 172.16.0.105: icmp_req=1 ttl=64 time=0.611 ms 8980 bytes from 172.16.0.105: icmp_req=2 ttl=64 time=0.413 ms 8980 bytes from 172.16.0.105: icmp_req=3 ttl=64 time=0.284 ms
Настраиваем шары. Для упрощения примера мы не подключали дополнительные подсистемы аутенфикации и права доступа. Авторизация происходит по адресу хоста.
root@debian-7-64-storage:~# cat /etc/exports /snapshots/dev-1 172.16.0.105/32(rw,nohide,insecure,no_subtree_check,async,no_root_squash,fsid=0) /snapshots/dev-2 172.16.0.62/32(rw,nohide,insecure,no_subtree_check,async,no_root_squash,fsid=0)
Запускаем сервис:
root@debian-7-64-storage:~# service nfs-kernel-server start [ ok ] Exporting directories for NFS kernel daemon.... [ ok ] Starting NFS kernel daemon: nfsd mountd.
Монтируем свежесозданные файловые шары на машины разработчиков. Метаданные заблокированы для увеличения производительности. Дополнительно увеличены максимальные размеры пакетов данных.
root@debian-7-64-dev:~# mount -t nfs 172.16.0.111:/snapshots/dev-1 /srv/data -o noacl,nocto,noatime,nodiratime,rsize=8192,wsize=8192
root@debian-7-64-dev:~# mount 172.16.0.111:/snapshots/dev-1 on /srv/data type nfs (rw,noatime,nodiratime,vers=3,rsize=8192,wsize=8192,namlen=255,hard,nocto,noacl,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=172.16.0.111,mountvers=3,mountport=42230,mountproto=udp,local_lock=none,addr=172.16.0.111)
В результате — все данные доступны:
root@debian-7-64-dev:/srv/data# ls -1l total 14 drwxr-xr-x 6 root root 6 Mar 27 20:19 stage1 drwxr-xr-x 6 root root 6 Mar 27 20:19 stage2
Повторите процесс на остальных компьютерах и завершите процесс развертки окружения. Теперь остается только наслаждаться результатом своей работы.
При желании можно написать скрипт, который будет запускаться на машинах разработчиков и предоставлять все функции по управлению наборами данных через ssh. Помните: возможности ограничиваются только вашей изобретательностью.
Комментарии