8 июня в 13:20

Путешествие внутрь Avito: платформа

image

Мы уже рассказали вам о хранилище Avito, картинках, медиапикере, но главный вопрос так и оставался нераскрытым: какая она, архитектура платформы, из каких компонентов состоит и какой стек использует. Вы просили рассказать об аппаратной составляющей Avito, используемой системе виртуализации, СХД и так далее — ну что же, отвечаем.

Аппаратная часть


Долгое время наши серверы стояли в датацентре Basefarm в Швеции, но в январе-феврале прошлого года мы справились с масштабной задачей по переезду в московский датацентр Dataspace. Про миграцию, если это будет интересно, расскажу в отдельной статье (про перенос базы мы уже рассказывали на Highload 2016).

Переезд был вызван несколькими причинами. Во-первых, нашумевшим законом №242-ФЗ о хранении персональных данных граждан РФ. Во-вторых, мы получили больше контроля над своим железом — не всегда расторопные работники шведского датацентра могли выполнять простейшие заявки по несколько дней; здесь же персонал делает всё быстро, да и в любом случае мы всегда можем лично приехать в ДЦ и поучаствовать в решении возникших проблем.

Серверы


Серверы разделены на несколько функциональных групп, в каждой группе своя конфигурация железа. Например, серверы для PHP-бекэнда выполняют также роль первого уровня хранилища картинок (про картинки подробнее ниже), на них немного оперативной памяти, небольшие диски, но производительные процессоры. На серверах для Redis-кластера, наоборот, много оперативной памяти, а процессоры не такие мощные, и так далее. Такие специфические конфигурации позволили нам заметно снизить стоимость серверов по сравнению с тем, что было раньше, когда многие серверы были универсальной конфигурации, и какие-то ресурсы в них всегда были не утилизированы.

Сеть


Наша сеть построена по классической двухуровневой схеме: ядро плюс уровень доступа. Для отказоустойчивости каждый коммутатор уровня доступа подключается по оптике к двум разным корневым коммутаторам; поверх этих двух линков делается LACP-линк (один виртуальный линк поверх нескольких физических, позволяет полностью утилизировать все физические линки и добавляет устойчивость к отказу физических линков).

Программная часть


Виртуализация


Аппаратная виртуализация как таковая у нас не используется, а вот виртуализация на уровне операционной системы (aka контейнеры) — очень даже. В основном это LXC (когда-то давно использовалась OpenVZ), но сейчас мы с интересом смотрим на Docker (с Kubernetes) и потихоньку перебираемся на него, а новые микросервисы запускаем сразу в кластере Kubernetes.

О том, как мы используем Kubernetes, мы рассказывали на профильном митапе и Codefest 2017:


Хранилище картинок


История хранилища картинок подробно описана в статье. Сейчас оно имеет двухуровневую структуру: первый уровень — маленькие картинки (те, что используются в поисковой выдаче и, соответственно, часто запрашиваются; разрешением до 640x640) плюс кэш больших картинок, второй уровень — большие картинки, которые доступны только из карточки объявления. Прямого доступа извне к серверам второго уровня нет, всё проходит через первый уровень (и таким образом оседает в кэше). Ввиду разного профиля нагрузки на разные уровни, конфигурация и количество серверов в каждом уровне также различаются: на первом уровне много серверов с дисками небольшого объёма, а на втором уровне немного (~ в пять раз меньше) серверов с дисками большого объёма.

Все необходимые разрешения картинок генерируются на бэкэнде при загрузке. Картинки некоторых непопулярных размеров не хранятся на серверах, а генерируются nginx’ом на лету. Аналогично с ватермарками: для большинства разрешений они накладываются бекэндом сразу же, но некоторые разрешения мы отдаём партнёрам без ватермарок (а на сайт — с ватермарками), поэтому они накладываются nginx’ом на лету.

image

Если вдаваться в подробности, то у нас есть по 100 виртуальных картиночных нод первого и второго уровня, которые равномерно раскиданы по физическим серверам соответствующих уровней. Привязка виртуальных нод к физическим регулируется с помощью CNAME-записей в DNS и, в случае с первым уровнем, внешних IP на серверах.

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

Устройство платформы


Входящий трафик балансируется на разных уровнях: L3, L4, L7.

Внутреннее устройство платформы можно описать как “находится в процессе перехода с монолита на микросервисы”. Функциональность поделена на куски, которые мы называем “сервисами” — это ещё не микросервисы, но уже не монолит.

Устройство сервиса типовое: фронтенд на nginx, бекэнд — собственно сервис, и некоторый набор прокси до всех необходимых источников данных — БД, кэшей, других сервисов.

image

Некоторые подробности об используемых прокси можно узнать из моего выступления на Highload Junior 2016.

Заключение


Часто от высоконагруженных проектов ждут сложной архитектуры, пятиэтажных решений, требующих непрерывной поддержки. Это неправильно — чем сложнее система, тем больше неприятностей может породить самый незначительный баг. Поэтому мы за простоту. Мы придерживаемся принципа KISS, не плодим сущности и не усложняем то, что должно быть простым — и в разработке, и в поддержке, и в администрировании.

Такое устройство платформы позволяет нам легко её масштабировать, а значит избегать множества проблем. Сейчас мы находимся в переходном возрасте периоде и обратили свой взгляд на современные и удобные вещи: Docker и микросервисы. Скоро расскажем, что из этого получится.
Автор: @tiandrey
Avito
рейтинг 292,60
Avito – сайт объявлений №1 в России

Вакансии компании Avito

Комментарии (33)

  • 0
    Так а какие СХД то используете? Или может SDS?
    • 0
      Мы не используем специализированные решения чисто для хранения данных. Ближе всего к СХД наши картиночные сервера.
  • +6
    Ребят, сделайте уже фильтрацию по цене, ну.
    • +1
      Неистово плюсую, фильтр по цене один из самых основных должен быть — а его нет.
    • +1
      Неистово присоединяюсь к просьбе.
    • +10
      Будет человеческий фильтр по цене, будет. Мы работаем над этим.
      А прямо сейчас можно добавить в URL параметры pmin=минцена и pmax=максцена, и фильтрация по цене таки будет работать.
      • 0
        вам очень нужно улучшить интерфейс выбора города и метро
        1. Поиск по станциям метро не запоминается. Очень НЕудобно каждый раз тыкать по карте метро 10 подходящих тебе станций
        2. Выбор города. Опять не запоминается. Я живу в Троицке и каждый раз мне нужно:
        нажать на поле «Город»
        нажать выбрать другой
        выбрать регион московская область
        из списка выбрать Троицк
        Почему нельзя просто сделать поиск по autocomplete + запоминать выбор города?
        3.В приложении тоже поиск по метро адский ад. Уже не помню, но я плевался во все стороны

        Нельзя в 2207 с таких не юзер-френдли интерфейсом
    • +1
      Фильтрация по цене есть в мобильном приложении, разве нет?
      • +1
        Думаете это нормально, когда в каталоге товаров есть фильтрация по стоимости только в мобильной версии?
        Как по мне, это основной функционал и должен быть везде.
        • 0
          Редко пользуюсь декстопным вариантом. Все ранво нужен телефон чтобы звонить, а звонить из приложения одно удовольствие
      • 0
        Да, но при этом там нет линейного и табличного списка товаров. И так плохо, и так плохо.
  • +1
    Как ни зайду на Авито — постоянно отваливается чат (просто крутится колесо загрузки и ничего не происходит).
    Что-нибудь с этим будете делать?
    • +1
      Вам не кажется логичным написать в техподдержку о проблемах с сайтом?
      • +1
        Да, это логично. Тем не менее, я пишу тут. Вероятно, на это есть причина.
        • +4
          Плюсую. Я вот тоже пытался решить проблему через техподдержку, а воз и ныне там.
      • 0
        Ха-ха, нет.
        Техподдержка кивает, а воз и ныне там.
        Или шлет отписки.
    • 0

      У меня тоже. Оказалось, косячит DNS у провайдера (или ещё на каком-то уровне). Только через VPN нормально работает.

  • +5
    Дорогое Авито, перестаньте, пожалуйста, банить зарубежные IP-адреса просто потому, что вашим админам так проще бороться со спамом. За пределами России проживает, как минимум, 30 миллионов россиян. Из них, скорее всего, 10% сдают квартиру на родине. Зачем вы решили избавиться от 3 миллионов наиболее платёжеспособных клиентов и их объявлений?
    • 0
      присоедиюсь. Искал дом, находясь в Казахстане (логично же, чтобы что-то купить, надо сначала поискать, чтобы на месте время не терять)… Так те на — не покажем вам телефонов. Пришлось людей в России смотреть ссылки которые нужны.
      Да и в целом все направленно на то, чтобы покупатель не мог ни найти нужную информацию, ни данные посмотреть для связи. Поэтому предпочитаю другие сайты с объявлениями.
      • +1
        Поэтому предпочитаю другие сайты с объявлениями.

        Какие именно? Давайте соберём здесь список.
        • 0

          Не очень большой список получился? Я вот запилил свой авито… но проблема с такими сервисами в том, что люди туда ходят не потому что у сайтов хороший интерфейс. А потому что там есть другие люди. А чтобы они там появились нужны рекламные бюджеты сопоставимые с авито.

  • 0

    tiandrey Расскажите. пожалуйста, про железные мощности подробнее.


    Сколько физических серверов под что используется.
    Под картинки, под базы, редис, ребит, под кубернетис облако, балансеры и т.д.

    • 0
      Ответил ниже.
    • 0
      Кстати, какие-то цифры были в первой статье про историю картиночного хранилища.
  • +3

    великолепный псто обо всем и конкретно ни о чем.
    у вас php, python и go? — м-м, неожиданно.
    вы начали внедрять docker? — ничоси…
    ну а как вы накладываете ватермарки — ну ващеее.


    Это серьезно?этот бред можно пулять на хабр, только потому что вы авито? Устройство сайта, адаптированное для младших начальных классов?


    Где хардкор? Где применяемые хаки, БД, боль борьбы с нагрузкой, секреты балансировки? И главный вопрос — нахрена я это прочитал?

    • +1
      Я бы рад назвать конкретные цифры, показать полные схемы устройства платформы и так далее, но, увы, есть такая вещь, как NDA. В изначальном варианте статья была раза в два больше, но после выпиливания всего, что нельзя выпускать в открытый доступ, получилось вот это вот — обо всём и ни о чём, меня это тоже печалит.

      Всё, что можно рассказать, мы рассказываем на разных конференциях и митапах, в статье не просто так ссылки приведены. Про хитрости балансировки, например, я рассказывал на HL Junior 2016 (отдельно слайды без моей рожи тут).

      Если хочется узнать больше — приходите к нам работать :)
  • +1
    Классный рукописный шрифт на последней картинке! Название не подскажите?
  • 0
    Вы б хоть капельку внимания фронтенду уделили. У вас не просто неудобный сайт, а почти бесполезный для части юзеров. Несколько раз за последние 5 лет пытался воспользоваться. Каждый раз уходил, матерясь. Попробуйте что-нибудь найти в Зеленограде, например.
    • 0
      Поддерживаю товарища.
      Каталог товаров — самый крупный, а удобство работы с ним — самое худшее.
  • 0
    А подскажите, стоимость хостинга и трафика снизилась или увеличилась, хотя бы в процентах.
  • 0
    >принципа KISS
    хороший принцип))
  • 0
    как уже писали выше, тп часто банально игнорит дельные предложения от людей, которые постоянно пользуются авито как инструментом
    поэтому спрошу тут: почему нельзя запилить решение для такого кейса: живу в областном городе, выставил товар — нет платежеспособного спроса, хочу сменить город (место продажи) на областной центр, в котором так же бываю
    нет, боль, удаляю объявление в своем городе, жду пару дней, ставлю объяву в областном центре
    • 0
      Сменить город можно через техподдержку.

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.