Архитектура больших проектов: Facebook
На том уровне, на котором работает Facebook, традиционные подходы к организации работы вебсайтов не работают вообще или, как минимум, не обеспечивают должной производительности. Огромная посещаемость проекта бросила вызов инженерам Facebook необходимостью поддерживать работоспособность сайта при почти полумиллиарде активных пользователей. Эта статья описывает программное обеспечение и техники, благодаря которым это стало возможно.
Задачи
- Сайт Facebook имеет около 570 миллиардов просмотров в месяц (по информации от Google Ad Planner)
- На Facebook загружено больше фотографий, чем на все другие сервисы для обмена изображениями вместе взятые (включая сайты вроде Flickr)
- Каждый месяц на серверы Facebook загружается более трех миллиардов фотографий
- Серверы Facebook отдают на просмотр около 1.2 миллиона фотографий в секунду (без учета фотографий, отдаваемых сетью доставки контента Facebook)
- Каждый месяц пользователи обмениваются более чем 25 миллиардами единицами информации (обновления статуса, комментарий и т.д.)
- На май месяц 2010 г. проект Facebook имел более 30.000 серверов онлайн
Программное обеспечение Facebook
В некотором роде Facebook все еще работает на LAMP стеке, но размеры проекта потребовали введения в строй многих других элементов и сервисов. А также изменения работы существующих. Например:
- Facebook по-прежнему использует PHP, но перед исполнением скрипты компилируются в родной код процессора, ускоряя таким образом работу
- Серверы Facebook работают на Linux, но код Linux был оптимизирован (в основном в его сетевой части)
- Facebook использует MySQL, но в основном как хранилище ключ-значение. Все соединения данных и бизнес-логика вынесена на уровень скриптов, поскольку так гораздо проще выполнять оптимизацию (по другую сторону уровня Memcached)
В проекте есть системы, написанные с нуля. Например, Haystack — высокомасштабируемое хранилище объектов, которое используется для хранения фотографий. Scribe — пример другой системы, которая обеспечивает ведение протоколов в масштабе Facebook.
Итак, обо всем по порядку.
Memcached
Memcached — один из самых широкоизвестных проектов в Интернете. Его распределенная система кеширования информации используется как кеширующий слой между веб-серверами и MySQL (поскольку доступ к базам данных относительно медленен). Прошли годы и Facebook произвел огромное количество модификаций кода Memcached и сопутствующего ПО (например, оптимизацию сетевой подсистемы).
В Facebook работают тысячи Memcached серверов с десятками терабайт кешированных данных в любой момент времени. Наверное, это самый большой в мире массив Memcached серверов.
HipHop для PHP
PHP, поскольку он является скриптовым языком, достаточно медлителен, если сравнивать его с родным кодом процессора, исполняемым на сервере. HipHop конвертирует скрипты на PHP в исходные коды на C++, которые затем компилируются для обеспечения хорошей производительности. Это позволяет Facebook получать большую отдачу от меньшего количества серверов, поскольку PHP в Facebook используется практически повсеместно.
Небольшая группа инженеров (в начале их было только трое) разработала HipHop за 18 месяцев и теперь он работает на серверах проекта.
Haystack
Haystack — это высокопроизводительная система хранения / получения фотографий (строго говоря, Haystack — хранилище объектов, поэтому он может хранить любые данные, а не только фотографии). На долю этой системы выпадает огромное количество работы. На Facebook загружено более 20 миллиардов фотографий и каждая сохраняется в четырех различных разрешениях, что в итоге дает нам более 80 миллиардов единиц фотографий.
Haystack должен не просто уметь хранить фото, но и отдавать их очень быстро. Как мы упоминали ранее, Facebook отдает более 1,2 миллиона фотографий в секунду. Это количество не включает в себя фотографии, которые отдаются системой доставки контента Facebook и постоянно растет.
BigPipe
BigPipe — система динамической доставки web-страниц, разработанная в Facebook. Она используется для доставки каждой вебстраницы секциями (которые называются pagelets) для оптимизации производительности.
Например, окно чата, лента новостей и другие части страницы запрашиваются отдельно. Их можно получать параллельно, что увеличивает производительность и позволяет пользователям использовать вебсайт даже в том случае, если какая-то его часть отключена или неисправна.
Cassandra
Cassandra — распределенное отказоустойчивое хранилище данных. Это одна из систем, которую всегда упоминают, говоря о NoSQL. Cassandra стала проектом с открытым исходным кодом и даже стала дочерним проектом Apache Foundation. На Facebook мы используем ее для поиска по папке Входящие. В принципе, ее используют многие проекты. Например, Digg. Планируется ее использование в проекте Pingdom.
Scribe
Scribe — удобная система протоколирования, которая используется сразу для нескольких вещей одновременно. Она была разработана для обеспечения ведения протоколов в масштабе всего Facebook и поддерживает добавление новых категорий событий, как только они появляются (на Facebook их сотни).
Hadoop и Hive
Hadoop — реализация алгоритма map-reduce с открытым исходным кодом, позволяющая производить вычисления на огромных объемах данных. В Facebook мы используем его для анализа данных (как вы понимаете, в Facebook их достаточно). Hive был разработан в Facebook и позволяет использовать SQL запросы для получения информации от Hadoop, что облегчает работу непрограммистов.
И Hadoop и Hive имеют открытые исходные коды и развиваются под эгидой Apache Foundation. Их использует большое количество других проектов. Например, Yahoo и Twitter.
Thrift
Facebook использует различные языки программирования в различных компонентах системы. PHP используется как фронт-энд, Erlang для чата, Ява и C++ тоже не остались без дела. Thrift — кросс-языковой фреймворк, который связывает все части системы в единое целое, позволяя им общаться друг с другом. Thrift разрабатывается как проект с открытым исходным кодом и в него уже добавлена поддержка некоторых других языков программирования.
Varnish
Varnish — HTTP акселератор, который может служить в качестве балансировщика нагрузки и кеша содержимого, которое затем может доставляться с большой скоростью. Facebook использует Varnish для доставки фотографий и картинок профилей, выдерживая нагрузку в миллиарды запросов в день. Как и все, что используется Facebook Varnish — программное обеспечение с открытым исходным кодом
Кое-что другое
Мы рассказали вам о некоторых программных комплексах, которые позволяют Facebook держать нагрузку. Но управление такой большой системой — сложная задача. Поэтому, мы расскажем вам еще кое о чем, что позволяет проекту работать стабильно.
Ступенчатые релизы и неявная активация новых функций
В Facebook используется система, называемая GateKeeper, которая позволяет обслуживать различных пользователей с помощью различных версий исходного кода системы. Это позволяет проводить релизы пошагово, активировать некоторые функции только для работников Facebook и так далее.
GateKeeper также позволяет Facebook выполнять неявную активацию новых функций для выполнения, например, нагрузочного тестирования и выявления медленно работающих компонентов системы. Неявная активация включает некоторую функцию или возможность, но не показывает ее в интерфейсе пользователя. Обычно неявная активация выполняется за две недели до того, как новая возможность предоставляется пользователям.
Тест производительности системы
Facebook производит тщательный мониторинг производительности системы и, что интересно, производится мониторинг производительности исполнения каждой PHP функции системы. Это обеспечивается использованием XHProf.
Частичное отключение функций
Если проект начинает работать медленно, мы можем отключить некоторые возможности (из достаточно большого количества) для того, чтобы поднять производительность ключевых компонентов системы.
О чем мы еще не сказали
Мы не упоминали об аппаратной части Facebook в данной статье, но, конечно, это достаточно важдо для масштабируемых проектов. Например, Facebook использует систему доставки контента для доставки его статических элементов. Конечно, есть еще большой датацентр в Орегоне для увеличения масштабируемости путем ввода еще большего количества серверов.
Помимо всего прочего, у нас еще много всякого разного программного обеспечения работает. Но нам кажется, что нам удалось рассказать вам о некоторых интересных решениях, которые задействованы в проекте.
Facebook любит проекты с открытым исходным кодом
Эта статья не была бы законченной, если бы мы не сказали вам, как Facebook любит проекты с открытым исходным кодом или просто сказали бы, что “мы любим проекты с открытым исходным кодом”.
Facebook не только участвует в разработке таких проектов как Linux, Memcached, MySQL, Hadoop и других, но и выпускает свои внутренние разработки как ПО с открытым исходным кодом. Например, HipHop, Cassandra, Thrift и Scribe. Facebook также открыл проект Tornado, высокопроизводительный фреймворк, разработанный командой, создавшей FriendFeed (этот проект был куплен Facebook в августе 2009). Список проектов, в которых участвует Facebook можно найти на этой странице.
Еще больше проблем
Facebook растет с огромной скоростью. Пользовательская база растет почти экспотенциально и приближается к полумиллиарду активных пользователей и кто знает, что будет в конце года. Прирост составляет почти 100 миллионов пользователей каждые полгода.
В Facebook даже работает специальная команда “роста”, которая постоянно старается расширить аудиторию проекта.
Постоянный рост означает, что Facebook будет сталкиваться с различными проблемами в области производительности с ростом числа поисков, просмотров, загружаемых картинок и так далее. Но это часть ежедневной работы сервиса. Инженеры Facebook будут искать новые пути увеличения масштабируемости проекта (и речь идет не только о добавлении все новых и новых серверов). Например, система хранения фотографий Facebook переписывалась несколько раз с ростом сайта.
Посмотрим, с чем придется столкнуться инженерам Facebook в следующий раз. Можно спорить, что с чем-то очень интересным. В конце концов они работают с проектом величины, о которой можно только мечтать, с сайтом, который имеет больше пользователей, чем жителей в большинстве стран. Когда вы имеете дело с тами проектом, лучше бы вам мыслить креативно.
Источники: Презентации инженеров Facebook и Блог инженеров Facebook