Facebook архитектура 500 милиона потребители
Съдържанието на статията
Филмът "Социалната мрежа" добре илюстрира феномена на развитието на Facebook, който успя да събере страхотна, немислима досега аудитория за рекордно кратко време. Зад кулисите обаче остана още един компонент от проекта - как работи отвътре. Техническото му устройство.
Какво е Facebook сега? Това най-добре се демонстрира със сухи числа:
Как работи всичко това?
Мащабируемост, простота, откритост
- Операционна система - Linux;
- основен език за програмиране - PHP + добавка;
- агресивно кеширане на обекти - memcached;
- съхранение на данни под формата на двойки ключ-стойност - MySQL;
- универсална система за събиране и агрегиране на данни от работещи сървъри - Scribe.
Инструментът за балансиране на натоварването избира php сървър за обработка на всяка заявка, където HTML се генерира въз основа на различни източници (като MySQL, memcached) и специализирани услуги. Така архитектурата на Facebook има традиционния изглед на три нива:
- уеб приложение;
- разпределен индекс;
- постоянно съхранение.
Вярвам, че ще бъде най-интересно да чуем как проектът успя да използва най-познатите технологии. И наистина има доста нюанси.
Какво обикновено се случва след 20 минути във Facebook?
PHP проект
Това повдига въпроса: защо PHP? В много отношения - просто "исторически развити." Той е много подходящ за уеб разработка, лесен за научаване и работа с него, огромна гама от библиотеки е достъпна за програмистите. Освен това има огромна международна общност. От негативната странаможе да се нарече висока консумация на RAM и изчислителни ресурси. Когато обемът на кода стане твърде голям, към този списък са добавени слабо въвеждане, линейно нарастване на разходите при включване на допълнителни файлове, ограничени възможности за статичен анализ и оптимизация. Всичко това започна да създава големи трудности. Поради тази причина Facebook внедри много подобрения в PHP, включително оптимизиране на байт код, подобрения в APC (отложено зареждане, оптимизиране на заключване, затопляне на кеша) и редица свои собствени разширения (memcache клиент, формат за сериализиране, регистрационни файлове, статистика, мониторинг, асинхронен механизъм за обработка на събития).
Схема за генериране на новинарски канал
Култура на развитие на Facebook
- Движете се бързо и не се страхувайте да счупите нещата;
- голямо влияние на малките екипи;
- бъдете откровени и иновативни;
- върнете иновациите в общността с отворен код.
Подобрения в MySQL
Сега за базата данни. За разлика от по-голямата част от сайтовете, MySQL на Facebook се използва като просто хранилище за ключ/стойност. Голям брой логически бази данни са разпределени върху физически сървъри, но репликацията се използва само между центровете за данни. Балансирането на натоварването се извършва чрез преразпределяне на бази данни между машини. Тъй като данните се разпределят почти произволно, в кода не се използват JOIN операции , които комбинират данни от множество таблици. Има смисъл в това. В края на краищата увеличаването на изчислителната мощност е много по-лесно на уеб сървъри , отколкото на сървъри на бази данни.
Facebook използва практически немодифициран изходен код на MySQL, но със свои собствени схеми за разделяне.глобално уникални идентификатори и архивиране въз основа на честотата на достъп до данни. Принципът е много ефективен, тъй като повечето искания са за най-актуалната информация. Достъпът до нови данни е максимално оптимизиран, а старите записи се архивират автоматично. В допълнение, техните собствени библиотеки се използват за базиран на графика достъп до данни, където обектите (върховете на графика) могат да имат само ограничен набор от типове данни (цяло число, низ с ограничена дължина, текст), и връзките (ръбовете на графиката) се репликират автоматично, образувайки аналог на разпределени чужди ключове.
Използване на Memcached
Facebook е много активен във финализирането на проекта по проблеми с производителността. Повечето от подобренията, описани по-долу, бяха включени във версията с отворен код на memcached: порт към 64-битова архитектура, сериализация, многопоточност, компресия, достъп до memcache чрез UDP (намалява потреблението на памет поради липсата на хиляди TCP свързващи буфери). В допълнение, в ядрото на Linux са направени някои промени за оптимизиране на производителността на memcache. Колко ефективно е? След горните модификации, memcached е в състояние да изпълни до 250 000 операции в секунда в сравнение със стандартните 30 000 - 40 000 в оригиналната версия.
Thrift Framework
Друга иновативна разработка на 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 с общността с отворен код за тези и други проекти може да бъде намерена на страницата с отворен код.
Съхранение на снимки
- при качване на сървъра, приложението взема изображението, създава миниатюри в необходимите резолюции, записва го в NFS;
- когато се изтеглят от сървъра, изображенията се сервират директно от NFS чрез HTTP.
Този прост подход беше необходим, за да се провери първо дали продуктът е търсен от потребителите и дали те наистина ще качват активно снимки на . Новата функция, както знаете, "наводнена". Но на практика се оказа, че файловите системи не са подходящи за работа с голям брой малки файлове. Метаданните не отговаряткъм RAM, което води до допълнителни заявки към дисковата подсистема. Ограничаващият фактор е I/O, а не плътност на съхранение. Първата стъпка на оптимизация беше кеширането. Най-често използваните миниатюри на изображения бяха кеширани в паметта на оригиналните сървъри за мащабируемост и производителност и разпространени през CDN (географски разпределена мрежова инфраструктура), за да се намали мрежовото забавяне. Това даде резултат. По-късно се оказа, че може и по-добре. Изображенията започнаха да се съхраняват в големи двоични файлове (блобове), предоставяйки на приложението информация за това в кой файл и с какъв отстъп (всъщност идентификатор) се намира всяка снимка от самото начало. Facebook нарече тази услуга Haystack и тя беше десет пъти по-ефективна от "простия" подход и три пъти по-ефективен от "оптимизирания". Както се казва, всичко гениално е просто!
Как работи търсенето във Facebook
Обобщаване
Не е тайна, че стекът LAMP е ефективен и способен да изгражда най-сложните системи, но далеч не е съвършен. Разбира се, PHP+MySQL+Memcache решава по-голямата част от задачите, но не всички. Всеки голям проект е изправен пред че:
- PHP не може да съхранява състояние;
- PHP не е най-продуктивният език;
- всички данни са отдалечени.
Facebook (и наистина всеки друг голям проект) трябва да разработи свои собствени вътрешни услуги, за да компенсира недостатъците на основните технологии, да премести изпълнимия код по-близо до данните, да направи ресурсоемките части от кода по-ефективни, да реализира ползи, които са налични само в определени езици за програмиране. Светкавицаобработването на заявки от огромен брой потребители се постига чрез интегриран подход към разпределяне на заявки в хиляди сървъри и непрекъсната работа за премахване на тесните места в системата. Компанията разполага с много малки екипи с авторитет за вземане на важни решения, което, съчетано с кратки цикли на развитие , ви позволява да се движите напред много бързо и бързо да решавате всички проблеми. Резултатът е лесен за проверка. Отворете facebook.com.
Допълнителни инструменти
За да управлява такава огромна система, Facebook създаде различни допълнителни услуги. Има повече от петдесет от тях, ще дам няколко примера:
- SMC (Service Management Console) - централизирана конфигурация, определяща на коя физическа машина се изпълнява логическа услуга;
- ODS е инструмент за визуализиране на промените във всякакви статистически данни, налични в системата - удобен за наблюдение и сигнали;
- Gatekeeper - разделяне на процесите на внедряване и стартиране, A / B тестване (метод, който ви позволява да определите коя версия на страницата най-добре убеждава посетителите да предприемат това или онова действие).