SlideShare uma empresa Scribd logo
1 de 53
Baixar para ler offline
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

Mais conteúdo relacionado

Mais procurados

Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)
Ontico
 
Web весна 2013 лекция 3
Web весна 2013 лекция 3Web весна 2013 лекция 3
Web весна 2013 лекция 3
Technopark
 
Web осень 2012 лекция 3
Web осень 2012 лекция 3Web осень 2012 лекция 3
Web осень 2012 лекция 3
Technopark
 
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Ontico
 
DNS в условиях хостинг-провайдера / Константин Новаковский (Selectel)
DNS в условиях хостинг-провайдера / Константин Новаковский (Selectel)DNS в условиях хостинг-провайдера / Константин Новаковский (Selectel)
DNS в условиях хостинг-провайдера / Константин Новаковский (Selectel)
Ontico
 
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Ontico
 
Docker & Puppet: как их скрестить и надо ли вам это?
Docker & Puppet: как их скрестить и надо ли вам это?Docker & Puppet: как их скрестить и надо ли вам это?
Docker & Puppet: как их скрестить и надо ли вам это?
Anton Turetsky
 
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Ontico
 
Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)
Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)
Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)
Ontico
 
Максим Дунин, Nginx, Inc.
Максим Дунин, Nginx, Inc.Максим Дунин, Nginx, Inc.
Максим Дунин, Nginx, Inc.
Ontico
 
Docker в работе: взгляд на использование в Badoo через год
Docker в работе: взгляд на использование в Badoo через годDocker в работе: взгляд на использование в Badoo через год
Docker в работе: взгляд на использование в Badoo через год
Badoo Development
 
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Ontico
 
SECON'2017, Клементьев Михаил, Обнаружение руткитов в GNU/Linux
SECON'2017, Клементьев Михаил, Обнаружение руткитов в GNU/LinuxSECON'2017, Клементьев Михаил, Обнаружение руткитов в GNU/Linux
SECON'2017, Клементьев Михаил, Обнаружение руткитов в GNU/Linux
SECON
 

Mais procurados (20)

Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)
 
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.
 
Web весна 2013 лекция 3
Web весна 2013 лекция 3Web весна 2013 лекция 3
Web весна 2013 лекция 3
 
Web осень 2012 лекция 3
Web осень 2012 лекция 3Web осень 2012 лекция 3
Web осень 2012 лекция 3
 
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
 
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
 
DNS в условиях хостинг-провайдера / Константин Новаковский (Selectel)
DNS в условиях хостинг-провайдера / Константин Новаковский (Selectel)DNS в условиях хостинг-провайдера / Константин Новаковский (Selectel)
DNS в условиях хостинг-провайдера / Константин Новаковский (Selectel)
 
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
 Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт... Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
 
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
 
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
 
Docker & Puppet: как их скрестить и надо ли вам это?
Docker & Puppet: как их скрестить и надо ли вам это?Docker & Puppet: как их скрестить и надо ли вам это?
Docker & Puppet: как их скрестить и надо ли вам это?
 
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
 
Внедрение Docker в процесс разработки демонов. Доклад Константина Карпова на ...
Внедрение Docker в процесс разработки демонов. Доклад Константина Карпова на ...Внедрение Docker в процесс разработки демонов. Доклад Константина Карпова на ...
Внедрение Docker в процесс разработки демонов. Доклад Константина Карпова на ...
 
Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)
Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)
Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)
 
Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...
 
Максим Дунин, Nginx, Inc.
Максим Дунин, Nginx, Inc.Максим Дунин, Nginx, Inc.
Максим Дунин, Nginx, Inc.
 
Docker в работе: взгляд на использование в Badoo через год
Docker в работе: взгляд на использование в Badoo через годDocker в работе: взгляд на использование в Badoo через год
Docker в работе: взгляд на использование в Badoo через год
 
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)
 
SECON'2017, Клементьев Михаил, Обнаружение руткитов в GNU/Linux
SECON'2017, Клементьев Михаил, Обнаружение руткитов в GNU/LinuxSECON'2017, Клементьев Михаил, Обнаружение руткитов в GNU/Linux
SECON'2017, Клементьев Михаил, Обнаружение руткитов в GNU/Linux
 
Мониторь, автоматизируй Docker
Мониторь, автоматизируй DockerМониторь, автоматизируй Docker
Мониторь, автоматизируй Docker
 

Destaque

Как мы готовим MySQL
 Как мы готовим MySQL  Как мы готовим MySQL
Как мы готовим MySQL
Badoo Development
 
Архитектура хранения и отдачи фотографий в Badoo
Архитектура хранения и отдачи фотографий в Badoo Архитектура хранения и отдачи фотографий в Badoo
Архитектура хранения и отдачи фотографий в Badoo
Badoo Development
 
Мобильный веб: назад в будущее
Мобильный веб: назад в будущееМобильный веб: назад в будущее
Мобильный веб: назад в будущее
Badoo Development
 
Технологии vs коммуникации: что важнее?
Технологии vs коммуникации: что важнее?Технологии vs коммуникации: что важнее?
Технологии vs коммуникации: что важнее?
Badoo Development
 
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo Development
 

Destaque (17)

Как мы готовим MySQL
 Как мы готовим MySQL  Как мы готовим MySQL
Как мы готовим MySQL
 
Архитектура хранения и отдачи фотографий в Badoo
Архитектура хранения и отдачи фотографий в Badoo Архитектура хранения и отдачи фотографий в Badoo
Архитектура хранения и отдачи фотографий в Badoo
 
Мобильный веб: назад в будущее
Мобильный веб: назад в будущееМобильный веб: назад в будущее
Мобильный веб: назад в будущее
 
Технологии vs коммуникации: что важнее?
Технологии vs коммуникации: что важнее?Технологии vs коммуникации: что важнее?
Технологии vs коммуникации: что важнее?
 
Багфиксинг процесса разработки в iOS: взгляд с двух сторон
Багфиксинг процесса разработки в iOS: взгляд с двух сторонБагфиксинг процесса разработки в iOS: взгляд с двух сторон
Багфиксинг процесса разработки в iOS: взгляд с двух сторон
 
Как автотесты ускоряют релизы в OK.ru
Как автотесты ускоряют релизы в OK.ruКак автотесты ускоряют релизы в OK.ru
Как автотесты ускоряют релизы в OK.ru
 
Docker в Badoo: ПМЖ или временная регистрация
Docker в Badoo: ПМЖ или временная регистрацияDocker в Badoo: ПМЖ или временная регистрация
Docker в Badoo: ПМЖ или временная регистрация
 
Git хуки на страже качества кода
Git хуки на страже качества кодаGit хуки на страже качества кода
Git хуки на страже качества кода
 
Доклад Владислава Чернова на конференции LoveQA. "Continuous delivery в крупн...
Доклад Владислава Чернова на конференции LoveQA. "Continuous delivery в крупн...Доклад Владислава Чернова на конференции LoveQA. "Continuous delivery в крупн...
Доклад Владислава Чернова на конференции LoveQA. "Continuous delivery в крупн...
 
Versioning strategy for a complex internal API
Versioning strategy for a complex internal APIVersioning strategy for a complex internal API
Versioning strategy for a complex internal API
 
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
 
Доклад Виталия Котова на конференции LoveQA. "Selenium тесты. От RC и одного ...
Доклад Виталия Котова на конференции LoveQA. "Selenium тесты. От RC и одного ...Доклад Виталия Котова на конференции LoveQA. "Selenium тесты. От RC и одного ...
Доклад Виталия Котова на конференции LoveQA. "Selenium тесты. От RC и одного ...
 
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
 
Доклад "Docker в Badoo: от восторгов к внедрению" на DevOps Meetup
Доклад "Docker в Badoo: от восторгов к внедрению" на DevOps MeetupДоклад "Docker в Badoo: от восторгов к внедрению" на DevOps Meetup
Доклад "Docker в Badoo: от восторгов к внедрению" на DevOps Meetup
 
Docker & Puppet - как их скрестить и надо ли вам это, Антон Турецкий (Badoo)
Docker & Puppet - как их скрестить и надо ли вам это, Антон Турецкий (Badoo)Docker & Puppet - как их скрестить и надо ли вам это, Антон Турецкий (Badoo)
Docker & Puppet - как их скрестить и надо ли вам это, Антон Турецкий (Badoo)
 
Docker penetration
Docker penetrationDocker penetration
Docker penetration
 
Шаблон инвестиционной презентации ver. 1.3 (ФРИИ edition)
Шаблон инвестиционной презентации ver. 1.3 (ФРИИ edition)Шаблон инвестиционной презентации ver. 1.3 (ФРИИ edition)
Шаблон инвестиционной презентации ver. 1.3 (ФРИИ edition)
 

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

Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)
Ontico
 
Компиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоКомпиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей Романенко
Fuenteovejuna
 
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
rit2011
 
Hosting for forbes.ru_
Hosting for forbes.ru_Hosting for forbes.ru_
Hosting for forbes.ru_
drupalconf
 
Управление большим количеством физических серверов, Александр Берсенев, Инст...
 Управление большим количеством физических серверов, Александр Берсенев, Инст... Управление большим количеством физических серверов, Александр Берсенев, Инст...
Управление большим количеством физических серверов, Александр Берсенев, Инст...
it-people
 

Semelhante a 5 способов деплоя PHP-кода в условиях хайлоада (20)

Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)
 
CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев
CRIU: ускорение запуска PHP в CloudLinux OS  -- Руслан КупреевCRIU: ускорение запуска PHP в CloudLinux OS  -- Руслан Купреев
CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев
 
Alex Krasheninnikov – Hadoop High Availability
Alex Krasheninnikov – Hadoop High AvailabilityAlex Krasheninnikov – Hadoop High Availability
Alex Krasheninnikov – Hadoop High Availability
 
Компиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоКомпиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей Романенко
 
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
 
Major mistakes in site moving
Major mistakes in site movingMajor mistakes in site moving
Major mistakes in site moving
 
«​Масштабируемый DevOps​» Александр Колесень
«​Масштабируемый DevOps​» Александр Колесень«​Масштабируемый DevOps​» Александр Колесень
«​Масштабируемый DevOps​» Александр Колесень
 
Масштабируемый DevOps
Масштабируемый DevOpsМасштабируемый DevOps
Масштабируемый DevOps
 
Hosting for forbes.ru_
Hosting for forbes.ru_Hosting for forbes.ru_
Hosting for forbes.ru_
 
Обзор Continuous integration инструментов
Обзор Continuous integration инструментовОбзор Continuous integration инструментов
Обзор Continuous integration инструментов
 
Видеохостинг своими руками
Видеохостинг своими рукамиВидеохостинг своими руками
Видеохостинг своими руками
 
Enter: legacy code
Enter: legacy codeEnter: legacy code
Enter: legacy code
 
Опенсорс-инструменты на страже безопасности бэкенда — Петр Волков
Опенсорс-инструменты на страже безопасности бэкенда — Петр ВолковОпенсорс-инструменты на страже безопасности бэкенда — Петр Волков
Опенсорс-инструменты на страже безопасности бэкенда — Петр Волков
 
Консольные приложения на Go
Консольные приложения на GoКонсольные приложения на Go
Консольные приложения на Go
 
Управление большим количеством физических серверов, Александр Берсенев, Инст...
 Управление большим количеством физических серверов, Александр Берсенев, Инст... Управление большим количеством физических серверов, Александр Берсенев, Инст...
Управление большим количеством физических серверов, Александр Берсенев, Инст...
 
Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»
Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»
Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»
 
DrupalCafe #1: Екатерина Маршалкина - Права на файлы Drupal в Unix-системах
DrupalCafe #1: Екатерина Маршалкина - Права на файлы Drupal в Unix-системахDrupalCafe #1: Екатерина Маршалкина - Права на файлы Drupal в Unix-системах
DrupalCafe #1: Екатерина Маршалкина - Права на файлы Drupal в Unix-системах
 
Пакетирование для Debian/Ubuntu
Пакетирование для Debian/UbuntuПакетирование для Debian/Ubuntu
Пакетирование для Debian/Ubuntu
 
Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Что нового в nginx? / Максим Дунин (Nginx, Inc.)Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Что нового в nginx? / Максим Дунин (Nginx, Inc.)
 
WWW
WWWWWW
WWW
 

Mais de Badoo Development

Mais de Badoo Development (20)

Viktar Karanevich – iOS Parallel Automation
Viktar Karanevich – iOS Parallel AutomationViktar Karanevich – iOS Parallel Automation
Viktar Karanevich – iOS Parallel Automation
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон Довгаль
 
Григорий Джанелидзе, OK.RU
Григорий Джанелидзе, OK.RUГригорий Джанелидзе, OK.RU
Григорий Джанелидзе, OK.RU
 
Андрей Сидоров, Яндекс.Браузер
Андрей Сидоров, Яндекс.БраузерАндрей Сидоров, Яндекс.Браузер
Андрей Сидоров, Яндекс.Браузер
 
Филипп Уваров, Avito
Филипп Уваров, AvitoФилипп Уваров, Avito
Филипп Уваров, Avito
 
Cocoaheads Meetup / Alex Zimin / Swift magic
Cocoaheads Meetup / Alex Zimin / Swift magicCocoaheads Meetup / Alex Zimin / Swift magic
Cocoaheads Meetup / Alex Zimin / Swift magic
 
Cocoaheads Meetup / Kateryna Trofimenko / Feature development
Cocoaheads Meetup / Kateryna Trofimenko / Feature developmentCocoaheads Meetup / Kateryna Trofimenko / Feature development
Cocoaheads Meetup / Kateryna Trofimenko / Feature development
 
Андрей Денисов – В ожидании мониторинга баз данных
Андрей Денисов – В ожидании мониторинга баз данныхАндрей Денисов – В ожидании мониторинга баз данных
Андрей Денисов – В ожидании мониторинга баз данных
 
Александр Зобнин, Grafana Labs
Александр Зобнин, Grafana LabsАлександр Зобнин, Grafana Labs
Александр Зобнин, Grafana Labs
 
Илья Аблеев – Zabbix в Badoo: реагируем быстро и качественно
Илья Аблеев – Zabbix в Badoo: реагируем быстро и качественноИлья Аблеев – Zabbix в Badoo: реагируем быстро и качественно
Илья Аблеев – Zabbix в Badoo: реагируем быстро и качественно
 
TechLeads meetup: Андрей Шелёхин, Tinkoff.ru
TechLeads meetup: Андрей Шелёхин, Tinkoff.ruTechLeads meetup: Андрей Шелёхин, Tinkoff.ru
TechLeads meetup: Андрей Шелёхин, Tinkoff.ru
 
TechLeads meetup: Алексей Рыбак, Badoo
TechLeads meetup: Алексей Рыбак, BadooTechLeads meetup: Алексей Рыбак, Badoo
TechLeads meetup: Алексей Рыбак, Badoo
 
TechLeads meetup: Евгений Потапов, ITSumma
TechLeads meetup: Евгений Потапов, ITSumma TechLeads meetup: Евгений Потапов, ITSumma
TechLeads meetup: Евгений Потапов, ITSumma
 
TechLeads meetup: Макс Лапшин, Erlyvideo
TechLeads meetup: Макс Лапшин, ErlyvideoTechLeads meetup: Макс Лапшин, Erlyvideo
TechLeads meetup: Макс Лапшин, Erlyvideo
 
Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»
Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»  Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»
Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»
 
ChromeDriver Jailbreak
ChromeDriver JailbreakChromeDriver Jailbreak
ChromeDriver Jailbreak
 
Как мы готовим MySQL
Как мы готовим MySQLКак мы готовим MySQL
Как мы готовим MySQL
 
Методология: БЭМ, Модули, Отношения
Методология: БЭМ, Модули, ОтношенияМетодология: БЭМ, Модули, Отношения
Методология: БЭМ, Модули, Отношения
 
S.O.L.I.D-ый JavaScript
S.O.L.I.D-ый JavaScriptS.O.L.I.D-ый JavaScript
S.O.L.I.D-ый JavaScript
 
Что надо знать о HTTP/2
Что надо знать о HTTP/2Что надо знать о HTTP/2
Что надо знать о HTTP/2
 

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

  • 1. 5 способов деплоя PHP-кода в условиях хайлоада Юрий Насретдинов
  • 2. ✦ Крупнейшая в мире социальная сеть для знакомства с новыми людьми ✦ 2 000 серверов с PHP ✦ 150 000 файлов объемом 900 Мб
  • 3. План ✦ Понятие деплоя кода ✦ Старая система деплоя в Badoo ✦ Другие существующие решения ✦ Новая система — MDK ✦ Заключение
  • 4. План ✦ Понятие деплоя кода ✦ Старая система деплоя в Badoo ✦ Другие существующие решения ✦ Новая система — MDK ✦ Заключение
  • 5. Deploy move (troops) into position for military action
  • 6. Процесс деплоя ✦ Получение кода из репозитория (clone / fetch / checkout) ✦ Сборка (build) ✦ Доставка на конечные сервера (deployment)
  • 7. План ✦ Понятие деплоя кода ✦ Старая система деплоя в Badoo («лупы») ✦ Другие существующие решения ✦ Новая система — MDK ✦ Заключение
  • 8. Deploy move (troops) into position 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) into position 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
  • 30. Atomic deploy current_link -> dir2 Requests: deploy current_link -> dir1
  • 31. 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 -
  • 32. 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
  • 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. Возможные решения ✦ loop xN (-staging, -docker, -opcache) ✦ rsync xN (-production, -opcache xN) ✦ SVN xN (-production, -opcache xN)
  • 38. Deploy move (troops) into position 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
  • 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
  • 48. Multiversion Deployment Kit + Быстрый атомарный деплой небольших изменений + Низкое потребление CPU + OPCache переиспользуется + Позволяет скриптам работать сутками + Легкий мониторинг + Быстрый откат изменений + Написана на Go
  • 49. Multiversion Deployment Kit - Требуется модификация кода - Сложная - Требуется Garbage Collector - Для редактирования файлов нужны спец. утилиты (mdk-vim)
  • 50. 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
  • 51. План ✦ Понятие деплоя кода ✦ Старая система деплоя в Badoo ✦ Другие существующие решения ✦ Новая система — MDK ✦ Заключение
  • 52. Заключение ✦ Rasmus не врет, rsync + realpath_root хорош ✦ «Лупы» тоже работают вполне неплохо ✦ Используйте то, что подходит лично вам ✦ Частый деплой + долгая работа => MDK ✦ Расскажите о своем опыте ✦ Заходите на https://tech.badoo.com/ !