Архитектура Вконтакте

28 октября 2010 105 комментариев Иван Блинков
Архитектура Вконтакте

Логотип Вконтакте
Самая популярная социальная сеть в рунете пролила немного света на то, как же она работает. Представители проекта в лице Павла Дурова и Олега Илларионова на конференции HighLoad++ ответили на шквал вопросов по совершенно разным аспектам работы Вконтакте, в том числе и техническим. Спешу поделиться своим взглядом на архитектуру проекта по результатам данного выступления.

Платформа

  • Debian Linux — основная операционная система
  • nginx — балансировка нагрузки
  • PHP + XCache
  • Apache + mod_php
  • memcached
  • MySQL
  • Собственная СУБД на C, созданная «лучшими умами» России
  • node.js — прослойка для реализации XMPP, живет за HAProxy
  • Изображения отдаются просто с файловой системы xfs
  • ffmpeg — конвертирование видео

Статистика

  • 95 миллионов учетных записей
  • 40 миллионов активных пользователей во всем мире (сопоставимо с аудиторией интернета в России)
  • 11 миллиардов запросов в день
  • 200 миллионов личных сообщений в день
  • Видеопоток достигает 160Гбит/с
  • Более 10 тысяч серверов, из которых только 32 — фронтенды на nginx (количество серверов с Apache неизвестно)
  • 30-40 разработчиков, 2 дизайнера, 5 системных администраторов, много людей в датацентрах
  • Каждый день выходит из строя около 10 жестких дисков

Архитектура

Общие принципы

  • Cервера многофункциональны и используются одновременно в нескольких ролях:
    • Перебрасывание полуавтоматическое
    • Требуется перезапускать daemon'ы
  • Генерация страниц с новостями (микроблоги) происходит очень похожим образом с Facebook (см. Архитектура  Facebook), основное отличие — использование собственной СУБД вместо MySQL
  • При балансировке нагрузки используются:
    • Взвешенный round robin внутри системы
    • Разные сервера для разных типов запросов
    • Балансировка на уровне ДНС на 32 IP-адреса
  • Большая часть внутреннего софта написано самостоятельно, в том числе:
    • Собственная СУБД (см. ниже)
    • Мониторинг с уведомлением по СМС (Павел сам помогал верстать интерфейс :) )
    • Автоматическая система тестирования кода
    • Анализаторы статистики и логов
  • Мощные сервера:
    • 8-ядерные процессоры Intel (по два на сервер, видимо)
    • 64Гб оперативной памяти
    • 8 жестких дисков (соответственно скорее всего корпуса 2-3U)
    • RAID не используется
    • Не брендированные, собирает компания ТехноОкта
  • Вычислительные мощности серверов используются менее, чем на 20%
  • Сейчас проект расположен в 4 датацентрах в Санкт-Петербурге и Москве, причем:
    • Вся основная база данных располагается в одном датацентре в Санкт-Петербурге
    • В Московских датацентрах только аудио и видео
    • В планах сделать репликацию базы данных в другой датацентр в ленинградской области
  • CDN на данный момент не используется, но в планах есть
  • Резервное копирование данных происходит ежедневно и инкрементально

Волшебная база данных на C

Этому продукту, пожалуй, уделялось максимум внимания аудитории, но при этом почти никаких подробностей о том, что он собственно говоря собой представляет, так и не было обнародовано. Известно, что:

  • Разработана «лучшими умами» России, победителями олимпиад и конкурсов топкодер; озвучили даже имена этих «героев» Вконтакте (писал на слух и возможно не всех успел, так что извиняйте):
    • Андрей Лопатин
    • Николай Дуров
    • Арсений Смирнов
    • Алексей Левин
  • Используется в огромном количестве сервисов:
    • Личные сообщения
    • Сообщения на стенах
    • Статусы
    • Поиск
    • Приватность
    • Списки друзей
  • Нереляционная модель данных
  • Большинство операций осуществляется в оперативной памяти
  • Интерфейс доступа представляет собой расширенный протокол memcached, специальным образом составленные ключи возвращают результаты сложных запросов (чаще всего специфичных для конкретного сервиса)
  • Хотели бы сделать из данной системы универсальную СУБД и опубликовать под GPL, но пока не получается из-за высокой степени интеграции с остальными сервисами
  • Кластеризация осуществляется легко
  • Есть репликация
  • Если честно, я так и не понял зачем им MySQL с такой штукой — возможно просто как legacy живет со старых времен

Аудио и видео

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

1000—1500 серверов используется для перекодирования видео, на них же оно и хранится.

XMPP

Как известно, некоторое время назад появилась возможность общаться на Вконтакте через протокол Jabber (он же XMPP). Протокол совершенно открытый и существует масса opensource реализаций.

По ряду причин, среди которых проблемы с интеграцией с остальными сервисами, было решено за месяц создать собственный сервер, представляющий собой прослойку между внутренними сервисами Вконтакте и реализацией XMPP протокола. Основные особенности этого сервиса:

  • Реализован на node.js (выбор обусловлен тем, что JavaScript знают практически все разработчики проекта, а также хороший набор инструментов для реализации задачи)
  • Работа с большими контакт-листами — у многих пользователей количество друзей на вконтакте измеряется сотнями и тысячами
  • Высокая активность смены статусов — люди появляются и исчезают из онлайна чаще, чем в других аналогичных ситуациях
  • Аватарки передаются в base64
  • Тесная интеграция с внутренней системой обмена личными сообщениями Вконтакте
  • 60-80 тысяч человек онлайн, в пике — 150 тысяч
  • HAProxy обрабатывает входящие соединения и используется для балансировки нагрузки и развертывания новых версий
  • Данные хранятся в MySQL (думали о MongoDB, но передумали)
  • Сервис работает на 5 серверах разной конфигурации, на каждом из них работает код на node.js (по 4 процесса на сервер), а на трех самых мощных — еще и MySQL
  • В node.js большие проблемы с использованием OpenSSL, а также течет память
  • Группы друзей в XMPP не связаны с группами друзей на сайте — сделано по просьбе пользователей, которые не хотели чтобы их друзья из-за плеча видели в какой группе они находятся

Интеграция со внешними ресурсами

Во Вконтакте считают данное направление очень перспективным и осуществляют массу связанной с этим работы. Основные предпринятые шаги:

  • Максимальная кроссбраузерность для виджетов на основе библиотек easyXDM и fastXDM
  • Кросс-постинг статусов в Twitter, реализованный с помощью очередей запросов
  • Кнопка «поделиться с друзьями», поддерживающая openGraph теги и автоматически подбирающая подходящую иллюстрацию (путем сравнивание содержимых тега <title> и атрибутов alt у изображений, чуть ли не побуквенно)
  • Возможность загрузки видео через сторонние видео-хостинги (YouTube, RuTube, Vimeo, и.т.д.), открыты к интеграции с другими

Интересные факты не по теме

  • Процесс разработки близок к Agile, с недельными итерациями
  • Ядро операционной системы модифицированно (на предмет работы с памятью), есть своя пакетная база для Debian
  • Фотографии загружаются на два жестких диска одного сервера одновременно, после чего создается резервная копия на другом сервере
  • Есть много доработок над memcached, в.т.ч. для более стабильного и длительного размещения объектов в памяти; есть даже persistent версия
  • Фотографии не удаляются для минимизации фрагментации
  • Решения о развитии проекта принимают Павел Дуров и Андрей Рогозов, ответственность за сервисы — на них и на реализовавшем его разработчике
  • Павел Дуров откладывал деньги на хостинг с 1 курса :)

Подводим итоги

В целом Вконтакте развивается в сторону увеличения скорости распространения информацию внутри сети. Приоритеты поменялись в этом направлении достаточно недавно, этим обусловлено, напимер, перенос выхода почтового сервиса Вконтакте, о котором очень активно говорили когда появилась возможность забивать себе текстовые URL вроде vkontakte.ru/ivan.blinkov. Сейчас этот подпроект имеет низкий приоритет и ждет своего часа, когда они смогут предложить что-то более удобное и быстрое, чем Gmail.

Завеса тайны насчет технической реализации Вконтакте была немного развеяна, но много моментов все же остались секретом. Возможно в будущем появится более детальная информация о собственной СУБД Вконтакте, которая как оказалось является ключом к решению всех самых сложных моментов в масштабируемости системы.

Как я уже упоминал этот пост написан почти на память, на основе небольшого конспекта «круглого стола Вконтакте», так что хочется сразу извиниться за возможные неточности и недопонимания. Я лишь структурировал хаотичную кучу ответов на вопросы. Буду рад уточнениям и дополнениям.

Если хотите быть в курсе новых веяний в сфере масштабируемости высоконагруженных интернет-проектов — по традиции рекомендую подписаться на RSS.

Метки: , , , , , , , , , , , , , , , , , ,

  • http://twitter.com/derSpinner derSpinner

    Спасибо за информацию. Действительно интересная статья.

    Два вопроса:

    1) «Автоматическая система тестирования кода» — что-нибудь говорили про неё?

    2) «Анализаторы статистики и логов» — и данный пункт интересует.

    Спасибо.

  • http://thefreelance.ru/ AntonMMF

    Так всё-таки, MySQL юзается или не юзается? Просветите по поводу взаимоисключающих параграфов в тексте.

  • http://www.insight-it.ru Иван Блинков

    derSpinner, повторю то, что ответил на хабре:

    Про собственные разработки (если не считать пресловутую СУБД) практически никаких подробностей вспомнить не могу — были просто вопросы в духе «а как и чем вы тестируете код?» — «с помощью собственной системы автоматического тестирования».

    Павел вообще не особо многословен был, один из первых вопросов: «Как вы храните изображения?» — «На дисках».

    AntonMMF, MySQL уделялось очень мало внимания в обсуждении, но все же местами он проскальзывал (скажем в XMPP) — так что точно используется, но видимо в не очень критичных местах.

  • Anexroid

    Я так понял что основной поток даных ложится на самописную СУБД, а с MySQL раюотает только XMPP

  • Azazello

    Удивило. А как?...........

    Архитектура:

    RAID не используется

  • anton

    я вот этого момента не понял: # RAID не используется

    это где он не используется? на серверах балансировки?

  • sportsru

    twitpic.com/312s5q

    пришло время вставить волосы

  • Александр

    **** Левин — Это Алексей Левин.

  • Данила

    Raid может не использоваться где угодно. Яндекс.фотки, например, тоже без рейдов живут.

  • http://vk.com/define Hormold

    Левин — Это Лев Левин.

    vkontakte.ru/lev

    На него зарегистрирован был vkontakte.ru

  • http://vk.com/define Hormold

    Точнее — Лев Левиев

  • Вася

    А там не говорилось, как они уникальные id создают?

    Например, для каждого нового пользователя, фотографии или группы.

    Очень интересен данный вопрос.

  • anton

    «Raid может не использоваться где угодно. Яндекс.фотки, например, тоже без рейдов живут.»

    Данила, если это так, то какая там система?

  • remal

    А почему вместо mongodb выбрали mysql?

  • http://www.insight-it.ru Иван Блинков

    Льва Левиева вписал, остальные замечания тоже поправил.

    Про отсутствие RAID — а что в этом такого? Просто вручную в коде разруливают вопрос репликации данных по нескольким жестким дискам.

    Насчет MongoDB — я так понял они решили ограничиться лишь одной незнакомой технологией (node.js) в подпроекте с ограниченными сроками.

  • Гоша

    >Льва Левиева вписал, остальные замечания тоже поправил.

    Зря. Он точно не программист, да и имея 4 миллиарда долларов он врятли тратит время на программирование Базы Данных на C

  • http://Kohver.ru Artyom

    Были вопросы на счет опенсорс проектов? Хочется взглянуть на код

  • http://www.insight-it.ru Иван Блинков

    Гоша, возможно там был кто-то другой, писал на слух и не могу что-либо гарантировать: есть другие варианты, кто бы это мог быть?

    Artyom, у них активность определенно существенно меньше в этом направлении, по сравнению с Facebook, этот вопрос затрагивался очень мало.

  • http://code-master.ru Aco

    MySQL у них используется для хранения данных, а их хитрая бд на С всего на всего селектор который возвращает ID нужных объектов

  • http://pohodushki.org Константин

    Интересно. Спасибо за «беглый обзор» )))

  • http://highexcel.ru/ HighExceL

    Окуеть

    # Павел Дуров откладывал деньги на хостинг с 1 курса :)

  • http://seriyps.ru/ Сергей

    То, что они свой Jabber сервер решили писать это вообще удивило. Есть же отличный производительный ejabberd. То что на эрланге написан думаю не такая большая проблема. Теперь вон пишут что с SSL проблемы...

  • http://www.insight-it.ru Иван Блинков

    Aco, откуда информация? Я вроде такого не слышал...

    Сергей, если я правильно понял, то у них просто не было достаточного количества Erlang-программистов, жесткие сроки и необходимость тесной интеграции с другими сервисами проекта — допиливать ejabberd им показалось сложнее. Плюс Олег что-то упоминал, что они советовались с Яндексом по поводу их опыта с реализацией Я.Онлайн (как раз на ejabberd).

  • Sergey

    >> Льва Левиева

    >> есть другие варианты, кто бы это мог быть?

    Сеня Смирнов и Леша Левин в одной команде на ACM соревнованиях. В прошлом году взяли серебро на ACM World Finals. Так что пишите Лешу, не ошибетесь :-)

  • _

    11млрд запросов в сутки это примерно 2-3 запроса на активного пользователя в секунду (даже если считать, что пользователи примерно одинаково жмут на кнопки, в пике получается ещё больше). Не кажется что сильно дофига? Какие запросы имеются в виду?

    • Callidus

      Судя по всему любые HTTP-запросы. Не стоит забывать что запрос одной веб-страницы порождает каскад запросов CSS, JS, картинок и проч. Поэтому один клик пользователя генерит десятки HTTP-запросов.

  • http://vitalvas.pp.ua VitalVas

    на счет ихней бд, скорее всего это очередная nosql

  • Satisfaction

    Интересно как у них происходит связь между клиентом и сервером, comet или pooling или еще чтото ?

  • macabre

    11 млрд на 40 млн пользователей это чуть больше 11 запросов в час, вообще-то :)

  • http://www.insight-it.ru Иван Блинков

    Sergey, спасибо за уточнение :)

    VitalVas, да, нереляционная модель данных и протокол memcached явно указывают на отсутствие поддержки SQL.

    Satisfaction, чтобы это узнать — достаточно зайти на вконтакте с включенным firebug'ом, попробуйте сами.

  • http://code-master.ru Aco

    Иван Блинков, от Олега Илларионова

  • Дмитрий

    «Не кажется что сильно дофига? Какие запросы имеются в виду?»

    Может получение мультимедиа файла тоже считают запросом.

  • Pingback: Дайджест недели, 29 октября « developers.org.ua

  • Pingback: Как работает ВКонтакте | inSocialPlay — блог об играх для социальных сетей

  • Pingback: Платформа, Статистика, Архітектура, база даних на C, Аудіо та відео, XMPP, Інтеграція | ВКонтакті вк.інфо

  • http://vkontakte.ru/ Антон

    Точность плюс-минус 50%, но почитать было забавно.

  • ivs

    На счет более 10000 серверов — это что, физические серверы?

  • http://www.insight-it.ru Иван Блинков

    ivs, да.

  • http://amdy.su AmdY

    крайне удивило использование mod_php

  • Vasiliy Isaichkin

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

  • http://sklyar.myopenid.com Виктор Скляр

    «...собственный сервер, представляющий собой прослойку между внутренними сервисами Вконтакте и реализацией XMPP протокола...»

    имеется в виду, что собственный сервер на node.js это только HTTP-bind frontend или по сомвместительству и XMPP сервер? Если так, то какой XMPP сервер используется?

  • http://sannis.ru Sannis

    Виктор Скляр, нет, собственный XMPP сервер написанный на Node.js.

  • Алексей

    Слишком много в статье додумок и неверных трактовок.

    Т.к. я спрашивал про бэкап данных, то точно помню, что сказано было — «данные дублируются на разных серверах», и потом добавлено «и бекап есть».

    И Такие замечания почти по всем пунктам этой статьи. Автор очень вольно трактует сказанное. А Павел явно местами порол хрень собачью.

  • http://vitalvas.pp.ua VitalVas

    Возможно ли как-то связаться с Павлом?

  • _

    macabre, там сказано про 60-80 тысяч онлайн пользователей (в пике до 150тыс). Хотелось бы надеяться, что пользователи оффлайн запросов не отправляют.

  • http://rafrica.net/ serge

    Почему только 20% используются?

  • http://www.highload.ru Олег Бунин

    Привет!

    Буду благодарен за ссылку на конференцию ;)

  • Pingback: Архитектура Вконтакте | WebSights

  • http://www.insight-it.ru Иван Блинков

    Олег, да, конечно стоило поставить ее.

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

  • Алексей

    Иван,

    Сервера с указанной конфигурацией это в большинстве из 200К или это максимальная используемая конфигурация?

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

    P.S Спасибо большое за статьи!

  • http://www.insight-it.ru Иван Блинков

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

  • http://vitalvas.pp.ua VitalVas

    Иван,

    Возможно как-нибудь подробнее информацию о софте которая на серверах стоит?

    Подробнее о архитектуре «волшебной» БД?

    Ну и связаться с Павлом Дуровом или с представителем?

  • http://www.insight-it.ru Иван Блинков

    VitalVas, я не располагаю информацией по всем трем вопросам.

  • Pingback: HighLoad++ 2010 | Insight IT

  • Алексей

    >Алексей, я думаю это просто конфигурация, пришедшая >Павлу в голову навскидку — я думаю это просто то, что >они последний раз закупали или что-то в этом духе. >Серьезные проблемы вообще почти не обсуждались.

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

  • Pingback: OpenQuality.ru | Качество программного обеспечения

  • Pingback: О дорожающей «ВКонтакте», экономной Google и игровой зависимости « socialplay.ru

  • http://alexpro9rammer.blogspot.com hellkni9ht

    Мистическая БД заинтриговала. Буду надеяться что Павел Дуров в скором будущем расскажет нам о ней больше:)

  • http://vitalvas.pp.ua VitalVas

    Я так подозреваю что там используеться mysql-cluster+mysql-proxy+memcached+какааята_хрень_что_они_разработали

  • Денис

    Мистическая БД под названием NoSQL

  • http://vitalvas.pp.ua VitalVas

    [b]Денис[/b]

    а ты откуда знаешь что там стоит?

  • Barseloneta

    А кто все это оплачивает ?

    Откуда средства на такой гигантский проект ?

    И кто поддерживал неясную и неприбыльную в 2006 году бизнес-идею ?

  • Visitor
  • http://www.bravada-promo.ru Андрэ

    Жалко про антиспам нет ничего =))

  • http://vitalvas.pp.ua VitalVas

    жаль...

  • http://www.insight-it.ru Иван Блинков

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

  • Pingback: Как работает ВКонтакте | Sergey.dacastas.com

  • http://www.armtorg.ru/ Карп

    Ого, занятные цифры, до фейсбука конечно еще далеко, но тоже впечатляет.

    А спам это да, это бич вконтакте(((

  • Konstantin

    Спасибо!

    Очень, очень полезный труд.

    У Вас случайно не завалялось сведений об архитектуре HotMail от Microsoft? Было бы очень интересно.

  • http://Americanmult.ru AD

    так глядишь и фейсбук обойдут

  • http://www.netsgame.ru/ matpa

    Очень интересная статья. Фейсбук не обойдут))

  • http://www.insight-it.ru Иван Блинков

    Альтернативная точка зрения на тему данной статьи: spb-borodin.livejournal.com/596.html

  • http://dead-b.ru/ Dead

    О_О отличная статья, даже не знал что ВК всё так серьезно

  • Pingback: Высоконагруженные проекты на примере вконтакте | Программы для блогов

  • Pingback: ссылочки | McKrinvich

  • Pingback: Архитектура Вконтакте | Денис 'rez0n' Вербин

  • http://www.insight-it.ru Иван Блинков

    Печатная версия статьи опубликована в журнале Хакер: www.xakep.ru/magazine/xa/144/default.asp

  • Pingback: Архитектура высоконагруженных систем

  • http://intim-znakomstva-2011.ru Occumpmus

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

    Ельня интим.

  • Pingback: Архитектура высоконагруженных систем « IT-безопасность

  • Pingback: Паутина фриланса » Blog Archive » Архитектура сайтов с высокой нагрузкой

  • http://post55.org.ua/ Мохнатый

    Та кишки вконтакте останутся навечно тайной! Это как новейшие военные разработки

  • http://smotrisnova.ru смотриснова

    А про финансовые движения где можно почитать:?

    • http://www.insight-it.ru Ivan Blinkov

      До IPO, скорее всего, нигде...

  • Pingback: Архитектура Вконтакте | Andrei - just my Notes

  • http://travels.500v.net/ Олег

    Да уж, Дуров знал что делать!!!

  • http://www.newstatusy.ru/ Стас

    Дуров жгет!!!

  • Acute X

    Ну а про прибыль че нить говорили???

    • http://www.insight-it.ru Ivan Blinkov

      Нет, это была техническая конференция и деньги интересовали всех в последнюю очередь.

  • Acute X

    Или это никого не интересует?;)

    • http://www.insight-it.ru Ivan Blinkov

      Не ясно о чем вопрос...

  • http://antifufel-mind.blogspot.com/ Фтешагауд

    Достаточно интересная статья. Единственно, мне почему-то казалось, что у них сервера работают на Mac OS о_О

    • Adfsdf

      какой нахер макос? м.б. еще туда «уиндос»?

      негодую...

    • http://www.insight-it.ru Ivan Blinkov

      Нет, сервера на Linux

  • Chernikov

    А ссылка на видео есть? Дайте, пожалуйста, если есть.

    • http://www.insight-it.ru Ivan Blinkov

      Видео точно снимали, но в опубликованном виде я его так и не увидел, можно попробовать у Олега Бунина спросить как с ним дела.

      Тоже пересмотрел бы, наверное...

  • Pingback: from twitter 2011-03-16 – 2011-03-16 | Архив twitter.com/404666

  • Zimcool

    мм, и правда очень интересно!))) много чего и не знал))) спасибо!)

  • Zimcool

    мм, и правда очень интересно!))) много чего и не знал))) спасибо!)

  • Lancer Batrix

    а теперь это все нагнулось но пока крехтит и лагает

  • http://life2sport.kh.ua/ Parnable

    Круто! Теперь буду знать врага в лицо. Хотя опять же, много непонятностей. зачем им своя СУБД? Как абсолютно уникальную СУБД можно разработать вчетвером? как можно контролировать работу такой корпорации, будучи даже Павлом Дуровым (который имеет гуманитарное образование)? :)

  • Дмитрий Исаев

     Интересная информация, только вот интересно откуда такие точные сведения?

    • http://www.insight-it.ru Ivan Blinkov

      Как упомяналось в статье — она по большей части основана на выступлении сотрудников Вконтакте на прошлогодней конференции.

  • Simson_1990

    да   я никак не думал что у контакта такая посещаемость и такие потоки видео и аудио

  • http://musefan.ru Роберт

    Интересная штука для изучения. Полезно для будущих веб-разработчиков.