5 способов деплоя
PHP-кода в условиях
хайлоада
Юрий Насретдинов
✦ Крупнейшая в мире социальная сеть
для знакомства с новыми людьми
✦ 2 000 серверов с PHP
✦ 150 000 файлов объемом 900 Мб
План
✦ Понятие деплоя кода
✦ Старая система деплоя в Badoo
✦ Другие существующие решения
✦ Новая система — MDK
✦ Заключение
План
✦ Понятие деплоя кода
✦ Старая система деплоя в Badoo
✦ Другие существующие решения
✦ Новая система — MDK
✦ Заключение
Deploy
move (troops) into position
for military action
Процесс деплоя
✦ Получение кода из репозитория (clone / fetch / checkout)
✦ Сборка (build)
✦ Доставка на конечные сервера (deployment)
План
✦ Понятие деплоя кода
✦ Старая система деплоя в Badoo («лупы»)
✦ Другие существующие решения
✦ Новая система — MDK
✦ Заключение
Deploy
move (troops) into position
for military action
Loop
a 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 loop
900 MiB
loop
900 MiB
mount
План
✦ Понятие деплоя кода
✦ Старая система деплоя в Badoo
✦ Другие существующие решения
✦ Новая система — MDK
✦ Заключение
Deploy
move (troops) into position
for military action
GPL
GNU
General Public
Licence
Существующие решения
✦ Система контроля версий (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 (заливка нового + удаление старого)
-- Много трафика
Rsync в новую директорию
Существующие решения
✦ Система контроля версий (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
Один файл (tar.gz)
-- Нагрузка по I/O (создание 150к файлов)
Один файл (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
config:
Atomic deploy
current_link
dir1
dir2
define('ROOT_DIR', __DIR__);
Atomic deploy
current_link -> dir2
Requests:
deploy
current_link -> dir1
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.conf
root $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)
Deploy
move (troops) into position
for military action
© https://www.youtube.com/watch?v=P2HhjHo1EQA
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,
)
root
deadbeef
one
a3f4da63
two
c193497a
map
9c134b68
three
febe6995
four
75ffdb82
Multiversion Deployment Kit
root
deadbeef
one
a3f4da63
two
c193497a
map
9c134b68
three
febe6995
four
75ffdb82
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
MDK deploy protocol
root
deadbeef
one
a3f4da63
MDK deploy protocol
root
deadbeef
one
a3f4da63
two
c193497a
tree
9c134b68
MDK deploy protocol
root
deadbeef
one
a3f4da63
two
c193497a
tree
9c134b68
three
febe6995
four
75ffdb82
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/ !
Thank you!
Юрий Насретдинов
nasretdinov@gmail.com

5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)

  • 1.
    5 способов деплоя PHP-кодав условиях хайлоада Юрий Насретдинов
  • 2.
    ✦ Крупнейшая вмире социальная сеть для знакомства с новыми людьми ✦ 2 000 серверов с PHP ✦ 150 000 файлов объемом 900 Мб
  • 3.
    План ✦ Понятие деплоякода ✦ Старая система деплоя в Badoo ✦ Другие существующие решения ✦ Новая система — MDK ✦ Заключение
  • 4.
    План ✦ Понятие деплоякода ✦ Старая система деплоя в Badoo ✦ Другие существующие решения ✦ Новая система — MDK ✦ Заключение
  • 5.
    Deploy move (troops) intoposition for military action
  • 6.
    Процесс деплоя ✦ Получениекода из репозитория (clone / fetch / checkout) ✦ Сборка (build) ✦ Доставка на конечные сервера (deployment)
  • 7.
    План ✦ Понятие деплоякода ✦ Старая система деплоя в Badoo («лупы») ✦ Другие существующие решения ✦ Новая система — MDK ✦ Заключение
  • 8.
    Deploy move (troops) intoposition for military action Loop a pseudo-device that makes a file accessible as a block device
  • 9.
    Loop ✦ packages/ ✦ templates/ ✦config/ ✦ public/ build directory cp -r mounted loop ✦ packages/ ✦ templates/ ✦ config/ ✦ public/ umount loop 900 MiB loop 900 MiB mount
  • 10.
    План ✦ Понятие деплоякода ✦ Старая система деплоя в Badoo ✦ Другие существующие решения ✦ Новая система — MDK ✦ Заключение
  • 11.
    Deploy move (troops) intoposition for military action GPL GNU General Public Licence
  • 12.
    Существующие решения ✦ Системаконтроля версий (svn up / git pull / hg up) ✦ rsync (в новую директорию или «поверх») ✦ Один файл (phar, hhbc, loop) ✦ rsync + 2 директории + realpath_root
  • 13.
    Существующие решения ✦ Системаконтроля версий (svn up / git pull / hg up) ✦ rsync (в новую директорию или «поверх») ✦ Один файл (phar, hhbc, loop) ✦ rsync + 2 директории + realpath_root
  • 14.
    svn up + «Ленивый» +Быстрый + Легковесный (в случае SVN) - Неатомарный +/- Подходит для небольших проектов
  • 15.
    Существующие решения ✦ Системаконтроля версий (svn up / git pull / hg up) ✦ rsync (в новую директорию или «поверх») ✦ Один файл (phar, hhbc, loop) ✦ rsync + 2 директории + realpath_root
  • 16.
    Rsync в новуюдиректорию + Атомарный -- Нагрузка по I/O (заливка нового + удаление старого) -- Много трафика
  • 17.
    Rsync в новуюдиректорию
  • 18.
    Существующие решения ✦ Системаконтроля версий (svn up / git pull / hg up) ✦ rsync (в новую директорию или «поверх») ✦ Один файл (phar, hhbc, loop) ✦ rsync + 2 директории + realpath_root
  • 19.
    Rsync поверх ++ Отправкатолько изменений - Неатомарный - Высокий CPU% на отправляющей стороне - Отправка и прием списка всех файлов с их stat() - 3 мб и 1 сек CPU на 150к файлов - 40-60 сек на 1000 серверов (24 ядра и 1 Гбит/с)
  • 20.
    Существующие решения ✦ Системаконтроля версий (svn up / git pull / hg up) ✦ rsync (в новую директорию или «поверх») ✦ Один файл (phar, hhbc, loop) ✦ rsync + 2 директории + realpath_root
  • 21.
    Один файл ++ Возможностьиспользования uftp / bittorent + Простота + Атомарность + Легкость проверки целостности (md5 от одного файла) + Последовательная запись - Большой объем записи - Большая нагрузка на сеть
  • 22.
    UFTP ✦ Загрузка попротоколу UDP (Multicast) + NACK ✦ Подходит для загрузки на сотни машин ✦ В наших условиях работает лучше bittorrent ✦ Open-source
  • 23.
    Один файл (tar.gz) --Нагрузка по I/O (создание 150к файлов)
  • 24.
    Один файл (phar) +Нативный для PHP - Необходимость адаптировать код для работы из архива - Нельзя поменять один файл - OPCache сбрасывается полностью
  • 25.
    Один файл (hhbc) +/-Нативный для HHVM + Дополнительные оптимизации (+30% к скорости) - Необходимость адаптировать код для работы из архива - Запрещено использовать eval и динамические include - Нельзя поменять один файл
  • 26.
    Один файл (loop) +Выглядит, как обычная директория + Можно поменять один файл (rw mount) -- Не совместим с docker (no dynamic mounts) - OPCache сбрасывается полностью - Требуется sudo для mount - Не забывать монтировать при (ре)старте
  • 27.
    Один файл (loop),docker ✦ Docker не поддерживает dynamic mounts ✦ loop монтируется динамически ✦ Пробовали понимать локальные NFS, SSHFS ✦ rsync /var/loop/<N>/ /var/www/ ✦ /var/www/ — директория, прокинутая в контейнер ✦ Решение плохое, rsync не атомарный
  • 28.
    Существующие решения ✦ Системаконтроля версий (svn up / git pull / hg up) ✦ rsync (в новую директорию или «поверх») ✦ Один файл (phar, hhbc, loop) ✦ rsync + 2 директории + realpath_root
  • 29.
  • 30.
    Atomic deploy current_link ->dir2 Requests: deploy current_link -> dir1
  • 31.
    Atomic deploy ✦ atomicsymlink 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 -
  • 32.
    Rasmus-style document_root A B nginx.conf root $realpath_root; apache.conf <IfModulemod_realdoc.c> RealpathEvery 2 </IfModule> https://github.com/etsy/mod_realdoc - or - rsync
  • 33.
    Rasmus-style + Не требуетсяадаптация кода + Не требуется reload — переиспользуется OPCache - Требуется в 2 раза больше памяти под OPCache - Нельзя деплоиться чаще, чем раз в max_execution_time сек - Для Apache нужен сторонний модуль
  • 34.
    План ✦ Понятие деплоякода ✦ Старая система деплоя в Badoo ✦ Другие существующие решения ✦ Новая система — MDK ✦ Заключение
  • 35.
    Требования ✦ Быстрый деплойна staging и production ✦ Атомарные патчи ✦ Скрипты могут работать несколько часов (CLI) ✦ Малое потребление ресурсов ✦ Сохранность OPCache ✦ Быстрый откат
  • 36.
    Требования ✦ Быстрый деплойна staging и production ✦ Атомарные патчи ✦ Скрипты могут работать несколько часов (CLI) ✦ Малое потребление ресурсов ✦ Сохранность OPCache ✦ Быстрый откат
  • 37.
    Возможные решения ✦ loopxN (-staging, -docker, -opcache) ✦ rsync xN (-production, -opcache xN) ✦ SVN xN (-production, -opcache xN)
  • 38.
    Deploy move (troops) intoposition for military action © https://www.youtube.com/watch?v=P2HhjHo1EQA
  • 39.
    Multiversion Deployment Kit ✦Возьмем архитектуру хранения деревьев (tree) из Git ✦ Переименуем все файлы из file.php в file.php.<version> ✦ Для скорости напишем её на Go ✦ Готово!
  • 40.
    Multiversion Deployment Kit map: array( one=> f/a3f4da63, two => f/c193497a, map => d/9c134b68, ) root deadbeef one a3f4da63 two c193497a map 9c134b68 three febe6995 four 75ffdb82
  • 41.
  • 42.
    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
  • 43.
    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");
  • 44.
    MDK deploy protocol 1.Получаем корневой map 2.Смотрим, каких файлов не хватает 3.Запрашиваем недостающие файлы 4.Переходим к пункту 2
  • 45.
  • 46.
  • 47.
  • 48.
    Multiversion Deployment Kit +Быстрый атомарный деплой небольших изменений + Низкое потребление CPU + OPCache переиспользуется + Позволяет скриптам работать сутками + Легкий мониторинг + Быстрый откат изменений + Написана на Go
  • 49.
    Multiversion Deployment Kit -Требуется модификация кода - Сложная - Требуется Garbage Collector - Для редактирования файлов нужны спец. утилиты (mdk-vim)
  • 50.
    MDK numbers Staging deploy3-5 seconds Production deploy 2 minutes Patch deploy 5-10 seconds Full deploy 40 minutes Fails count 2 Epic fails count 1
  • 51.
    План ✦ Понятие деплоякода ✦ Старая система деплоя в Badoo ✦ Другие существующие решения ✦ Новая система — MDK ✦ Заключение
  • 52.
    Заключение ✦ Rasmus неврет, rsync + realpath_root хорош ✦ «Лупы» тоже работают вполне неплохо ✦ Используйте то, что подходит лично вам ✦ Частый деплой + долгая работа => MDK ✦ Расскажите о своем опыте ✦ Заходите на https://tech.badoo.com/ !
  • 53.