{"id":2175,"url":"\/distributions\/2175\/click?bit=1&hash=803b6e1bcbd9dfc4ba9456fda887a878c80d24df8d3a575913b14876e18923a5","title":"TJ \u0437\u0430\u043a\u0440\u043e\u0435\u0442\u0441\u044f 10 \u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f \u2014\u00a0\u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u0430\u043d\u043e\u043d\u0441 \u0441 \u0434\u0435\u0442\u0430\u043b\u044f\u043c\u0438","buttonText":"\u0427\u0438\u0442\u0430\u0442\u044c","imageUuid":"d1d355d8-93a3-5140-aeae-14b03046b760","isPaidAndBannersEnabled":false}

Как работает система раздачи картинок на TJournal

Я хочу рассказать, как мы отдаём статику (картинки) всем посетителям TJournal. И заодно протестировать новый редактор в «боевом» режиме.

С самого начала все загружаемые на TJ картинки были вынесены отдельно, чему мы много раз радовались при переезде с сервера на сервер, потому что копировать по сети гигабайты и гигабайты картинок, каждая из которых весом максимум пара сотня килобайт — то ещё мучение.

Статистика по объёму трафика на одном из серверов TJ

Сначала мы использовали Amazon S3 (старые статьи до сих пор хранят ссылки на амазоновское облако) и до сих продолжаем платить примерно $10 в месяц за хранение и трафик оставшихся там картинок. Затем, как только у Selectel появился аналогичный сервис, перешли на него, чтобы сократить стоимость и увеличить скорость загрузки.

Прошло довольно много времени, и мы успешно использовали это решение, но однажды осознали, что на оплату такого количества трафика стало уходить совершенно неприличное для стартапа количество денег (мы же не хостинг изображений).

Прикинули, куда можно переехать, чтобы было подешевле, остался один вариант — поднимать собственный сервер и раздавать картинки с него.

Наверное, где-то тут несколько наших серверов

Тогда оставалось решить только две проблемы — научить сервер принимать картинки и научить его их эффективно раздавать. Впрочем, второе — вовсе не проблема, настройка nginx для раздачи статики довольна тривиальна, главное, не забывать о клиентском кэшировании.

А вот чтобы загружать файлы на сервер, пришлось поднимать apache и настраивать там webdav. Это классический API, им пользуются, например, в Яндекс.Диске.

К сожалению, пропускная способность сервера ограничена 100 мегабитами в секунду, и в моменты пиковой нагрузки, нам стало не хватать выделенной полосы, чтобы раздать картинки всем посетителям.

Можно было докупить ещё 100 мегабит, но выгоднее оказалось арендовать сервер на распродаже (и ещё 100 мегабит в комплекте). Теперь проблема заключалась в том, чтобы загружать картинки надо было только на один сервер, а раздавать сразу с двух.

Также надо было распределить раздачу картинок равномерно между двумя серверами. В этот момент мы уже понимали, что серверов может быть и два, и три и пять. Классическим решением этой задачи является Round Robin DNS — каждому домену для статики присваивается несколько ip-адресов, каждый из которых готов обслужить запрос. DNS-сервер отдаёт клиентам эти адреса в случайном порядке, обеспечивая равномерное распределение (на каждый сервер трафик льётся пропорционально).

На помощь пришёл lsyncd и этот пост на Хабре. Lsyncd — это такая программа, которая мгновенно синхронизирует файлы между серверами. На самом деле всем понятно, что не мгновенно, поэтому надо что-то отдавать в тот момент, когда пользователь запросил картинку с сервера, который её ещё не получил. В таком случае мы заставляем этот сервер пойти и самому забрать картинку с главного.

Ещё один важный момент — количество одновременных запросов к одному домену — многие браузеры ограничиваются максимум восемью, то есть если использовать один домен для всех картинок, они будут загружаться пачками по несколько штук. Не круто.

Поэтому мы научили nginx отвечать на любой запрос к доменам типа static34.cmtt.ru, где 34 — случайное число, генерируемое при загрузке картинки. Таким образом мы заставляем браузер загружать все картинки на странице одновременно.

Сейчас посетителей TJ обслуживают три маломощных сервера (Intel Core2Duo E8400 3.0 ГГц, 6 ГБ DDR3) под кодовыми именами Джиф-1, Джиф-2 и Джиф-3.

Третий нам пришлось поднимать в авральном режиме во время одной из трансляций презентации Apple, когда хлынувший поток желающих следить за фотографиями новых айфонов превысил 300-400 мегабит.

Несколько раз к нам обращались представители различных CDN-сервисов, но услышав, что трафик в 150-250 мегабит в секунду мы обслуживаем за 8 000 рублей в месяц, они разворачивались и уходили.

#tjdev

0
65 комментариев
Написать комментарий...
Будущий теркин30см

Ничего не понял, но все равно очень круто

Ответить
Развернуть ветку
Мобильный завод

Это хорошо, что ребята не используют блобы с ключами для хранения картинок (как вконтактик), тогда бы тебе было читать ещё непонятнее )))

Ответить
Развернуть ветку
1 комментарий
Компьютерный файл

Комментарий недоступен

Ответить
Развернуть ветку
Отрицательный утюг

Комментарий недоступен

Ответить
Развернуть ветку
Традиционный корабль

Я надеюсь, что получится написать ещё несколько материалов, да.

Ответить
Развернуть ветку
3 комментария
Верхний алмаз

До прочтения статьи я был уверен, что все картинки сливаются на никитин сервер в кладовке, а по ночам он их аккуратно рассортировывает по папкам, надеясь однажды продать за большую-большую сумму денег.

Ответить
Развернуть ветку
Убежденный цветок

Комментарий недоступен

Ответить
Развернуть ветку
1 комментарий
Корпоративный Мурод

Я все понял. Все круто! Молодцы!

Сам использую схожую методику

Ответить
Развернуть ветку
Стройный спрей

Я кое-что понял, спасибо, что мы используем именно это, а не сторонние хостинги изображений.

Ответить
Развернуть ветку
Садовый кран

Почему-то представлял всё сложнее и дороже, а оказалось почти просто и дёшево.

Ответить
Развернуть ветку
Противный кавалер

А теперь понятнее:

Картинки работают и будут работать.
Покупайте подписки - и совсем заебись будет!

Конец

Ответить
Развернуть ветку
Отрицательный утюг

Комментарий недоступен

Ответить
Развернуть ветку
Одетый лолипоп

Где-то я видел такое предложение…

Ответить
Развернуть ветку
Будущий паркур

Комментарий недоступен

Ответить
Развернуть ветку
Отрицательный утюг

Комментарий недоступен

Ответить
Развернуть ветку
Киевский Влад

А зачем отдаёте xlsx? :) На сайте же вроде нигде не используется.

Ответить
Развернуть ветку
Традиционный корабль

Прайс-лист лежит на том же сервере просто https://cmtt.ru/static/VC-TJ-price.xlsx

Ответить
Развернуть ветку
3 комментария
Мобильный завод
Несколько раз к нам обращались представители различных CDN-сервисов, но услышав, что трафик в 150-250 мегабит в секунду мы обслуживаем за 8 000 рублей в месяц, они разворачивались и уходили.

Хы ))

Ответить
Развернуть ветку
Крестьянский Мурод

А какой порядок цены у этих представителей был?

Ответить
Развернуть ветку
4 комментария
Мелкий дым
где 34 — случайное число, генерируемое при загрузке картинки

А не проще было взять её из имени картинки которое и так вроде как хеш?

Ответить
Развернуть ветку
Традиционный корабль

А зачем? Мы всё равно URL храним целиком. Сгенерировали и забыли.

Ответить
Развернуть ветку
2 комментария
Надежный чайник

Комментарий недоступен

Ответить
Развернуть ветку
Традиционный корабль

Сейчас уже не вспомню, если честно. Почему-то выбор пал на apache, то ли там по отзывам реализация стабильнее, то ли доков больше.

Ответить
Развернуть ветку
Некоторые микрофон

Почему в заголовке TJournal, если вы уже какое-то время просто TJ?

Ответить
Развернуть ветку
Грузовой спрей

Илья олдскульный пацан

Ответить
Развернуть ветку
Традиционный корабль

В первую очередь — чтобы не смущать тех, кто ещё не привык. (Например, себя)

Ответить
Развернуть ветку
Религиозный томагавк_два

Комментарий недоступен

Ответить
Развернуть ветку
Традиционный корабль

Вроде как она не очень любит, когда файлы мелкие (у нас такие). Есть опыт использования в продакшене? стабильно?

Ответить
Развернуть ветку
2 комментария
Религиозный томагавк_два

Комментарий недоступен

Ответить
Развернуть ветку
Традиционный корабль

Нет, к сожалению. Часть с оплатами обособлена и протестирована, а насчёт всего остального я успокаиваю себя тем, что у нас не платежное приложение и никто не хочет ждать лишнюю неделю-две, которые придется потратить на их написание.

Ответить
Развернуть ветку
2 комментария
Серьезный пёс_анон

Комментарий недоступен

Ответить
Развернуть ветку
Традиционный корабль

Я думаю, что в полтерабайта укладываемся ещё.

Ответить
Развернуть ветку
5 комментариев
Серьезный пёс_анон

Комментарий недоступен

Ответить
Развернуть ветку
Татарский Данила

Илья, картинки и гифки из старых материалов воскреснут?
А то я волнуюсь.

Ответить
Развернуть ветку
Традиционный корабль

Неа, безвозвратно утеряны. (По причинам не связанным с описываемым в этой статье :-)

Ответить
Развернуть ветку
1 комментарий
Стеклянный меч

Комментарий недоступен

Ответить
Развернуть ветку
Электрический диод

Выскажу в техническом посте небольшое мнение о новом редакторе — вы очень плохо поступили, не предоставив из коробки там опцию загрузки изображения по его URL. Пользоваться, например, при составлении новостей теперь им неудобнее, чем раньше (пусть в офтопе и статьях он, наверняка, работает отменно).

Ответить
Развернуть ветку
Традиционный корабль

Мы обязательно добавим этот блок.

Ответить
Развернуть ветку
Мелкий дым

А картинки из ленты твиттов тоже на *.cmtt.ru хостятся. Они там навсегда остаются?

Ответить
Развернуть ветку
Традиционный корабль

Периодически они оттуда вычищаются, раз в год где-то, иногда реже.

Ответить
Развернуть ветку
1 комментарий
Читать все 65 комментариев
null