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

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

  • Upload
    ontico

  • View
    548

  • Download
    4

Embed Size (px)

Citation preview

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

5 способов деплоя PHP-кода в условиях

хайлоадаЮрий Насретдинов

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

✦ Крупнейшая в мире социальная сеть для знакомства с новыми людьми

✦ 2 000 серверов с PHP

✦ 150 000 файлов объемом 900 Мб

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

План

✦ Понятие деплоя кода

✦ Старая система деплоя в Badoo

✦ Другие существующие решения

✦ Новая система — MDK

✦ Заключение

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

План

✦ Понятие деплоя кода

✦ Старая система деплоя в Badoo

✦ Другие существующие решения

✦ Новая система — MDK

✦ Заключение

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

Deploymove (troops) into position for military action

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

Процесс деплоя

✦ Получение кода из репозитория (clone / fetch / checkout)

✦ Сборка (build)

✦ Доставка на конечные сервера (deployment)

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

План

✦ Понятие деплоя кода

✦ Старая система деплоя в Badoo («лупы»)

✦ Другие существующие решения

✦ Новая система — MDK

✦ Заключение

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

Deploymove (troops) into position for military action

Loopa pseudo-device that makes a file accessible as a block device

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

Loop

✦ packages/

✦ templates/

✦ config/

✦ public/

build directory

cp -r

mounted loop

✦ packages/

✦ templates/

✦ config/

✦ public/

umount loop900 MiB

loop900 MiB

mount

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

План

✦ Понятие деплоя кода

✦ Старая система деплоя в Badoo

✦ Другие существующие решения

✦ Новая система — MDK

✦ Заключение

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

Deploymove (troops) into position for military action

GPLGNU General Public Licence

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

Существующие решения

✦ Система контроля версий (svn up / git pull / hg up)

✦ rsync (в новую директорию или «поверх»)

✦ Один файл (phar, hhbc, loop)

✦ rsync + 2 директории + realpath_root

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

Существующие решения

✦ Система контроля версий (svn up / git pull / hg up)

✦ rsync (в новую директорию или «поверх»)

✦ Один файл (phar, hhbc, loop)

✦ rsync + 2 директории + realpath_root

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

svn up

+ «Ленивый»

+ Быстрый

+ Легковесный (в случае SVN)

- Неатомарный

+/- Подходит для небольших проектов

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

Существующие решения

✦ Система контроля версий (svn up / git pull / hg up)

✦ rsync (в новую директорию или «поверх»)

✦ Один файл (phar, hhbc, loop)

✦ rsync + 2 директории + realpath_root

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

Rsync в новую директорию

+ Атомарный

-- Нагрузка по I/O (заливка нового + удаление старого)

-- Много трафика

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

Rsync в новую директорию

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

Существующие решения

✦ Система контроля версий (svn up / git pull / hg up)

✦ rsync (в новую директорию или «поверх»)

✦ Один файл (phar, hhbc, loop)

✦ rsync + 2 директории + realpath_root

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

Rsync поверх++ Отправка только изменений

- Неатомарный

- Высокий CPU% на отправляющей стороне

- Отправка и прием списка всех файлов с их stat()

- 3 мб и 1 сек CPU на 150к файлов

- 40-60 сек на 1000 серверов (24 ядра и 1 Гбит/с)

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

Существующие решения

✦ Система контроля версий (svn up / git pull / hg up)

✦ rsync (в новую директорию или «поверх»)

✦ Один файл (phar, hhbc, loop)

✦ rsync + 2 директории + realpath_root

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

Один файл++ Возможность использования uftp / bittorent

+ Простота

+ Атомарность

+ Легкость проверки целостности (md5 от одного файла)

+ Последовательная запись

- Большой объем записи

- Большая нагрузка на сеть

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

UFTP

✦ Загрузка по протоколу UDP (Multicast) + NACK

✦ Подходит для загрузки на сотни машин

✦ В наших условиях работает лучше bittorrent

✦ Open-source

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

Один файл (tar.gz)

-- Нагрузка по I/O (создание 150к файлов)

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

Один файл (phar)

+ Нативный для PHP

- Необходимость адаптировать код для работы из архива

- Нельзя поменять один файл

- OPCache сбрасывается полностью

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

Один файл (hhbc)

+/- Нативный для HHVM

+ Дополнительные оптимизации (+30% к скорости)

- Необходимость адаптировать код для работы из архива

- Запрещено использовать eval и динамические include

- Нельзя поменять один файл

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

Один файл (loop)

+ Выглядит, как обычная директория

+ Можно поменять один файл (rw mount)

-- Не совместим с docker (no dynamic mounts)

- OPCache сбрасывается полностью

- Требуется sudo для mount

- Не забывать монтировать при (ре)старте

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

Один файл (loop), docker

✦ Docker не поддерживает dynamic mounts

✦ loop монтируется динамически

✦ Пробовали понимать локальные NFS, SSHFS

✦ rsync /var/loop/<N>/ /var/www/

✦ /var/www/ — директория, прокинутая в контейнер

✦ Решение плохое, rsync не атомарный

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

Существующие решения

✦ Система контроля версий (svn up / git pull / hg up)

✦ rsync (в новую директорию или «поверх»)

✦ Один файл (phar, hhbc, loop)

✦ rsync + 2 директории + realpath_root

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

config:

Atomic deploy

current_link

dir1

dir2

define('ROOT_DIR', __DIR__);

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

Atomic deploy

current_link -> dir2

Requests:

deploy

current_link -> dir1

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

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 -

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

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

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

Rasmus-style

+ Не требуется адаптация кода

+ Не требуется reload — переиспользуется OPCache

- Требуется в 2 раза больше памяти под OPCache

- Нельзя деплоиться чаще, чем раз в max_execution_time сек

- Для Apache нужен сторонний модуль

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

План

✦ Понятие деплоя кода

✦ Старая система деплоя в Badoo

✦ Другие существующие решения

✦ Новая система — MDK

✦ Заключение

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

Требования

✦ Быстрый деплой на staging и production

✦ Атомарные патчи

✦ Скрипты могут работать несколько часов (CLI)

✦ Малое потребление ресурсов

✦ Сохранность OPCache

✦ Быстрый откат

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

Требования

✦ Быстрый деплой на staging и production

✦ Атомарные патчи

✦ Скрипты могут работать несколько часов (CLI)

✦ Малое потребление ресурсов

✦ Сохранность OPCache

✦ Быстрый откат

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

Возможные решения

✦ loop xN (-staging, -docker, -opcache)

✦ rsync xN (-production, -opcache xN)

✦ SVN xN (-production, -opcache xN)

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

Deploymove (troops) into position for military action

© https://www.youtube.com/watch?v=P2HhjHo1EQA

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

Multiversion Deployment Kit

✦ Возьмем архитектуру хранения деревьев (tree) из Git

✦ Переименуем все файлы из file.php в file.php.<version>

✦ Для скорости напишем её на Go

✦ Готово!

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

Multiversion Deployment Kit

map:array( one => f/a3f4da63, two => f/c193497a, map => d/9c134b68,)

rootdeadbeef

onea3f4da63

twoc193497a

map9c134b68

threefebe6995

four75ffdb82

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

Multiversion Deployment Kit

rootdeadbeef

onea3f4da63

twoc193497a

map9c134b68

threefebe6995

four75ffdb82

root*f7fc6872

map*21e05ae6

three*28e967c5

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

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

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

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");

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

MDK deploy protocol

1. Получаем корневой map

2.Смотрим, каких файлов не хватает

3.Запрашиваем недостающие файлы

4.Переходим к пункту 2

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

MDK deploy protocol

rootdeadbeef

onea3f4da63

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

MDK deploy protocol

rootdeadbeef

onea3f4da63

twoc193497a

tree9c134b68

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

MDK deploy protocol

rootdeadbeef

onea3f4da63

twoc193497a

tree9c134b68

threefebe6995

four75ffdb82

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

Multiversion Deployment Kit+ Быстрый атомарный деплой небольших изменений

+ Низкое потребление CPU

+ OPCache переиспользуется

+ Позволяет скриптам работать сутками

+ Легкий мониторинг

+ Быстрый откат изменений

+ Написана на Go

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

Multiversion Deployment Kit- Требуется модификация кода

- Сложная

- Требуется Garbage Collector

- Для редактирования файлов нужны спец. утилиты (mdk-vim)

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

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

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

План

✦ Понятие деплоя кода

✦ Старая система деплоя в Badoo

✦ Другие существующие решения

✦ Новая система — MDK

✦ Заключение

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

Заключение

✦ Rasmus не врет, rsync + realpath_root хорош

✦ «Лупы» тоже работают вполне неплохо

✦ Используйте то, что подходит лично вам

✦ Частый деплой + долгая работа => MDK

✦ Расскажите о своем опыте

✦ Заходите на https://tech.badoo.com/ !

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

Thank you!

Юрий Насретдинов

[email protected]