✦ Крупнейшая в мире социальная сеть для знакомства с новыми людьми
✦ 2 000 серверов с PHP
✦ 150 000 файлов объемом 900 Мб
План
✦ Понятие деплоя кода
✦ Старая система деплоя в Badoo
✦ Другие существующие решения
✦ Новая система — MDK
✦ Заключение
План
✦ Понятие деплоя кода
✦ Старая система деплоя в Badoo
✦ Другие существующие решения
✦ Новая система — MDK
✦ Заключение
Процесс деплоя
✦ Получение кода из репозитория (clone / fetch / checkout)
✦ Сборка (build)
✦ Доставка на конечные сервера (deployment)
План
✦ Понятие деплоя кода
✦ Старая система деплоя в Badoo («лупы»)
✦ Другие существующие решения
✦ Новая система — MDK
✦ Заключение
Deploymove (troops) into position for military action
Loopa pseudo-device that makes a file accessible as a block device
Loop
✦ packages/
✦ templates/
✦ config/
✦ public/
build directory
cp -r
mounted loop
✦ packages/
✦ templates/
✦ config/
✦ public/
umount loop900 MiB
loop900 MiB
mount
План
✦ Понятие деплоя кода
✦ Старая система деплоя в Badoo
✦ Другие существующие решения
✦ Новая система — MDK
✦ Заключение
Существующие решения
✦ Система контроля версий (svn up / git pull / hg up)
✦ rsync (в новую директорию или «поверх»)
✦ Один файл (phar, hhbc, loop)
✦ rsync + 2 директории + realpath_root
Существующие решения
✦ Система контроля версий (svn up / git pull / hg up)
✦ rsync (в новую директорию или «поверх»)
✦ Один файл (phar, hhbc, loop)
✦ rsync + 2 директории + realpath_root
svn up
+ «Ленивый»
+ Быстрый
+ Легковесный (в случае SVN)
- Неатомарный
+/- Подходит для небольших проектов
Существующие решения
✦ Система контроля версий (svn up / git pull / hg up)
✦ rsync (в новую директорию или «поверх»)
✦ Один файл (phar, hhbc, loop)
✦ rsync + 2 директории + realpath_root
Rsync в новую директорию
+ Атомарный
-- Нагрузка по I/O (заливка нового + удаление старого)
-- Много трафика
Существующие решения
✦ Система контроля версий (svn up / git pull / hg up)
✦ rsync (в новую директорию или «поверх»)
✦ Один файл (phar, hhbc, loop)
✦ rsync + 2 директории + realpath_root
Rsync поверх++ Отправка только изменений
- Неатомарный
- Высокий CPU% на отправляющей стороне
- Отправка и прием списка всех файлов с их stat()
- 3 мб и 1 сек CPU на 150к файлов
- 40-60 сек на 1000 серверов (24 ядра и 1 Гбит/с)
Существующие решения
✦ Система контроля версий (svn up / git pull / hg up)
✦ rsync (в новую директорию или «поверх»)
✦ Один файл (phar, hhbc, loop)
✦ rsync + 2 директории + realpath_root
Один файл++ Возможность использования uftp / bittorent
+ Простота
+ Атомарность
+ Легкость проверки целостности (md5 от одного файла)
+ Последовательная запись
- Большой объем записи
- Большая нагрузка на сеть
UFTP
✦ Загрузка по протоколу UDP (Multicast) + NACK
✦ Подходит для загрузки на сотни машин
✦ В наших условиях работает лучше bittorrent
✦ Open-source
Один файл (phar)
+ Нативный для PHP
- Необходимость адаптировать код для работы из архива
- Нельзя поменять один файл
- OPCache сбрасывается полностью
Один файл (hhbc)
+/- Нативный для HHVM
+ Дополнительные оптимизации (+30% к скорости)
- Необходимость адаптировать код для работы из архива
- Запрещено использовать eval и динамические include
- Нельзя поменять один файл
Один файл (loop)
+ Выглядит, как обычная директория
+ Можно поменять один файл (rw mount)
-- Не совместим с docker (no dynamic mounts)
- OPCache сбрасывается полностью
- Требуется sudo для mount
- Не забывать монтировать при (ре)старте
Один файл (loop), docker
✦ Docker не поддерживает dynamic mounts
✦ loop монтируется динамически
✦ Пробовали понимать локальные NFS, SSHFS
✦ rsync /var/loop/<N>/ /var/www/
✦ /var/www/ — директория, прокинутая в контейнер
✦ Решение плохое, rsync не атомарный
Существующие решения
✦ Система контроля версий (svn up / git pull / hg up)
✦ rsync (в новую директорию или «поверх»)
✦ Один файл (phar, hhbc, loop)
✦ rsync + 2 директории + realpath_root
Atomic deploy
✦ atomic symlink change using rename(2)
✦ php-fpm reload / apache reload
✦ fork(2)
✦ child: exec(2) and adopt listen socket
✦ parent: close listen socket, drain and exit
- or -
Rasmus-style
document_root A
B
nginx.confroot $realpath_root;
apache.conf<IfModule mod_realdoc.c> RealpathEvery 2 </IfModule>
https://github.com/etsy/mod_realdoc
- or -
rsync
Rasmus-style
+ Не требуется адаптация кода
+ Не требуется reload — переиспользуется OPCache
- Требуется в 2 раза больше памяти под OPCache
- Нельзя деплоиться чаще, чем раз в max_execution_time сек
- Для Apache нужен сторонний модуль
План
✦ Понятие деплоя кода
✦ Старая система деплоя в Badoo
✦ Другие существующие решения
✦ Новая система — MDK
✦ Заключение
Требования
✦ Быстрый деплой на staging и production
✦ Атомарные патчи
✦ Скрипты могут работать несколько часов (CLI)
✦ Малое потребление ресурсов
✦ Сохранность OPCache
✦ Быстрый откат
Требования
✦ Быстрый деплой на staging и production
✦ Атомарные патчи
✦ Скрипты могут работать несколько часов (CLI)
✦ Малое потребление ресурсов
✦ Сохранность OPCache
✦ Быстрый откат
Возможные решения
✦ loop xN (-staging, -docker, -opcache)
✦ rsync xN (-production, -opcache xN)
✦ SVN xN (-production, -opcache xN)
Multiversion Deployment Kit
✦ Возьмем архитектуру хранения деревьев (tree) из Git
✦ Переименуем все файлы из file.php в file.php.<version>
✦ Для скорости напишем её на Go
✦ Готово!
Multiversion Deployment Kit
map:array( one => f/a3f4da63, two => f/c193497a, map => d/9c134b68,)
rootdeadbeef
onea3f4da63
twoc193497a
map9c134b68
threefebe6995
four75ffdb82
Multiversion Deployment Kit
rootdeadbeef
onea3f4da63
twoc193497a
map9c134b68
threefebe6995
four75ffdb82
root*f7fc6872
map*21e05ae6
three*28e967c5
Multiversion Deployment Kit
|- current.map -> f7fc6872.map|- deadbeef.map|- f7fc6872.map|- one.php.a3f4da63|- two.php.c193497a|- tree/| |- 9c134b68.map| |- 21e05ae6.map| |- three.php.febe6995| |- three.php.21e05ae6
Multiversion Deployment Kit|- current.map -> f7fc6872.map|- deadbeef.map|- f7fc6872.map|- one.php|- one.php.a3f4da63|- two.php|- two.php.c193497a|- mdk.inc|- tree/| |- 9c134b68.map| |- 21e05ae6.map| |- three.php| |- three.php.febe6995| |- three.php.21e05ae6
one.php:
<?php require_once "mdk.inc"; require mdk_resolve_path("a.php");
MDK deploy protocol
1. Получаем корневой map
2.Смотрим, каких файлов не хватает
3.Запрашиваем недостающие файлы
4.Переходим к пункту 2
Multiversion Deployment Kit+ Быстрый атомарный деплой небольших изменений
+ Низкое потребление CPU
+ OPCache переиспользуется
+ Позволяет скриптам работать сутками
+ Легкий мониторинг
+ Быстрый откат изменений
+ Написана на Go
Multiversion Deployment Kit- Требуется модификация кода
- Сложная
- Требуется Garbage Collector
- Для редактирования файлов нужны спец. утилиты (mdk-vim)
MDK numbers
Staging deploy 3-5 seconds
Production deploy 2 minutes
Patch deploy 5-10 seconds
Full deploy 40 minutes
Fails count 2
Epic fails count 1
План
✦ Понятие деплоя кода
✦ Старая система деплоя в Badoo
✦ Другие существующие решения
✦ Новая система — MDK
✦ Заключение
Заключение
✦ Rasmus не врет, rsync + realpath_root хорош
✦ «Лупы» тоже работают вполне неплохо
✦ Используйте то, что подходит лично вам
✦ Частый деплой + долгая работа => MDK
✦ Расскажите о своем опыте
✦ Заходите на https://tech.badoo.com/ !