Архітектура Facebook 500 мільйонів користувачів
Зміст статті
Фільм "Соціальна мережа" добре ілюструє феномен розвитку Facebook'а, який зумів за рекордний термін зібрати нечувану, немислиму раніше аудиторію. Проте за кадром залишилася ще одна складова проекту — те, як він працює зсередини. Його технічний пристрій.
Що таке Facebook зараз? Найкраще це демонструють сухі цифри:
Як же це все працює?
Масштабованість, простота, відкритість
- Операційна система - Linux;
- основна мова програмування - PHP + надбудова;
- агресивне кешування об'єктів - memcached;
- сховище даних у вигляді пар "ключ-значення" - MySQL;
- універсальна система збору та агрегації даних з робочих серверів - Scribe.
Балансувальник навантаження вибирає php-сервер для обробки кожного запиту, де HTML генерується на основі різних джерел (таких як MySQL, memcached) і спеціалізованих сервісів. Таким чином, архітектура Facebook має традиційний трирівневий вигляд:
- веб-додаток;
- розподілений індекс;
- постійне сховище.
Вважаю, що найцікавіше буде почути, як у проекті вдалося використовувати найзвичніші технології. І тут справді є чимало нюансів.
Що зазвичай відбувається за 20 хвилин на Facebook?
Проект на PHP
Напрошується питання: чому саме PHP? Багато в чому - просто "історично склалося". Він добре підходить для веб-розробки, легкий у вивченні та роботі, для програмістів доступний величезний асортимент бібліотек. До того ж існує величезна міжнародна спільнота. З негативних сторінможна назвати високий витрата оперативної пам'яті та обчислювальних ресурсів. Коли обсяг коду став занадто великим, до цього списку додалися слабка типізація, лінійне зростання витрат при підключенні додаткових файлів, обмежені можливості для статичного аналізу та оптимізації. Все це почало створювати великі труднощі. З цієї причини в Facebook була реалізована маса доробок до PHP, в тому числі оптимізація байт-коду, поліпшення в APC (ліниве завантаження, оптимізація блокувань, "підігрів" кешу) і ряд власних розширень (клієнт memcache, формат серіалізації, логи, статистика, моніторинг, механізм асинхронної обробки подій).
Схема формування стрічки новин
Культура розробки Facebook
- Рухатися швидко та не боятися ламати деякі речі;
- великий вплив дрібних команд;
- бути відвертим та інноваційним;
- повертати інновації в Opensource спільноту.
Доробки MySQL
Тепер про базу даних. На відміну від переважної більшості сайтів, MySQL у Facebook використовується як просте сховище пар "ключ-значення". Велика кількість логічних баз даних розподілена по фізичних серверах, але реплікація використовується лише між датацентрами. Балансування навантаження здійснюється перерозподілом баз даних машинами. Так як дані розподілені практично випадковим чином, ніякі операції типу JOIN, що об'єднують дані з декількох таблиць, в коді не використовуються. У цьому є сенс. Адже нарощувати обчислювальні потужності набагато простіше на веб-серверах, ніж на серверах баз даних.
У Facebook використовується практично не модифікований вихідний код MySQL, але з власними схемами партиціонування поглобально-унікальним ідентифікаторам та архівуванню, заснованому на частоті доступу до даних. Принцип дуже ефективний, оскільки більшість запитів стосуються найсвіжішої інформації. Доступ до нових даних максимально оптимізований, а старі записи автоматично архівуються. Крім цього використовуються свої бібліотеки для доступу до даних на основі графа, де об'єкти (вершини графа) можуть мати лише обмежений набір типів даних (ціле число, рядок обмеженої довжини, текст), зв'язку (ребра). графа) автоматично реплікуються, утворюючи аналог розподілених зовнішніх ключів.
Використання Memcached
Facebook дуже активно займаються доопрацюванням проекту з питань продуктивності. Більшість з описаних нижче доробок були включені в opensource версію memcached: порт на 64-бітну архітектуру, серіалізація, багатопоточність, компресія, доступ до memcache через UDP (зменшує витрату пам'яті завдяки відсутності тисяч буферів TCP-з'єднань ). На додаток було внесено деякі зміни в ядро Linux для оптимізації роботи memcache. Наскільки це дієво? Після перерахованих вище модифікацій memcached здатний виконувати до 250 000 операцій на секунду в порівнянні зі стандартними 30 000 - 40 000 в оригінальній версії.
Фреймворк Thrift
Ще однією інноваційною розробкою Facebook є проект Thrift. По суті, це механізм побудови додатків з використанням декількох мов програмування. Основна мета - надати технологію прозорого взаємодії між різними технологіями програмування. Thrift пропонує розробникам спеціальну мову опису інтерфейсів, статичний генератор коду, а також підтримує безліч мов, у тому числі C++, PHP, Python, Java,Ruby, Erlang, Perl, Haskell. Можливий вибір транспорту (сокети, файли, буфери пам'яті) та стандарту серіалізації (бінарний, JSON). Підтримуються різні типи серверів: неблокуючі, асинхронні як однопотокові, так і багатопотокові. Альтернативними технологіями є SOAP, CORBA, COM, Pillar, Protocol Buffers, але у всіх є свої істотні недоліки, і це змусило Facebook розробити свою власну. Важлива перевага Thrift'а полягає у продуктивності. Він дуже і дуже швидкий, але це не головний його плюс. З появою Thrift на розробку мережевих інтерфейсів і протоколів йде набагато менше часу. У Facebook технологія входить до загального інструментарію, який знайомий будь-якому програмісту. Зокрема, завдяки цьому вдалося ввести чіткий поділ праці: робота над високопродуктивними серверами тепер ведеться окремо від роботи над додатками. Thrift, як і багато інших розробок Facebook, зараз перебуває у відкритому доступі.
Повернення інновацій
Інформація про взаємодію Facebook з opensource-спільнотою цих та інших проектів розташована на сторінці, присвяченій opensource.
Зберігання фотографій
- при завантаженні на сервер програма приймає зображення, створює мініатюри в потрібних дозволах, зберігає в NFS;
- під час завантаження із сервера зображення віддаються безпосередньо з NFS через HTTP.
Такий простий підхід був необхідний, щоб спочатку перевірити, що продукт затребуваний користувачами, і вони дійсно будуть активно завантажувати фотографії. Нова фіча, як відомо, "поперла". Але на практиці виявилося, що файлові системи непридатні для роботи з великою кількістю невеликих файлів. Метадані не містятьсяв оперативну пам'ять, що призводить до додаткових звернень до дискової підсистеми. Обмежуючим фактором є введення-виведення, а не щільність зберігання. Першим кроком з оптимізації стало кешування. Найбільш часто використовувані мініатюри зображень кешувалися в пам'яті на оригінальних серверах для масштабованості та продуктивності, а також розподілялися по CDN (географічно розподіленої мережевої інфраструктури) для зменшення мережних затримок. Це дало результат. Пізніше виявилось, що можна зробити ще краще. Зображення стали зберігати у великих бінарних файлах (blob), надаючи додатку інформацію про те, в якому файлі та з яким відступом (по суті, ідентифікатором) від початку розташована кожна фотографія. Такий сервіс у Facebook отримав назву Haystack і виявився вдесятеро ефективнішим за "простий" підхід і втричі ефективніший за "оптимізований". Як кажуть, все геніальне просто!
Принцип роботи пошуку у Facebook
Підбиваємо підсумки
Не секрет, що стек LAMP ефективний і придатний для створення найскладніших систем, але при цьому далеко не ідеальний. Звичайно, PHP+MySQL+Memcache вирішують більшість завдань, але далеко не всі. Кожен великий проект стикається з тим, що:
- PHP не може зберігати стан;
- PHP не найпродуктивніша мова;
- усі дані знаходяться віддалено.
Facebook'у (та й будь-яким іншим великим проектам) доводиться розробляти власні внутрішні сервіси, щоб компенсувати недоліки основних технологій, перенести код, що виконується ближче до даних, зробити ресурсомісткі частини коду більш ефективними, реалізувати переваги, які доступні лише у певних мовах програмування. Блискавичнаобробка запитів від жахливої кількості користувачів досягається за рахунок комплексного підходу до розподілу запитів по тисячах серверів та безперервної роботи над усуненням вузьких місць у системі. У компанії є багато невеликих команд з повноваженнями приймати важливі рішення, що в сукупності з короткими циклами розробки дозволяє дуже швидко рухатися вперед і оперативно вирішувати всі проблеми. Результат перевірити нескладно. Відкрий facebook.com.
Додатковий інструментарій
Для управління такою величезною системою у Facebook'і були створені різні додаткові сервіси. Усього їх понад п'ятдесят, наведу кілька прикладів:
- SMC (консоль управління сервісами) - централізована конфігурація, визначення, на якій фізичній машині працює логічний сервіс;
- ODS — інструмент для візуалізації змін будь-яких статистичних даних, наявних у системі — зручний для моніторингу та оповіщень;
- Gatekeeper — поділ процесів розгортання та запуску, A/B-тестування (метод, що дозволяє визначити, яка версія сторінки краще умовляє відвідувачів зробити ту чи іншу дію).