Быстрое развёртывание шаблонов и статики в Mail.ru (Николай Кондратов)
1. Быстрое развертывание шаблонов
и статики в Mail.Ru
Кондратов Николай
Технический руководитель
почтовой службы
HighLoad++ 2010
2. О чем мы?
• система шаблонов
• организация работы верстальщиков
• процесс разработки и тестирования
• тестовая среда
• VCS
• развертывание
HighLoad++ 2010 2
3. Хорошая система работы со статикой:
• удобство и скорость в работе
• версионность и бэкап
• параллельная работа верстальщиков
• независимая разработка фич
• параллельное тестирование
• независимое внедрение фич
• быстрое развертывание на серверах
• быстрый откат
HighLoad++ 2010 3
4. Система шаблонов
• HTML-текст с командами управления
• переменные, функции, инклуды, условия, etc.
• на фронтендах – компилированные
• одни шаблоны для Perl, С, Python
<html>
##SetVars(UserName=Вася)##
<!-- IF ActiveUser -->
<h1>Привет, ##UserName##!</h1>
<!-- /IF -->
</html>
HighLoad++ 2010 4
5. Как это было: CVS
Схема репозитория Что лежит:
mail.ru/ • шаблоны
mail/ Почта • картинки
templates/
• swf
images/
• бинарные файлы
js/
css/
• etc.
my/ Мир
photo/ Фото
video/
HighLoad++ 2010 5
6. Как это было: работа верстальщика
• одна ветка в CVS HEAD vasya
• теги для версионности
petya
vasya
Проблемы
CURRENT
• сцепление версий
Feature-1
HighLoad++ 2010 6
7. Как это было: работа верстальщика
• любая раскладка – через репозиторий изменение
• боевая и тестовая раскладка – по одной
схеме cvs commit
ssh deploy
Проблемы
• долгое внесение изменений раскладка
• «мусорные» коммиты
результат
HighLoad++ 2010 7
8. Как это было: раскладка
CVS deploy upload
БД
верстальщик
Фронтенды
Мониторинг (Почта, Мир,
etc.)
HighLoad++ 2010 8
9. Как это было: минусы
• долгий процесс разработки
• шаблоны всех проектов на всех фронтендах
• долгое распространение шаблонов
HighLoad++ 2010 9
10. Как это было: минусы CVS
• размер репозитория – 2,8 Гб, 55 тыс. файлов
• медленный
• тяжелые ветки
• плохой мердж
HighLoad++ 2010 10
11. Что сделали
• перевод репозитория CVS git
• разделение репозиториев
• использование веток
• реорганизация тестового окружения
• изменение схемы работы верстальщиков
• дополнительная логика при раскладке шаблонов
Ускорение разработки. Как?
HighLoad++ 2010 11
12. Переход на git – разделение репозиториев
• разделили репозитории (статика и шаблоны)
• git с шаблонами – 600 Мб (около 16 тыс. файлов)
• git со статикой – 3.2 Гб (около 38 тыс. файлов)
Статика Шаблоны
• картинки • шаблоны
• бинарные данные • CSS
• JS
HighLoad++ 2010 12
13. Переход на git – разделение на ветки
test-branch
prerelease
• разделили на ветки:
master
• master
• prerelease
• ветки разработки
HighLoad++ 2010 13
14. Переход на git - хуки
• hooks:
• проверка синтаксиса шаблонов
• обработка шаблонов
• автоматическая раскладка
• etc.
HighLoad++ 2010 14
15. Процесс разработки
1. создаем ветку на основе master
2. вносим изменения
3. коммитим, тестируем
4. переносим изменения из ветки в prerelease
5. тестируем prerelease
6. переносим изменения из prerelease в master
7. раскладываем
HighLoad++ 2010 15
16. Общая схема (потоки данных)
d
dev.mail.ru deploy upload1 upload2
БД
верстальщик git
prerelease 1..N
Фронтенды (Почта,
Мир, etc.)
Мониторинг
HighLoad++ 2010 16
17. Общая схема (действия)
scp scp http
d
dev.mail.ru deploy upload1 upload2
БД
samba
ssh hook
http
верстальщик git
prerelease 1..N
Фронтенды (Почта,
Мир, etc.)
Мониторинг
HighLoad++ 2010 17
18. Тестовые серверы
• DOCUMENT_ROOT сервера – директория с шаблонами
• dev.mail.ru – master
• branch-1.dev.mail.ru – ветка branch-1
• виртуальные машины с общим диском
• размер каждой директории – около 200 Мб
• количество веток – около 500
• для полного хранения – 100 Гб
HighLoad++ 2010 18
19. FUSE (Filesystem on Userspace)
• храним только отличающиеся файлы
• отключаем компиляцию шаблонов
• недостающие файлы в ветке берем из master
• итоговый размер 5 Гб
mail.ru/*
branch-1.mail.ru/* FUSE
deploy/branch-1/*
HighLoad++ 2010 19
23. Проблемы
• git + windows
• длинная цепочка действий для раскладки
• принцип «сохранил – увидел»
• решение – Samba + перенос репозитория
верстальщик ssh
Вася git
/home/vasya/
samba
HighLoad++ 2010 23
24. Samba
Процесс:
1. клонирование репозитория в /home/vasya
2. редактирование через Samba
3. проверка на vasya.dev.mail.ru
4. новая ветка (на основе master)
5. push
6. раскладка по хуку на тестовый сервер
7. мердж в prerelese
8. раскладка по хуку
9. мердж в master
10.ручная раскладка на живые
HighLoad++ 2010 24
25. Раскладчик
ищем diff
• модульность
• проверка шаблонов зависимости
• различная обработка разных типов
файлов обработка
• компиляция шаблонов
компиляция
архивация
заливка по scp
HighLoad++ 2010 25
26. Раскладчик – вкусности
• условная обработка файла в зависимости от меток в нем
• JS
• сборка
• минимизация
• именование файлов
• Шаблон
• переводы строк
• перекодировка
• и любые глупости
HighLoad++ 2010 26
27. Раскладчик – пример метки
• метка в первой строке файла
• JS
• // @build
• // @build-minify
• Шаблон
• <!-- build-strip-newlines -->
HighLoad++ 2010 27
28. Мониторинг раскладки
• инкрементный номер каждой раскладки
• в БД – позиция на каждом сервере
• мониторим состояние раскладчика
• мониторим позиции на каждом сервере
deploy upload1 upload2 Фронтенды
БД Мониторинг
HighLoad++ 2010 28
29. Результаты
• упростили жизнь верстальщикам
• возможность параллельной разработки фич
• ускорение отладки и тестирования
• улучшение работы с репозиторием
HighLoad++ 2010 29
30. Но есть проблема…
• узкое место – получение архивов с шаблонами из одного источника
upload
f1 f2 f3 f1373
HighLoad++ 2010 30
31. Простое решение… шардинг
• увеличить количество отдающих серверов
upload1 ………….. uploadN
f1 f2 f(N-1) fN
HighLoad++ 2010 31
32. Хорошее решение: peer-to-peer
• с upload-сервера отдача в режиме супер-сидирования
• фронтенды обмениваются между собой
upload
f1 fN
f2 f3
HighLoad++ 2010 32