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 и микросервисы. Скоро расскажем, что из этого получится.
Поделиться с друзьями
-->

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


  1. KorP
    08.06.2017 14:02

    Так а какие СХД то используете? Или может SDS?


    1. tiandrey
      08.06.2017 14:06

      Мы не используем специализированные решения чисто для хранения данных. Ближе всего к СХД наши картиночные сервера.


  1. gxcreator
    08.06.2017 15:07
    +6

    Ребят, сделайте уже фильтрацию по цене, ну.


    1. Ded_Keygen
      08.06.2017 15:26
      +1

      Неистово плюсую, фильтр по цене один из самых основных должен быть — а его нет.


    1. Listrigon
      08.06.2017 15:28
      +1

      Неистово присоединяюсь к просьбе.


    1. tiandrey
      08.06.2017 15:35
      +10

      Будет человеческий фильтр по цене, будет. Мы работаем над этим.
      А прямо сейчас можно добавить в URL параметры pmin=минцена и pmax=максцена, и фильтрация по цене таки будет работать.


      1. SuperKozel
        08.06.2017 21:52

        вам очень нужно улучшить интерфейс выбора города и метро
        1. Поиск по станциям метро не запоминается. Очень НЕудобно каждый раз тыкать по карте метро 10 подходящих тебе станций
        2. Выбор города. Опять не запоминается. Я живу в Троицке и каждый раз мне нужно:
        нажать на поле «Город»
        нажать выбрать другой
        выбрать регион московская область
        из списка выбрать Троицк
        Почему нельзя просто сделать поиск по autocomplete + запоминать выбор города?
        3.В приложении тоже поиск по метро адский ад. Уже не помню, но я плевался во все стороны

        Нельзя в 2207 с таких не юзер-френдли интерфейсом


    1. dikkini
      08.06.2017 16:47
      +1

      Фильтрация по цене есть в мобильном приложении, разве нет?


      1. gxcreator
        09.06.2017 00:05
        +1

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


        1. dikkini
          09.06.2017 16:38

          Редко пользуюсь декстопным вариантом. Все ранво нужен телефон чтобы звонить, а звонить из приложения одно удовольствие


      1. easy_john
        16.06.2017 17:44

        Да, но при этом там нет линейного и табличного списка товаров. И так плохо, и так плохо.


  1. mammuthus
    08.06.2017 17:05
    +1

    Как ни зайду на Авито — постоянно отваливается чат (просто крутится колесо загрузки и ничего не происходит).
    Что-нибудь с этим будете делать?


    1. tiandrey
      08.06.2017 17:10
      +1

      Вам не кажется логичным написать в техподдержку о проблемах с сайтом?


      1. mammuthus
        08.06.2017 18:31
        +1

        Да, это логично. Тем не менее, я пишу тут. Вероятно, на это есть причина.


        1. Londoner
          08.06.2017 18:50
          +4

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


      1. easy_john
        16.06.2017 17:40

        Ха-ха, нет.
        Техподдержка кивает, а воз и ныне там.
        Или шлет отписки.


    1. SamDark
      09.06.2017 10:59

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


  1. Londoner
    08.06.2017 18:56
    +5

    Дорогое Авито, перестаньте, пожалуйста, банить зарубежные IP-адреса просто потому, что вашим админам так проще бороться со спамом. За пределами России проживает, как минимум, 30 миллионов россиян. Из них, скорее всего, 10% сдают квартиру на родине. Зачем вы решили избавиться от 3 миллионов наиболее платёжеспособных клиентов и их объявлений?


    1. evr1ka
      09.06.2017 10:56

      присоедиюсь. Искал дом, находясь в Казахстане (логично же, чтобы что-то купить, надо сначала поискать, чтобы на месте время не терять)… Так те на — не покажем вам телефонов. Пришлось людей в России смотреть ссылки которые нужны.
      Да и в целом все направленно на то, чтобы покупатель не мог ни найти нужную информацию, ни данные посмотреть для связи. Поэтому предпочитаю другие сайты с объявлениями.


      1. Londoner
        09.06.2017 10:58
        +1

        Поэтому предпочитаю другие сайты с объявлениями.

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


        1. dernasherbrezon
          09.06.2017 13:15

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


  1. ecto
    08.06.2017 23:50

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


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


    1. tiandrey
      09.06.2017 12:34

      Ответил ниже.


    1. tiandrey
      09.06.2017 12:40

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


  1. antonksa
    09.06.2017 06:23
    +3

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


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


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


    1. tiandrey
      09.06.2017 12:34
      +1

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

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

      Если хочется узнать больше — приходите к нам работать :)


  1. AslanKurbanov
    09.06.2017 09:57
    +1

    Классный рукописный шрифт на последней картинке! Название не подскажите?


  1. podarok
    09.06.2017 12:48

    Вы б хоть капельку внимания фронтенду уделили. У вас не просто неудобный сайт, а почти бесполезный для части юзеров. Несколько раз за последние 5 лет пытался воспользоваться. Каждый раз уходил, матерясь. Попробуйте что-нибудь найти в Зеленограде, например.


    1. easy_john
      16.06.2017 17:43

      Поддерживаю товарища.
      Каталог товаров — самый крупный, а удобство работы с ним — самое худшее.


  1. gaploid
    09.06.2017 13:45

    А подскажите, стоимость хостинга и трафика снизилась или увеличилась, хотя бы в процентах.


  1. ssh24
    10.06.2017 13:37

    >принципа KISS
    хороший принцип))


  1. jtpro
    10.06.2017 22:34

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


    1. tiandrey
      10.06.2017 22:34

      Сменить город можно через техподдержку.