Платформа
Для нас, конечно, особый интерес представляет именно архитектура проекта: как взаимодействуют основные компоненты системы, какие собственные разработки потребовались, какими трюками пришлось воспользоваться. Но прежде, чем перейти к ней, необходимо ознакомиться с базовыми вещами — используемыми технологиями и продуктами.
В качестве основной операционной системы используется Debian Linux — решение, проверенное временем, один из самых старых и стабильных современных дистрибутивов. Для балансировки нагрузки между серверами приложений используется HTTP-сервер nginx, работающий в режиме reverse proxy. В его обязанности входит держать соединение с браузером пользователя и передавать запросы серверам, ответственным за исполнение PHP-кода, а также контролировать попадание результата обратно в браузер. PHP-код исполняется посредством модуля mod_php для Apache — альтернативных вариантов довольно много, особенно на основе протокола FastCGI, но руководство ВКонтакте пошло по более консервативному пути в этом вопросе, воспользовавшись самым проверенным временем решением. Никаких особых систем оптимизации производительности PHP-кода не используется (например, в Facebook написали свой компилятор из PHP в C под названием HipHop), единственной внешней оптимизацией является кэширование оп-кода посредством всем доступного решения XCache.
Ситуация с хранением данных выглядит достаточно размыто: с одной стороны, активно используется собственная система управления базами данных, написанная на C и созданная «лучшими умами» России, с другой — часто упоминалась MySQL в роли основного хранилища. Подробнее про собственную базу данных ВКонтакте я расскажу ниже. Говоря о хранении данных, нельзя не упомянуть о таком важном аспекте, как кэширование часто используемой информации (расположение её в оперативной памяти для быстрого доступа). Для этого используется очень популярный продукт в этой области — memcached. Если ты не слышал: эта система позволяет осуществлять очень простые атомарные операции, такие как расположение и получение произвольных данных по ключу. Основной фишкой является молниеносно быстрый доступ и возможность легкого объединения оперативной памяти большого количества серверов в общий массив для временного хранения «горячих» данных.
Сторонние проекты, не являющиеся ключевыми для ВКонтакте, часто реализуются либо с использованием довольно экзотических решений, либо, наоборот, на самых простых технологиях. Например, сервис мгновенного обмена сообщениями реализован на node.js (подробнее об этой разработке ты можешь прочитать в статье «Серверный JavaScript» в ][ 08/2010) с использованием протокола XMPP aka Jabber (мы еще к нему вернемся). Конвертирование видео реализовано на самой простой и эффективной библиотеке — ffmpeg, на ней же работает очень популярный видео-плеер VLC.
Основные используемые технологии
- Debian Linux — основная операционная система
- nginx — балансировка нагрузки
- PHP + XCache
- Apache + mod_php
- memcached
- MySQL
- Собственная СУБД на C, созданная «лучшими умами» России
- node.js — прослойка для реализации протокола XMPP, живет за HAProxy (haproxy.1wt.eu)
- xfs — файловая система для хранения изображений и отдачи пользователю
- ffmpeg — конвертирование видео
Архитектура
Самым заметным отличием от архитектуры многих других крупных интернет-проектов является тот факт, что сервера ВКонтакте многофункциональны. Т.е. нет четкого разделения на серверы баз данных, файловые серверы и т.д. — они одновременно используются в нескольких ролях. При этом перераспределение ролей происходит в полуавтоматическом режиме с участием системных администраторов. С одной стороны, это оптимизирует эффективность использования системных ресурсов, что хорошо, но с другой — повышает вероятность конфликтов на уровне операционной системы в рамках одного сервера, что влечет за собой проблемы стабильности. Впрочем, несмотря на использование серверов в разных ролях, вычислительные мощности проекта обычно используются менее чем на 20%.
Балансировка нагрузки между серверами происходит по многоуровневой схеме, которая включает в себя балансировку на уровне DNS (домен обслуживается с помощью 32 IP-адресов), а также маршрутизацию запросов внутри системы, причем разные сервера используются для разных типов запросов. Например, генерация страниц с новостями (теперь это принято называть микроблогом) работает по хитрой схеме, использующей возможности протокола memcached по параллельной отправке запросов на получение данных по большому количеству ключей. В случае отсутствия данных в кэше, аналогичный запрос отправляется системе хранения данных, а полученные результаты подвергаются сортировке, фильтрации и отбрасыванию лишнего уже на уровне PHP-кода. Похожим образом этот функционал работает и в Facebook (они недавно обменивались опытом), только вместо собственной СУБД в Facebook используют MySQL.
В стенах ВКонтакте было разработано большое количество софта, который более точно удовлетворяет потребностям проекта, чем доступные opensource и коммерческие решения. Помимо упоминавшейся собственной СУБД у них есть система мониторинга с уведомлением по СМС (Павел сам помогал верстать интерфейс), автоматическая система тестирования кода и анализаторы статистики и логов.
В проекте используется достаточно мощное оборудование, ориентировочно были названы следующие характеристики серверов:
- 8-ядерные процессоры Intel (по два на сервер, видимо);
- 64 Гб оперативной памяти;
- 8 жестких дисков;
- RAID не используется (репликация и резервное копирование осуществляется на программном уровне).
Примечательно, что сервера не брендированные, а собираются специализированной российской компанией. Сейчас оборудование проекта расположено в 4 датацентрах в Санкт-Петербурге и Москве, причем вся основная база данных располагается в питерском датацентре, а в Москове хостится только аудио и видео. В планах сделать репликацию базы данных с другим датацентром в Ленинградской области, а также использовать Content Delivery Network для повышения скорости скачивания медийного контента в регионах.
Многие проекты, сталкивающиеся с большим количеством фотографий, часто изобретают собственные решения по их хранению и отдаче пользователям. Об этом был первый вопрос, заданный Павлу из зала: «Как вы храните изображения?» — «На дисках!». Так или иначе, представители ВКонтакте заявили, что вся эта куча фотографий всех цветов и размеров просто хранится и отдается с файловой системы (используют xfs) большого количества серверов, без дополнительных изысков. Смущает разве что тот факт, что у других крупных проектов такой подход не сработал — наверное, они не знали волшебного слова :).
Не менее волшебной представляется та самая собственная база данных на C. Этому продукту, пожалуй, было уделено основное внимание аудитории, но при этом почти никаких подробностей о том, что он, собственно говоря, собой представляет, так и не было обнародовано. Известно, что СУБД разработана «лучшими умами» России, победителями олимпиад и конкурсов TopCoder, а также что она используется в самых высоконагруженных сервисах ВКонтакте:
- Личные сообщения
- Сообщения на стенах
- Статусы
- Поиск
- Приватность
- Списки друзей
В отличие от MySQL используется нереляционная модель данных, а большинство операций осуществляется в оперативной памяти. Интерфейс доступа представляет собой расширенный протокол memcached. Специальным образом составленные ключи возвращают результаты сложных запросов (чаще всего специфичных для конкретного сервиса).
Система проектировалась с учетом возможности кластеризации и автоматической репликации данных. Разработчики хотели бы сделать из данной системы универсальную СУБД и опубликовать под GPL, но пока не получается из-за высокой степени интеграции с остальными сервисами.
Интересные факты о ВКонтакте
- Процесс разработки близок к методологии Agile с недельными итерациями (циклами), в рамках которых проходят все этапы разработки: планирование, анализ требований, проектирование, разработка и тестирование.
- Ядро операционной системы модифицировано (на предмет работы с памятью), есть своя пакетная база для Debian.
- Фотографии загружаются на два жестких диска одного сервера одновременно, после чего создается резервная копия на другом сервере.
- Есть много доработок над memcached, в.т.ч. для более стабильного и длительного размещения объектов в памяти; есть даже версия, обеспечивающая сохранность данных.
- Фотографии не удаляются для минимизации фрагментации.
- Решения о развитии проекта принимают Павел Дуров и Андрей Рогозов, ответственность за сервисы — на них и на реализовавшем его разработчике.
- Павел Дуров откладывал деньги на хостинг с 1 курса :).
Формат
Вконтакте позволяет создавать несколько типов страниц: публичная страница (паблик), личный профиль, группа и мероприятие. Для бизнеса подходит либо группа, либо паблик. В некоторых случаях и личный профиль с мероприятием окажутся полезны, но об этом упомянем ниже. Сейчас же давайте определим, что выбрать: группу или паблик. Не рекомендуем создавать и то, и то одновременно — задачи они решают похожие, поэтому будут просто отбирать друг у друга подписчиков.
Группа
Группа больше подходит для общения самих участников: здесь на самом заметном месте висит блок с “Обсуждениями”, пользователи сами пишут посты в ленту новостей (если это не запрещено администратором). Такой тип страницы станет отличным объединением людей по интересам и площадкой для обсуждения общих тем.
Плюсы
- Настройки приватности — группа может быть открытой, закрытой или частной. В открытую вступают все желающие, в закрытую принимают после одобрения админа, в частную попадают только по приглашению.
- Публиковать посты могут все участники, однако такие публикации не отображаются у них в ленте новостей.
- Контент пользователей — участники могут сами создавать альбомы, загружать видео, фотографии и музыку.
- Можно приглашать друзей.
Минусы
- Вики-меню не получится сделать на главной странице, оно всегда спрятано за вкладкой.
- Не отображается в профилях участников — ее видно, только если раскрыть дополнительную информацию профиля, и то там она незаметна в сплошном списке других групп.
Паблик
Публичная страница или паблик лучше подходит, если вы не планируете создавать площадку для общей дискуссии, а хотите только транслировать нужную информацию подписчикам. Если проводить аналогии, то группа — это кружок по интересам, а паблик — газета. В первом обсуждают, во второй только получают информацию. Поэтому паблик идеально подходит для публикации новостей.
Плюсы паблика
- Можно расположить меню с вики-разметкой прямо на главной, закрепив его вверху.
- Паблик отображается у подписчиков в блоке “интересные страницы”. Там его увидят друзья и могут тоже заинтересоваться пабликом.
- Можно модерировать записи от подписчиков, которые сначала попадают в “Предложенные новости” и только после одобрения администратора публикуются в ленте.
Минусы паблика
- Нельзя приглашать друзей вступить в сообщество.
- Нет настроек приватности — просматривать посты паблика может любой человек в интернете.
Что общего
И у группы, и у паблика есть ряд общих черт и функций:
- подробная статистика: посещения, подписки, лайки, репосты и комментарии;
- возможность вести прямые видеотрансляции;
- возможность отвечать в личку пользователям от лица сообщества;
- доступность виджетов и приложений;
- функция создания “товаров”;
- перевод платежей.
Поэтому при выборе формата страницы важно учитывать особенности аудитории и сферы бизнеса. Например, если вы разводите на продажу щенков или котят, логичнее будет создать группу, так как клиенты наверняка захотят и после покупки делиться своими впечатлениями, общаться с другими владельцами питомцев, выкладывать фото и видео.
Если же у вас рекламное агентство, логичнее создать паблик, так как вряд ли клиентам есть, что обсудить — у них разные сферы интересов. Им важно лишь получить от вас нужную информацию, посмотреть на прошлые кейсы, убедиться в профессионализме.
Мероприятия и личный профиль
Отдельно остановимся на двух менее популярных форматах странниц Вконтакте.
Мероприятие
Этот тип подойдет, если вы продвигаете конкретное событие: концерт, выставку, конференцию, тренинг, мастер-класс — все, у чего есть конкретная дата. На мероприятие можно приглашать других пользователей, продвигать его с помощью внутренней рекламы.
Личный профиль
Персональная страница будет полезна в продвижении бизнеса, если он прочно завязан на личности владельца. Это актуально для ведущих свадьб, фотографов, фрилансеров, знаменитостей, бизнес-тренеров, экспертов в своих областях.
Подпроекты
Сервисы аудио и видео являются побочными для социальной сети, на них создатели проекта особо не фокусируются. В основном это связано с тем, что они редко коррелируют с основной целью использования социальной сети — общением, а также создают большое количество проблем. Видеотрафик — основная статья расходов проекта, плюс всем известные проблемы с нелегальным контентом и претензиями правообладателей. 1000—1500 серверов используются для перекодирования видео, на них же оно и хранится. Медиа-файлы банятся по хэшу при удалении по просьбе правообладателей, но это неэффективно и планируется усовершенствовать этот механизм. Очевидно, речь идет о разработке более интеллектуального алгоритма распознавания аудио- и видео-контента по тегам, как это, к примеру, реализовано в YouTube, где загруженный видеоролик, нарушающий лицензию, может быть автоматически удален уже через несколько минут после загрузки.
Как известно, некоторое время назад появилась возможность общаться на ВКонтакте через протокол Jabber (он же XMPP). Протокол совершенно открытый и существует масса opensource реализаций. По ряду причин (среди которых проблемы интеграции с остальными сервисами ВКонтакте) было решено за месяц создать собственный сервер, представляющий собой прослойку между внутренними сервисами ВКонтакте и реализацией XMPP протокола. Реализован он на node.js — выбор обусловлен тем, что JavaScript знают практически все разработчики проекта, к тому же это хороший набор инструментов для реализации задачи. Сложным моментом стала работа с большими контакт-листами. У многих пользователей количество друзей ВКонтакте измеряется сотнями и тысячами, высока активность смены статусов: люди появляются и исчезают из онлайна чаще, чем в других аналогичных ситуациях. К тому же необходимо было реализовать тесную интеграцию с внутренней системой обмена личными сообщениями ВКонтакте. В результате на сервисе 60-80 тысяч человек онлайн, в пике — 150 тысяч. TCP/HTTP-балансировщик нагрузки HAProxy обрабатывает входящие соединения и используется для распределения запросов по серверам, а также развертывания новых версий.
При выборе системы хранения данных думали о нереляционных системах хранения данных (в частности, о MongoDB), но в итоге решили воспользоваться привычной MySQL. Сервис функционирует на 5-ти серверах разной конфигурации, на каждом из которых работает код на node.js (по 4 процесса на сервер), а на трех самых мощных — еще и MySQL. Интересной особенностью является отсутствие связи между группами друзей в XMPP с группами друзей на сайте — сделано по просьбе пользователей, которые не хотели, чтобы их друзья из-за плеча видели, в какой группе они находятся.
Важным подпроектом является также интеграция с внешними ресурсами, которую в условиях высоконагруженного сервиса реализовать далеко не так просто. Все чаще на страницах сторонних проектов можно увидеть виджеты «Мне нравится», позволяющими быстро поделиться интересным постом со своими друзьями, а также небольшие блоки «Мы ВКонтакте» с данными о пользователях внутри привязанной группы. Основные шаги, предпринятые в этом направлении, с небольшими комментариями:
- Максимальная кроссбраузерность для виджетов и IFrame-приложений на основе библиотек easyXDM и fastXDM, обеспечивающих взаимодействие между сторонним ресурсом и программным интерфейсом ВКонтакте. Таким образом была решена проблема кроссдоменного взаимодействия и вопрос работы во всех браузерах.
- Кросс-постинг статусов в Twitter, реализованный с помощью очередей запросов.
- Кнопка «поделиться с друзьями», поддерживающая openGraph-теги и автоматически подбирающая подходящую иллюстрацию (путем сравнивания содержимого тега
- Возможность загрузки видео через сторонние видео-хостинги (YouTube, RuTube, Vimeo, и т.д.).
Цель и задачи бизнеса, которые можно решить с помощью Вконтакте
Цель здесь одна — увеличить прибыль компании. Достичь этой цели можно разными путями или их совокупностью. Поэтому важно конкретизировать цель и формулировать для ее достижения конкретные задачи, показатели которых можно измерить. Например, “хочу еженедельно продавать через группу 10 пар кроссовок” или “хочу на 10% увеличить посещаемость сайта из соцсетей”.
Страница в VK может решить как минимум семь задач продвижения бизнеса.
1. Работа с негативом. Если на ваши товары или услуги регулярно оставляют отзывы в интернете, лучше, чтобы их оставляли именно в группе. Это поможет обработать негатив, утешить или успокоить недовольного клиента, а если он совсем неадекватный, показать своими вежливыми и участливыми ответами, что такому отзыву не стоит доверять. Также это поможет понять, если действительно есть какие-то слабые места в работе: долгая доставка, обман покупателей недобросовестным менеджером и т.п.
2. Презентация товаров. Благодаря функции “Товары” можно составить каталог продукции или услуг: с иллюстрациями, ценой, характеристиками, кнопкой для заказа. Это поможет оптимизировать время на перечисление ассортимента в переписке с клиентом или по телефону и в целом увеличить продажи. Пользователи добавляют товары в избранное, делятся ими с друзьями и репостят, расширяя вашу клиентскую базу.
3. Повышение посещаемости сайта. Соцсети при правильном продвижении станут дополнительным источником трафика на сайт. Делайте интригующие анонсы новостей и статей на сайте и публикуйте их вместе с ссылкой на своей странице. Добавьте ссылки на прайс, форму заказа, подробное описание услуг — так вы повысите трафик.
4. Исследование аудитории. В группе можно регулярно проводить опросы, чтобы понять предпочтения и пожелания клиентов бизнеса: какой товар им более интересен, в какое время они предпочитают к вам приходить, к каким конкурентам ходят помимо вас, как они относятся к акциям, что бы они предложили улучшить. Эти данные помогут ускорить продвижение.
5. Информирование. С помощью соцсетей можно моментально проинформировать клиентов о важных изменениях: закрытие на ремонт, появление нового товара, запуск выгодной акции или реферальной программы, изменения в графике работы, открытие нового магазина, переезд в другой офис.
6. Расширение аудитории. Если вы будете публиковать качественный и интересный контент, которым пользователи захотят поделиться в своих профилях, это привлечет в группу новых участников, часть из которых станет вашими клиентами.
7. Повышение доверия. Благодаря группе или странице в VK вы можете общаться с клиентами и показывать свою экспертность, отвечая на вопросы в комментариях или публикуя полезные материалы по вашей теме. Например, если у вас цветочный магазин, напишите статью с рекомендациями по составлению букетов или выбору цветов для разных событий. Если у вас автосервис — составьте обзор лучших онлайн-магазинов автозапчастей. Подписчики будут благодарны.
Не секрет
Завеса тайны насчет технической реализации ВКонтакте была немного развеяна, опубликовано куча интересных аспектов, но все же многие моменты по-прежнему остаются секретом. Возможно, в будущем появится более детальная информация о собственной СУБД ВКонтакте, которая, как оказалось, является ключом к решению всех самых сложных моментов в масштабируемости системы. Сейчас, как бы кто ни относился к ВКонтакте, сервис является очень интересным с точки зрения построения высоконагруженных систем. Все-таки 11 миллиардов запросов в день, высочайший аптайм и почти 100 миллионов пользователей — дорогого стоят.