Небольшая выжимка:
- Социальный граф - набор объектов и связи между ними. Например: пост связан с пользователем, фотография к посту связана с постом, коментарии и лайки других пользователей связаны с постом, пользователи могут иметь отношение дружбы, и т.д.
- Чтобы отрисовать страницу пользователя, нужно загрузить все ноды графа, связанные с последним событием;
- На загрузку одной ноды графа отводится 1 милисекунда;
- Особенность кеширования - наиболее горячие данные те, которые недавно создались;
- У каждого объекта графа есть уникальный 64 битный глобальный идентификатор. Уникальность гарантируется так: в идентификаторе объекта N бит отводится под идентификатор пользователя, остальные биты под событие. Главное для каждого пользователя уметь получить следующий уникальный идентификатор события. Это не сложно и не требует глобальной синхронизации.
- В качестве хранилища свой отбранчёванный MySQL с InnoDB;
- Многоуровневое кеширование c Memcached и McRouter;
- Есть процедура прогревания кеша;
- 99.8% - чтение данных, 0.2% - запись;
- 3 датацентра в США, 1 в Европе;
- В каждом ДЦ есть мастер нода MySQL. Все записи идут в мастер ноду, далее асинхронно реплицируются;
- Если мастер нода падает, выбирается новая мастер нода;
- Чтобы не задолбать бэкенд, над каждым инстансом MySQL располагается Master Cache, через который идут все запросы в этот инстанс. Это позволяет контролировать нагрузку на MySQL;
- Очень большой кеш-хит, поэтому до бэкенда MySQL долетает мало запросов (около 1 KRPS на инстанс);
- Если все кеши отвалятся, MySQL бекенд нагрузку не выдержит;
- Для проведения аналитики по социальному графу есть выгрузка данных в Hive;
- Шардируют базу по диапазонам идентификатора, поэтому процедуры перешардирования нет;
- Есть региональные прокси для снижения латентности https handshake;
Более подробно можно почитать в статье