Выбирайте самое простое решение с наиболее общими гарантиями, которые практически полезны.
- Дао YouTube
YouTube практически на протяжении всех 7 лет своего существования является мировым лидером в сфере интернет-видео. С точки зрения технической реализации проект оказался достаточно консервативным - команда придерживается того же курса и стека технологий, с которых все начиналось еще до приобретения проекта Google. Но с 2008 года, когда я написал первый обзор архитектуры YouTube, все же произошли интересные изменения, о которых я и хотел бы сегодня вкратце рассказать.
Статистика
- 4 млрд. просмотров страниц в день
- 60 часов видео загружается каждую минуту
- 350 миллионов устройств подключено к YouTube
- На февраль 2012 года в США по данным comScore:
- 147,4 млн. уникальных зрителей
- 16,7 млрд. просмотров видео (в октябре 2011 было больше 20 млрд.)
- Каждый зритель посмотрел в среднем 7 часов видео за месяц
- 1.1 млрд. просмотров видео рекламы, суммарной длительностью в 10.8 млн. часов
Технологии
- Linux - операционная система
- Apache - основной HTTP-сервер
- lighttpd - отдача видео из YouTube CDN
- Zookeeper - распределенные блокировки, хранение конфигураций
- wiseguy - FastCGI-прослойка между Apache и Python
- pycurl - лучшая доступная реализация HTTP-клиента, но в итоге все равно заменили на самописное низкоуровневое решение, выиграв 8% в потреблении вычислительных ресурсов.
- spitfire - высокопроизводительный шаблонизатор на основе абстрактного синтаксического дерева с регулируемым уровнем оптимизации (как в gcc)
- bson в качестве формата сериализации
BigTable - хранение изображений
- MySQL - используется просто как хранилище данных, версия 5.1.52 с InnoDB
- Vitess - система для масштабирования MySQL-кластера
Vitess
- Основная цель проекта - предоставление всех необходимых инструментов и серверов для горизонтального масштабирования баз данных на основе MySQL, с учетом потребностей современных интернет-проектов.
- Реализован на Go - все еще экзотическом языке программирования, также родившемся в стенах Google. Сравним по производительности с C++ и Java, но несколько более "выразителен".
- Опубликован в opensource 24 февраля 2012 года, совсем недавно, так что YouTube - по-прежнему единственный пример его использования на практике в крупном проекте.
- Готовые клиентские библиотеки пока только для Python и Go, что не удивительно, но есть и универсальные интерфейсы на основе HTTP и просто TCP-сокетов.
- Основной формат данных - bson, как и в MongoDB, но по словам разработчиков Vitess их реализация выполняет (де)сериализацию в 10-15 раз быстрее.
- Ядром проекта выступает Vtocc, SQL-прокси с RPC интерфейсом, позволяющий перераспределять запросы от большого количества (более 10 тыс.) одновременно подключенных клиентов в сравнительно небольшое количество соединений с базами данных. Пропускная способность порядка 10 тыс. запросов в секунду.
- Встроенные возможности Vtocc:
- парсер и анализатор SQL-запросов для оптимизации их выполнения;
- заполнение типичных запросов переменными с поддержкой кэширования результатов;
- управление транзакциями и сроками их выполнения ("убивает" затянувшиеся);
- для каждого пространства ключей (логической таблицы) можно указать фактор репликации, что создаст необходимое количество второстепенных баз данных в дополнение к мастеру;
- можно явно указать, что чтение необходимо произвести с мастера (важно когда пользователь только что выполнил какое-то действие и должен сразу же увидеть его результат);
- отдельные пулы соединений для выполнения операций чтения и записи;
- исключение "зависших" соединений из пулов;
- перезапуск без простоя системы;
- поддержка DML.
Партиционирование
- Во всех таблицах должна быть колонка с уникальным ключем, на основе которого данные будут распределяться по кластеру.
- Партиционирование основано на диапазонах ключей, что позволяет держать "карту" партиций в памяти и очень быстро определять где располагаются те или иные данные, но обратной стороной медали является вероятное возникновение "горячих" узлов в кластере, особенно при монотонно увеличивающихся значениях ключей (рекомендуется использовать случайные).
- Поддерживаются ключи в виде натуральных чисел или произвольных бинарных данных.
- При высокой нагрузке на одну партицию она может быть распределена на две путем фильтрованной репликации; в дальнейшем планируется реализовать и обратный процесс.
- Еще в планах:
- Поэтапное внесение изменений в схему данных без видимого простоя системы;
- Поддержка работы в нескольких датацентрах с концентрацией мастер-серверов в одном датацентре и использования остальных в режиме только для чтения.
Подводим итоги
- YouTube - еще один проект мирового масштаба, который с самого начала использовал MySQL и оказался не в силах от него отказаться, не смотря на трудности с горизонтальным масштабированием.
- По аналогичному пути пошли и другие проекты, схожие с Vitess надстройки над MySQL используются в Facebook и Twitter:
- В Facebook она дополнена сильной интеграцией с memcached и сильно ограниченным интерфейсом, не имеющим практически ничего общего с SQL. Планы о публикации в opensource, кажется, были, но я не слышал чтобы они воплотились в жизнь. // Уже почти дописав статью случайно заметил в коде, а потом и мелким шрифтом в документации, что в Vitess тоже используется memcached для кэширования из-за проблем со сборщиком мусора Go.
- Twitter по-прежнему использует свою связку FlockDB + Gizzard на Scala, которые уже пару лет публично доступны. В отличии от Vitess она заточена на хранение информации о социальных графах, по-этому сфера её применения как в Twitter, так и за его пределами ограничена.
- Vitess - пожалуй первая относительно успешная попытка построить распределенную горизонтально масштабируемую СУБД на основе реляционной базы данных, сохранив при этом SQL-интерфейс, пускай и с некоторыми ограничениями.
- Выбирайте подходящее хранилище для каждого типа данных в системе - если Vitess стал подходящим решением для структурированных данных вроде информации о пользователях, метаданных видео и комментариев, это не значит, что он хорошо (или плохо) справится, например, с медиа-файлами вроде изображений и видео (для них в YouTube по-прежнему используют стек технологий Google, подробности не публикуются).
- Python - вполне пригодный инструмент для реализации бизнес-логики интернет-проектов, свет клином на PHP не сошелся. Python предлагает широкий ассортимент инструментов для решения любых типичных для интернет-проектов задач, хотя субъективно выбор некоторых из них разработчиками YouTube мне кажется странным.
В комментариях предлагаю обсудить слабые и сильные стороны использования надстроек над реляционными базами данных, скажем по сравнению с использованием изначально-распределенных СУБД, таких как Riak, Cassandra и многих других. Может быть кто-то уже успел прикрутить к своему проекту Vitess или хотя бы FlockDB и готов поделиться впечатлениями?
Источники информации
- Mike Solomon на PyCon'12 (один из первых разработчиков проекта)
- О проекте Vitess
- Статистика comScore на февраль '12
24 марта 2012 | | Высокие нагрузки