![Page 1: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку](https://reader035.vdocuments.pub/reader035/viewer/2022062408/56813b7e550346895da49e66/html5/thumbnails/1.jpg)
От стартапа до highload: Эволюция веб-проекта, или
Как победить нагрузку Антон Терехов
Ведущий инженер - программист отдела фотосервисов ООО "Медиа Мир" (РБК)
![Page 2: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку](https://reader035.vdocuments.pub/reader035/viewer/2022062408/56813b7e550346895da49e66/html5/thumbnails/2.jpg)
PhotoFile. Начало.
• Проект получен в 2005 году• Проект состоял из 2-х серверов: www + DB,
fileserver• Количество записей в БД:
– Пользователи: ~80 000– Альбомы: ~290 000– Фото: ~6 500 000
• Нагрузка: хиты ~2 000 000 хосты: ~55 000• Файловый сервер заполнен на 3/4• Что делать?
![Page 3: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку](https://reader035.vdocuments.pub/reader035/viewer/2022062408/56813b7e550346895da49e66/html5/thumbnails/3.jpg)
PhotoFile. Начало.
Улучшили, то, что можно улучшить быстро:• Вынос DB на отдельный сервер• Регистрация пользователей на новом fileserver’е• Включение Smarty caching• И, конечно же, начали делать версию 2
![Page 4: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку](https://reader035.vdocuments.pub/reader035/viewer/2022062408/56813b7e550346895da49e66/html5/thumbnails/4.jpg)
Новый движок
• Это – фотохостинг. Мы не меняем URL изображения.(Только если пользователь сам не сделает что-то с фото) URL вида photofile.ru/photo/userlogin/albumid/photoid.jpg
• ЧПУ – залог удобства ресурса photofile.ru/users/userlogin/…
• Все фото пользователя хранятся на 1 сервере, что исключает работы по переносу файлов между машинами
• При отказе сервера внешние ссылки не изменяются• nginx разпределяет запросы к fileserver’ам (regexp)• Появляется отдельный proxy-server
![Page 5: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку](https://reader035.vdocuments.pub/reader035/viewer/2022062408/56813b7e550346895da49e66/html5/thumbnails/5.jpg)
Реклама – зло!
• HTTP 1.1 500 Нагрузка растет• Введение MySQL Master-Slaves• Код не готов - введение отдельного сервера для
авторизованных пользователей http://a.photofile.ru/– Временное неправильное решение– Нет отказоустойчивости– Разные ссылки для авторизованного и анонимного
пользователей+ Но зато оно работает!
![Page 6: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку](https://reader035.vdocuments.pub/reader035/viewer/2022062408/56813b7e550346895da49e66/html5/thumbnails/6.jpg)
Новый движок. Часть 2.• Старые URL фото вида
ff01.photofile.ru/photo/056/290/1239173/128169725442ea9efd115a.jpg
• Новые URL фото вида photofile.ru/photo/UserLogin/AlbumID/Photo.jpg+ Уменьшается количество полей в таблице+ Упрощение ссылок+ Более четкая дисковая структура
photo/U/Us/UserLogin/+ Мы можем выделить на подмножество пользователей
(Us) отдельный fileserver!– URL фото в альбоме можно подобрать (Bruteforce). Нужна
новая система паролирования альбомов. ngnix: X-Accel-Redirect и md5(то, что меняется между клиентами)
![Page 7: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку](https://reader035.vdocuments.pub/reader035/viewer/2022062408/56813b7e550346895da49e66/html5/thumbnails/7.jpg)
Проблемы с версией 2(которые можно было
предусмотреть)• Smarty cache – «неидеальное» решение для нескольких frontends + fileservers– Некогерентен– Невозможно удаление «по событию»– NFS на файлы Smarty cache является SPOF (и не
используется)
• БД «не держит» нагрузку – Слишком большая таблица альбомов– Слишком много сортировок и условий+ Таблица типа MRG + Cron script
(album_new – за последние 2 месяца, album_old – все остальные)
![Page 8: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку](https://reader035.vdocuments.pub/reader035/viewer/2022062408/56813b7e550346895da49e66/html5/thumbnails/8.jpg)
These Aren't the Droids You're looking For
• «Старые» ссылки на файлы при переносе = symlinks
• «Старые» ссылки на страницы и файлы = денормализованные таблицы + «правильные» индексы
• При кажущейся непервоочередности проблемы – пользователи не почувствовали себя «лишними»
![Page 9: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку](https://reader035.vdocuments.pub/reader035/viewer/2022062408/56813b7e550346895da49e66/html5/thumbnails/9.jpg)
Что делать?
• Cache Smarty не эффективен• Очевидное решение – memcached
– Данные не связаны между собой– Не гарантирует хранение
• Необходим дополнительный уровень абстракции - метаданные
![Page 10: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку](https://reader035.vdocuments.pub/reader035/viewer/2022062408/56813b7e550346895da49e66/html5/thumbnails/10.jpg)
Memcached with METAinformation
+ Реализация SQL limit+ Уменьшение данных
для сериализации+ Единовременное
устаревание коллекции данных
+ Самостоятельная обработка устаревания
− Дополнительные операции get/set
![Page 11: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку](https://reader035.vdocuments.pub/reader035/viewer/2022062408/56813b7e550346895da49e66/html5/thumbnails/11.jpg)
Файловые транзакции
• Выросший объем файлов в альбоме• Необходимы real-time операции• Обернем каждую файловую операцию в
транзакцию (SQL и диск)• Сократим дисковые операции путем введения
флага «удален»• nginx: set $flag /...../.deleted
if ( -f $flag ) {return 404;
}
![Page 12: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку](https://reader035.vdocuments.pub/reader035/viewer/2022062408/56813b7e550346895da49e66/html5/thumbnails/12.jpg)
Предел MySQL Master-Slaves
• Данных меньше не становится• Эффективное количество Slaves конечно• Решение – разделить данные на несколько порций
– Управляющая часть (список пользователей, сессии)– Данные пользователя (альбомы, фотографии)– Общие данные (форум, конкурсы)– Справочники (пункты печати)
• Вопросы:– Как сохранить существующий формат ID– Как организовать Autoincrement– Балансировка нагрузки
![Page 13: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку](https://reader035.vdocuments.pub/reader035/viewer/2022062408/56813b7e550346895da49e66/html5/thumbnails/13.jpg)
Сквозой autoincrement по нескольким mysqld
4 294 967 295 :напримерM = 50 частей, по 85 899 34520 INSERT/секЗаполнение части: 49 дней
![Page 14: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку](https://reader035.vdocuments.pub/reader035/viewer/2022062408/56813b7e550346895da49e66/html5/thumbnails/14.jpg)
Работа с разделенными данными
• На каждую порцию данных есть 2 Slaves
• При подключении указываем режим работы R или RW
• Балансировка путем анализа нагрузки и размещения на сервере нескольких баз или же демонов (разные порты, репликация)
![Page 15: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку](https://reader035.vdocuments.pub/reader035/viewer/2022062408/56813b7e550346895da49e66/html5/thumbnails/15.jpg)
Распределение файлов по серверам
• Более 40 fileservers x 1.4Tb• REGEXP слишком сложен• Часть данных превышает 1.4Tb• Dynamic DNS – наш выбор• Nginx.conf: resolver 127.0.0.1;
resolver_timeout 1s; … set $username $1;
proxy_pass http://$username.photofile$request_uri;
![Page 16: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку](https://reader035.vdocuments.pub/reader035/viewer/2022062408/56813b7e550346895da49e66/html5/thumbnails/16.jpg)
Photofile в цифрах и фактах
Сервера:Proxy: 2www (php): 7MySQL: 13Fileserver 55Backup 55Прочие 3
Итого: 135
Посещаемость:Хиты: 4 500 000Хосты: 200 000
В базе:Пользователей: 1 000 000Альбомов: 2 100 000Фото: 70 000 000
![Page 17: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку](https://reader035.vdocuments.pub/reader035/viewer/2022062408/56813b7e550346895da49e66/html5/thumbnails/17.jpg)
Вместо итогов
• Что еще используется:– CARP – разделение IP
для резервного проксирования
– mod_accel – для кеширования частых URL
– nginx кеширует популярные фото
– MySQL Master-Slaves для разделения запросов на «запись-чтение»
– Cron & rsync – для генерации статического контента
• Что планируется:– Ввод дополнитетельных
файлов-флагов «запаролен», «защищен»
– Переработка отдачи картинок (вынос preview на отдельные сервера)
![Page 18: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку](https://reader035.vdocuments.pub/reader035/viewer/2022062408/56813b7e550346895da49e66/html5/thumbnails/18.jpg)
![Page 19: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку](https://reader035.vdocuments.pub/reader035/viewer/2022062408/56813b7e550346895da49e66/html5/thumbnails/19.jpg)
+ 55 fileservers, +55 backup
![Page 20: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку](https://reader035.vdocuments.pub/reader035/viewer/2022062408/56813b7e550346895da49e66/html5/thumbnails/20.jpg)
От стартапа до highload: Эволюция веб-проекта, или
Как победить нагрузку
Антон Терехов, ведущий инженер-программист[email protected]
Вопросы?