Релиз инжиниринг Mail.ru, взгляд изнутри
Глеков Максим
программист-разработчик почтовой службы
• v4
Организация работы релиз-инженеров
• Стоит ли брать что-то готовое?
• Сборка релиза
• Раздача релиза
• Демон обновлений
• Тестовые сервера
• Выкладка на бой
• Мониторинг
• Узкие места
ПОСЛЕ ЧЕГО ОТВЕЧУ НА ВСЕ ВАШИ ВОПРОСЫ И ДАМ ТЕХНИЧЕСКИЕ РЕКОМЕНДАЦИИ
О чем доклад ?
Организация работы верстальщика
Организация работы релиз-инженера
Может быть есть что-то готовое?
Что выбрать?
• Git pull на продакшне :)
Может быть есть что-то готовое?
Что выбрать?
• Git pull на продакшне :)
• Fabric (python)
Может быть есть что-то готовое?
Что выбрать?
• Git pull на продакшне :)
• Fabric (python)
• Capistrano (ruby)
Почему мы написали свою систему?
Все сложно
• Безопасность
• Быстрые фиксы багов
• Минимальные зависимости
Комманды для управления
Какие нужны и зачем?
• risk-deploy-create — создать релиз
• risk-deploy-push — положить релиз на группу серверов
• risk-deploy-switch — переключить группу серверов
• risk-deploy-clean — удалить релиз с группы серверов
Сборка релиза
Последовательность действий в раскладчике
Проверка конситентности сборки
Md5sum — то, что нам надо
• файл с контрольными суммами
• Проверка консистентности сборки: md5sum -c имя_файла_с_суммами
• «дешевый» способ» — измерение размера всей сборки
• «дешевый способ» только для мониторинга!
Тарболы практика
Где же все-таки удобнее использовать тарболы?
• Нет root-доступа
• Разные дистрибутивы Linux
• Еще хуже -— Windows
• Маленькие репозитории
• Раскладки на тестовые сервера
Тарболы практика
Где же все-таки удобнее использовать тарболы?
• Нет root-доступа
• Разные дистрибутивы Linux
• Еще хуже — Windows
• Маленькие репозитории
• Раскладки на тестовые сервера
SquashFs самое оптимальное?
SquashFs — отличное решение для выкатки боевых релизов
• Сжимающая файловая система gzip/lzma
• Применяется во встраиваемых системах
SquashFs самое оптимальное?
SquashFs — отличное решение для выкатки боевых релизов
• Сжимающая файловая система gzip/lzma
• Применяется во встраиваемых системах
• роутеры
• квадрокоптеры
• холодильники
• кофеварки
SquashFs самое оптимальное?
SquashFs — отличное решение для выкатки боевых релизов
• Сжимающая файловая система gzip/lzma
• Применяется во встраиваемых системах
• роутеры
• кофеварки
• холодильники
• квадрокоптеры
• Просто собрать: mksquashfs data_dir sqsh_file_path.sqsh
SquashFs самое оптимальное?
SquashFs — минусы
• Одна и та же версия SquashFs
• Одно и то же сжатие gzip или lzma
• Для монтирования требуются root-права
Почему не RPM + puppet?
RPM или DEB — неплохое решение
• Требуется писать spec файлы
• Просто собирать: rpmbuild -bb имя_спеки
• Все фаилы в одном пакете
• Не засоряет систему
• RPM → DEB с помощью alien
Почему не RPM + puppet?
RPM или DEB — минусы
• Для установки требуются root-права
• Нужно привлекать админа
• Проблемы с накати/откати в выходной/ночью
Что выбрали мы?
Вроде бы все очевидно....
• Мы катим в среднем 3 раза в день
• Для выкатки пакуем все файлы
• Тарболы только для тестовых серверов
• В продакшне SquashFS
• RPM на проектах с редкими выкатками (Ответы@Mail.ru,
Календарь@Mail.ru)
Схема обновления обновлений дифами
Плохой вариант для production
• Выкатки не консистентны
• Откатиться полноценно назад трудно
• Непонятно чем закончится исправление ошибки
• Подходит только для тестовых серверов
Раздача релиза
Хранилище релизов
Раздача релиза
Сущности внутри репозитория
• Кикстарт — файл с текущей сборкой
• deploy_files.list — файл со списком сборок
Раздача релиза
Выкладываем на группу серверов в тест
• risk-deploy-push -b alphatest -f e.mail.ru-f-alpha-505-en-m.glekov-1427105421
Раздача релиза
Выкладываем на группу серверов в тест
Раздача релиза
Схема раздачи
Раздача релиза
Но есть проблема....
• Узкое место — получение обновлений с одного источника
Раздача релиза
Простое решение - шардинг
• Увеличить количество раздающих серверов
Устройство демона обновлений
Get risk — так называется наш демон обновлений
Статика (js,css, images, etc)
Шаблоны отдельно, статика отдельно — надо делать две отдельные
сборки!
Выкладка релиза на тестовые серверы
Тестовые серверы, плавающий DOCUMENT_ROOT
• DOCUMENT_ROOT сервера — директория с шаблонами
• На серверах, где нет веток, DOCUMENT_ROOT один
• На серверах с ветками каждая ветка — новый DOCUMENT_ROOT
• Переключение DOCUMENT_ROOT в backend регулярным выражением
Выкладка релиза на тестовые серверы
FUSE (Filesystem on Userspace) для веток
• Храним только различающиеся файлы
• Недостающие файлы берем из корневой ветки
Выкладка релиза на тестовые серверы
FUSE для веток
Выкладка релиза на тестовые серверы
FUSE для веток
Выкладка релиза на тестовые серверы
FUSE для веток
Выкладка релиза на тестовые серверы
FUSE для веток
Хочу себе FUSE!
Что можно найти в открытом доступе?
• MergeFS (http://bersace03.free.fr/mergefs/mergefs)
• UnionFS (http://unionfs.filesystems.org/)
• Aufs (http://aufs.sourceforge.net/)
• Mhddfs (http://mhddfs.uvw.ru/)
Выкладываем в продакшн
Выкладываем билд, который прошел через тестовые сервера
1. Раскладываем сборку по серверам:
risk-deploy-push -b production -f e.mail.ru-f-alpha-505-en-m.glekov-1427105421
2. Переключаемся на разложенную сборку:
risk-deploy-switch -b production -f e.mail.ru-f-alpha-505-en-m.glekov-1427105421
Мониторинг
Get Risk Network Monitoring или просто grnmon ;)
Мониторинг
Get Risk Network Monitoring
Мониторинг
Get Risk Network Monitoring
Как устроен мониторинг
Get Risk Network Monitoring
• Как работает мониторинг?
• Демон grnmon — принимает данные с серверов
• MySQL — хранение данных для старта
• Memcached — чтобы не мучить базу
• Fcgi — отдача jsonp из Memcached
• JavaScript — отображение данных
Переключаем сервера между билдами
Накати — первый этап
• risk-deploy-switch -b alphatest -f e.mail.ru-f-alpha-505-en-m.glekov-1427105421
• Время переключения между билдами от 2-5 секунд (!!!!)
Дашборд
Или как мы понимаем, что все хорошо
Что-то пошло не так....
Быстрый откат в случае неудачи
Сколько времени надо, чтобы откатиться?
• Не более 2-5 сек (!!!)
• Переключаемся обратно на прошлый стабильный билд
• Снова смотрим в дашборд
Запуск тестов
Несколько советов
Узкие места, проблемы и методы их решения
Есть некоторые нюансы...
• При работе с большими тарболами(> 100 MB) надо использовать pv для
затормаживания диска (Ex: cat filename | pv -L limit_rate_speed -rt | tar -xmzf -
-C folder_full_path)
• Все операции должны быть атомарные
• Шардинг серверов с обновлениями
• Не пользоваться базой данных в демоне обновления
СПАСИБО ЗА ВНИМАНИЕ!
Вопросы?
m.glekov@corp.mail.ru

Релиз инжиниринг Mail.ru, взгляд изнутри / Максим Глеков (Mail.Ru Group)