Архітектура великих проектів: FaceBook

Архітектура великих проектів: 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 використовується система, звана GceKeeper, яка дозволяє обслуговувати різних користувачів за допомогою різних версій вихідного коду системи. Це дозволяє проводити релізи покроково, активувати деякі функції тільки для працівників Facebook і так далі.

GceKeeper також дозволяє 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

logo

Follow us