20
От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку Антон Терехов Ведущий инженер - программист отдела фотосервисов ООО "Медиа Мир" (РБК)

От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку

  • Upload
    brina

  • View
    51

  • Download
    8

Embed Size (px)

DESCRIPTION

От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку. Антон Терехов Ведущий инженер - программист отдела фотосервисов ООО "Медиа Мир" (РБК). PhotoFile. Начало. Проект получен в 2005 году Проект состоял из 2-х серверов: www + DB, fileserver Количество записей в БД: - PowerPoint PPT Presentation

Citation preview

Page 1: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку

От стартапа до highload: Эволюция веб-проекта, или

Как победить нагрузку Антон Терехов

Ведущий инженер - программист отдела фотосервисов ООО "Медиа Мир" (РБК)

Page 2: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку

PhotoFile. Начало.

• Проект получен в 2005 году• Проект состоял из 2-х серверов: www + DB,

fileserver• Количество записей в БД:

– Пользователи: ~80 000– Альбомы: ~290 000– Фото: ~6 500 000

• Нагрузка: хиты ~2 000 000 хосты: ~55 000• Файловый сервер заполнен на 3/4• Что делать?

Page 3: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку

PhotoFile. Начало.

Улучшили, то, что можно улучшить быстро:• Вынос DB на отдельный сервер• Регистрация пользователей на новом fileserver’е• Включение Smarty caching• И, конечно же, начали делать версию 2

Page 4: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку

Новый движок

• Это – фотохостинг. Мы не меняем URL изображения.(Только если пользователь сам не сделает что-то с фото) URL вида photofile.ru/photo/userlogin/albumid/photoid.jpg

• ЧПУ – залог удобства ресурса photofile.ru/users/userlogin/…

• Все фото пользователя хранятся на 1 сервере, что исключает работы по переносу файлов между машинами

• При отказе сервера внешние ссылки не изменяются• nginx разпределяет запросы к fileserver’ам (regexp)• Появляется отдельный proxy-server

Page 5: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку

Реклама – зло!

• HTTP 1.1 500 Нагрузка растет• Введение MySQL Master-Slaves• Код не готов - введение отдельного сервера для

авторизованных пользователей http://a.photofile.ru/– Временное неправильное решение– Нет отказоустойчивости– Разные ссылки для авторизованного и анонимного

пользователей+ Но зато оно работает!

Page 6: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку

Новый движок. Часть 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: Эволюция веб-проекта, или Как победить нагрузку

Проблемы с версией 2(которые можно было

предусмотреть)• Smarty cache – «неидеальное» решение для нескольких frontends + fileservers– Некогерентен– Невозможно удаление «по событию»– NFS на файлы Smarty cache является SPOF (и не

используется)

• БД «не держит» нагрузку – Слишком большая таблица альбомов– Слишком много сортировок и условий+ Таблица типа MRG + Cron script

(album_new – за последние 2 месяца, album_old – все остальные)

Page 8: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку

These Aren't the Droids You're looking For

• «Старые» ссылки на файлы при переносе = symlinks

• «Старые» ссылки на страницы и файлы = денормализованные таблицы + «правильные» индексы

• При кажущейся непервоочередности проблемы – пользователи не почувствовали себя «лишними»

Page 9: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку

Что делать?

• Cache Smarty не эффективен• Очевидное решение – memcached

– Данные не связаны между собой– Не гарантирует хранение

• Необходим дополнительный уровень абстракции - метаданные

Page 10: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку

Memcached with METAinformation

+ Реализация SQL limit+ Уменьшение данных

для сериализации+ Единовременное

устаревание коллекции данных

+ Самостоятельная обработка устаревания

− Дополнительные операции get/set

Page 11: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку

Файловые транзакции

• Выросший объем файлов в альбоме• Необходимы real-time операции• Обернем каждую файловую операцию в

транзакцию (SQL и диск)• Сократим дисковые операции путем введения

флага «удален»• nginx: set $flag /...../.deleted

if ( -f $flag ) {return 404;

}

Page 12: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку

Предел MySQL Master-Slaves

• Данных меньше не становится• Эффективное количество Slaves конечно• Решение – разделить данные на несколько порций

– Управляющая часть (список пользователей, сессии)– Данные пользователя (альбомы, фотографии)– Общие данные (форум, конкурсы)– Справочники (пункты печати)

• Вопросы:– Как сохранить существующий формат ID– Как организовать Autoincrement– Балансировка нагрузки

Page 13: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку

Сквозой autoincrement по нескольким mysqld

4 294 967 295 :напримерM = 50 частей, по 85 899 34520 INSERT/секЗаполнение части: 49 дней

Page 14: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку

Работа с разделенными данными

• На каждую порцию данных есть 2 Slaves

• При подключении указываем режим работы R или RW

• Балансировка путем анализа нагрузки и размещения на сервере нескольких баз или же демонов (разные порты, репликация)

Page 15: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку

Распределение файлов по серверам

• Более 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: Эволюция веб-проекта, или Как победить нагрузку

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: Эволюция веб-проекта, или Как победить нагрузку

Вместо итогов

• Что еще используется:– CARP – разделение IP

для резервного проксирования

– mod_accel – для кеширования частых URL

– nginx кеширует популярные фото

– MySQL Master-Slaves для разделения запросов на «запись-чтение»

– Cron & rsync – для генерации статического контента

• Что планируется:– Ввод дополнитетельных

файлов-флагов «запаролен», «защищен»

– Переработка отдачи картинок (вынос preview на отдельные сервера)

Page 18: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку
Page 19: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку

+ 55 fileservers, +55 backup

Page 20: От стартапа до highload: Эволюция веб-проекта, или Как победить нагрузку

От стартапа до highload: Эволюция веб-проекта, или

Как победить нагрузку

Антон Терехов, ведущий инженер-программист[email protected]

Вопросы?