![image](https://habrastorage.org/web/96d/052/92c/96d05292c3f0406aa836880300da5265.png)
Мы уже рассказали вам о хранилище 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’ом на лету.
![image](https://habrastorage.org/web/487/4d5/14d/4874d514dca646cab902efebc794b8ea.png)
Если вдаваться в подробности, то у нас есть по 100 виртуальных картиночных нод первого и второго уровня, которые равномерно раскиданы по физическим серверам соответствующих уровней. Привязка виртуальных нод к физическим регулируется с помощью CNAME-записей в DNS и, в случае с первым уровнем, внешних IP на серверах.
Для снижения нагрузки на наши серверы и экономии трафика и электроэнергии мы используем CDN, однако наша платформа обладает достаточными ресурсами для того, чтобы работать самостоятельно, и мы не завязаны на конкретном провайдере.
Устройство платформы
Входящий трафик балансируется на разных уровнях: L3, L4, L7.
Внутреннее устройство платформы можно описать как “находится в процессе перехода с монолита на микросервисы”. Функциональность поделена на куски, которые мы называем “сервисами” — это ещё не микросервисы, но уже не монолит.
Устройство сервиса типовое: фронтенд на nginx, бекэнд — собственно сервис, и некоторый набор прокси до всех необходимых источников данных — БД, кэшей, других сервисов.
![image](https://habrastorage.org/web/d00/5e1/e0f/d005e1e0fe28454bbd38efa00e85be7e.png)
Некоторые подробности об используемых прокси можно узнать из моего выступления на 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
Мы не используем специализированные решения чисто для хранения данных. Ближе всего к СХД наши картиночные сервера.