
Мы уже рассказали вам о хранилище Avito, картинках, медиапикере, но главный вопрос так и оставался нераскрытым: какая она, архитектура платформы, из каких компонентов состоит и какой стек использует. Вы просили рассказать об аппаратной составляющей Avito, используемой системе виртуализации, СХД и так далее — ну что же, отвечаем.
Аппаратная часть
Долгое время наши серверы стояли в датацентре Basefarm в Швеции, но в январе-феврале прошлого года мы справились с масштабной задачей по переезду в московский датацентр Dataspace. Про миграцию, если это будет интересно, расскажу в отдельной статье (про перенос базы мы уже рассказывали на Highload 2016).
Переезд был вызван несколькими причинами. Во-первых, нашумевшим законом №242-ФЗ о хранении персональных данных граждан РФ. Во-вторых, мы получили больше контроля над своим железом — не всегда расторопные работники шведского датацентра могли выполнять простейшие заявки по несколько дней; здесь же персонал делает всё быстро, да и в любом случае мы всегда можем лично приехать в ДЦ и поучаствовать в решении возникших проблем.
Серверы
Серверы разделены на несколько функциональных групп, в каждой группе своя конфигурация железа. Например, серверы для PHP-бекэнда выполняют также роль первого уровня хранилища картинок (про картинки подробнее ниже), на них немного оперативной памяти, небольшие диски, но производительные процессоры. На серверах для Redis-кластера, наоборот, много оперативной памяти, а процессоры не такие мощные, и так далее. Такие специфические конфигурации позволили нам заметно снизить стоимость серверов по сравнению с тем, что было раньше, когда многие серверы были универсальной конфигурации, и какие-то ресурсы в них всегда были не утилизированы.
Сеть
Наша сеть построена по классической двухуровневой схеме: ядро плюс уровень доступа. Для отказоустойчивости каждый коммутатор уровня доступа подключается по оптике к двум разным корневым коммутаторам; поверх этих двух линков делается LACP-линк (один виртуальный линк поверх нескольких физических, позволяет полностью утилизировать все физические линки и добавляет устойчивость к отказу физических линков).
Программная часть
Виртуализация
Аппаратная виртуализация как таковая у нас не используется, а вот виртуализация на уровне операционной системы (aka контейнеры) — очень даже. В основном это LXC (когда-то давно использовалась OpenVZ), но сейчас мы с интересом смотрим на Docker (с Kubernetes) и потихоньку перебираемся на него, а новые микросервисы запускаем сразу в кластере Kubernetes.
О том, как мы используем Kubernetes, мы рассказывали на профильном митапе и Codefest 2017:
- “Kubernetes в Avito” — Евгений Ольков (Kubernetes meetup, 2017)
- “Helm: пакетный менеджер для Kubernetes” — Сергей Орлов (Kubernetes meetup, 2017)
- “Kubernetes как платформа для микросервисов” — Сергей Орлов и Михаил Прокопчук (Codefest, 2017)
Хранилище картинок
История хранилища картинок подробно описана в статье. Сейчас оно имеет двухуровневую структуру: первый уровень — маленькие картинки (те, что используются в поисковой выдаче и, соответственно, часто запрашиваются; разрешением до 640x640) плюс кэш больших картинок, второй уровень — большие картинки, которые доступны только из карточки объявления. Прямого доступа извне к серверам второго уровня нет, всё проходит через первый уровень (и таким образом оседает в кэше). Ввиду разного профиля нагрузки на разные уровни, конфигурация и количество серверов в каждом уровне также различаются: на первом уровне много серверов с дисками небольшого объёма, а на втором уровне немного (~ в пять раз меньше) серверов с дисками большого объёма.
Все необходимые разрешения картинок генерируются на бэкэнде при загрузке. Картинки некоторых непопулярных размеров не хранятся на серверах, а генерируются nginx’ом на лету. Аналогично с ватермарками: для большинства разрешений они накладываются бекэндом сразу же, но некоторые разрешения мы отдаём партнёрам без ватермарок (а на сайт — с ватермарками), поэтому они накладываются nginx’ом на лету.

Если вдаваться в подробности, то у нас есть по 100 виртуальных картиночных нод первого и второго уровня, которые равномерно раскиданы по физическим серверам соответствующих уровней. Привязка виртуальных нод к физическим регулируется с помощью CNAME-записей в DNS и, в случае с первым уровнем, внешних IP на серверах.
Для снижения нагрузки на наши серверы и экономии трафика и электроэнергии мы используем CDN, однако наша платформа обладает достаточными ресурсами для того, чтобы работать самостоятельно, и мы не завязаны на конкретном провайдере.
Устройство платформы
Входящий трафик балансируется на разных уровнях: L3, L4, L7.
Внутреннее устройство платформы можно описать как “находится в процессе перехода с монолита на микросервисы”. Функциональность поделена на куски, которые мы называем “сервисами” — это ещё не микросервисы, но уже не монолит.
Устройство сервиса типовое: фронтенд на nginx, бекэнд — собственно сервис, и некоторый набор прокси до всех необходимых источников данных — БД, кэшей, других сервисов.

Некоторые подробности об используемых прокси можно узнать из моего выступления на Highload Junior 2016.
Заключение
Часто от высоконагруженных проектов ждут сложной архитектуры, пятиэтажных решений, требующих непрерывной поддержки. Это неправильно — чем сложнее система, тем больше неприятностей может породить самый незначительный баг. Поэтому мы за простоту. Мы придерживаемся принципа KISS, не плодим сущности и не усложняем то, что должно быть простым — и в разработке, и в поддержке, и в администрировании.
Такое устройство платформы позволяет нам легко её масштабировать, а значит избегать множества проблем. Сейчас мы находимся в переходном
Комментарии (33)
gxcreator
08.06.2017 15:07+6Ребят, сделайте уже фильтрацию по цене, ну.
Ded_Keygen
08.06.2017 15:26+1Неистово плюсую, фильтр по цене один из самых основных должен быть — а его нет.
tiandrey
08.06.2017 15:35+10Будет человеческий фильтр по цене, будет. Мы работаем над этим.
А прямо сейчас можно добавить в URL параметры pmin=минцена и pmax=максцена, и фильтрация по цене таки будет работать.SuperKozel
08.06.2017 21:52вам очень нужно улучшить интерфейс выбора города и метро
1. Поиск по станциям метро не запоминается. Очень НЕудобно каждый раз тыкать по карте метро 10 подходящих тебе станций
2. Выбор города. Опять не запоминается. Я живу в Троицке и каждый раз мне нужно:
нажать на поле «Город»
нажать выбрать другой
выбрать регион московская область
из списка выбрать Троицк
Почему нельзя просто сделать поиск по autocomplete + запоминать выбор города?
3.В приложении тоже поиск по метро адский ад. Уже не помню, но я плевался во все стороны
Нельзя в 2207 с таких не юзер-френдли интерфейсом
dikkini
08.06.2017 16:47+1Фильтрация по цене есть в мобильном приложении, разве нет?
gxcreator
09.06.2017 00:05+1Думаете это нормально, когда в каталоге товаров есть фильтрация по стоимости только в мобильной версии?
Как по мне, это основной функционал и должен быть везде.dikkini
09.06.2017 16:38Редко пользуюсь декстопным вариантом. Все ранво нужен телефон чтобы звонить, а звонить из приложения одно удовольствие
easy_john
16.06.2017 17:44Да, но при этом там нет линейного и табличного списка товаров. И так плохо, и так плохо.
mammuthus
08.06.2017 17:05+1Как ни зайду на Авито — постоянно отваливается чат (просто крутится колесо загрузки и ничего не происходит).
Что-нибудь с этим будете делать?SamDark
09.06.2017 10:59У меня тоже. Оказалось, косячит DNS у провайдера (или ещё на каком-то уровне). Только через VPN нормально работает.
Londoner
08.06.2017 18:56+5Дорогое Авито, перестаньте, пожалуйста, банить зарубежные IP-адреса просто потому, что вашим админам так проще бороться со спамом. За пределами России проживает, как минимум, 30 миллионов россиян. Из них, скорее всего, 10% сдают квартиру на родине. Зачем вы решили избавиться от 3 миллионов наиболее платёжеспособных клиентов и их объявлений?
evr1ka
09.06.2017 10:56присоедиюсь. Искал дом, находясь в Казахстане (логично же, чтобы что-то купить, надо сначала поискать, чтобы на месте время не терять)… Так те на — не покажем вам телефонов. Пришлось людей в России смотреть ссылки которые нужны.
Да и в целом все направленно на то, чтобы покупатель не мог ни найти нужную информацию, ни данные посмотреть для связи. Поэтому предпочитаю другие сайты с объявлениями.Londoner
09.06.2017 10:58+1Поэтому предпочитаю другие сайты с объявлениями.
Какие именно? Давайте соберём здесь список.dernasherbrezon
09.06.2017 13:15Не очень большой список получился? Я вот запилил свой авито… но проблема с такими сервисами в том, что люди туда ходят не потому что у сайтов хороший интерфейс. А потому что там есть другие люди. А чтобы они там появились нужны рекламные бюджеты сопоставимые с авито.
ecto
08.06.2017 23:50tiandrey Расскажите. пожалуйста, про железные мощности подробнее.
Сколько физических серверов под что используется.
Под картинки, под базы, редис, ребит, под кубернетис облако, балансеры и т.д.tiandrey
09.06.2017 12:40Кстати, какие-то цифры были в первой статье про историю картиночного хранилища.
antonksa
09.06.2017 06:23+3великолепный псто обо всем и конкретно ни о чем.
у вас php, python и go? — м-м, неожиданно.
вы начали внедрять docker? — ничоси…
ну а как вы накладываете ватермарки — ну ващеее.
Это серьезно?этот бред можно пулять на хабр, только потому что вы авито? Устройство сайта, адаптированное для младших начальных классов?
Где хардкор? Где применяемые хаки, БД, боль борьбы с нагрузкой, секреты балансировки? И главный вопрос — нахрена я это прочитал?
tiandrey
09.06.2017 12:34+1Я бы рад назвать конкретные цифры, показать полные схемы устройства платформы и так далее, но, увы, есть такая вещь, как NDA. В изначальном варианте статья была раза в два больше, но после выпиливания всего, что нельзя выпускать в открытый доступ, получилось вот это вот — обо всём и ни о чём, меня это тоже печалит.
Всё, что можно рассказать, мы рассказываем на разных конференциях и митапах, в статье не просто так ссылки приведены. Про хитрости балансировки, например, я рассказывал на HL Junior 2016 (отдельно слайды без моей рожи тут).
Если хочется узнать больше — приходите к нам работать :)
AslanKurbanov
09.06.2017 09:57+1Классный рукописный шрифт на последней картинке! Название не подскажите?
podarok
09.06.2017 12:48Вы б хоть капельку внимания фронтенду уделили. У вас не просто неудобный сайт, а почти бесполезный для части юзеров. Несколько раз за последние 5 лет пытался воспользоваться. Каждый раз уходил, матерясь. Попробуйте что-нибудь найти в Зеленограде, например.
easy_john
16.06.2017 17:43Поддерживаю товарища.
Каталог товаров — самый крупный, а удобство работы с ним — самое худшее.
gaploid
09.06.2017 13:45А подскажите, стоимость хостинга и трафика снизилась или увеличилась, хотя бы в процентах.
jtpro
10.06.2017 22:34как уже писали выше, тп часто банально игнорит дельные предложения от людей, которые постоянно пользуются авито как инструментом
поэтому спрошу тут: почему нельзя запилить решение для такого кейса: живу в областном городе, выставил товар — нет платежеспособного спроса, хочу сменить город (место продажи) на областной центр, в котором так же бываю
нет, боль, удаляю объявление в своем городе, жду пару дней, ставлю объяву в областном центре
KorP
Так а какие СХД то используете? Или может SDS?
tiandrey
Мы не используем специализированные решения чисто для хранения данных. Ближе всего к СХД наши картиночные сервера.