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

автор Антон Деменев

10 Апр 2015

Дисковая подсистема является “бутылочным горлышком” почти для всех серверов, исключая разве что комплексы в датацентрах с SAN хранилищами на базе SSD дисков.

Каждая операция ввода/вывода занимает миллисекунды, а процессор и память успевают произвести за это же время миллионы операций.

Поэтому развертывание массивов данных, состоящих из большого количества маленьких файлов, зачастую занимает слишком много времени и ведет к перерасходам бюджета. В этом материале я хочу рассказать о методике, которая позволяет значительно сократить время развертывания окружения.

Характеристики тестового окружения

Развертывание производится на базе виртуальной машины с 3мя ядрами Core i3 и 4мя ГБ ОЗУ. При уменьшении данных параметров до 2х ядер и 2ГБ ОЗУ система также работает стабильно (но не менее, поскольку используемая технология требовательна к ресурсам).

Все тестовые машины развернуты на базе ОС Debian7, хост машина — на базе Windows7. В реальных условиях можно использовать любое подходящее окружение.

Пакет тестовых данных состоит из более чем 2х миллионов файлов малого размера, суммарный объем — около 5Гб. Упаковка данных занимает примерно 4 часа при минимальном приоритете по процессору и дисковым операциям.

How to save deployment time environment

Окружение разработчиков создается на базе резервной копии с сервера продакшена. Этот массив реальных данных содержит ежедневные копии базы данных и недельные полные копии файлов приложения. Данные упаковываются на сервере продакшена и выгружаются в директорию на сервере хранилища.

How to save deployment time dataset lifecycle

После распаковки данных мы получаем Большую Директорию. Процесс распаковки занимает около получаса, полный листинг файлов тоже занимает достаточно много времени. Копирование упакованных данных идет порядка 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. Помните: возможности ограничиваются только вашей изобретательностью.

  • 0 Репосты

Комментарии

Фильтр

Закрыть

Технологии

Индустрии