Уроки масштабирования от YouTube для Python стартапов

Рубрика:

Представляем вам несколько уроков от главного разработчика проекта YouTube, Майка Соломона. Его выступление на PyCon, содержащее фундаментальные уроки масштабируемости, которые YouTube усвоил за 7 лет, вложилось в 30 минут.

Статистика YouTube

  • 4 миллиарда показов в день
  • Каждую минуту загружаются 60 часов видео
  • Более 350 миллионов устройств, использующих YouTube
  • Двойной доход в 2010 году
  • 1 миллион строк кода на Python

Стек

  • Python - большинство строк кода для YouTube написаны на Python.
  • Apache – если вы думаете, что он уже свое отжил, не стоит. Он помогает сохранять технологию YouTube простой, так что каждый запрос проходит через Apache.
  • Linux - преимущество Linux в том, что ты всегда можешь найти и посмотреть, как ведет себя система. Независимо от того, как плохо ведет себя приложение, можно его проверить с помощью таких инструментов Linux, как strace и tcpdump.
  • MySQL – используется чаще всего, например, когда вы смотрите видео.
  • Vitess - новый проект, выпущенный YouTube, написанный на Go, это - фронтэнд для MySQL. Он производит значительную оптимизацию на лету, переписывает запросы и действует, как прокси. В настоящее время он обслуживает каждый запрос к базе данных YouTube. Основан на RPC.
  • Zookeeper - распределенный сервер блокировки. Он используется для конфигурации. Действительно интересная часть технологии. Нелегкий в использовании, так что лучше почитать мануал.
  • Wiseguy - контейнер сервлета CGI.
  • Spitfire – система обработки шаблонов. Она имеет дерево абстрактного синтаксиса которое, позволяет делать преобразования для более быстрой работы.
  • Форматы сериализации - независимо от того, какой вы используете, они все очень дорогие. К тому же те, которые можно скачать, работают очень медленно. Разработчики YouTube yаписали свою собственную реализацию BSON, которая работает в 10-15 раз быстрее.

Общие уроки

Главный совет YouTube: выберите самое простое решение возможное с самыми слабыми, но практичными гарантиями. Дело в том, что для решения проблем вам в первую очередь нужна гибкость. Причина требуете все эти вещи, является гибкость потребности, чтобы решить проблемы. Минуты, потраченные на определение чего-либо, загоняет вас в угол. Не старайтесь выполнять эти гарантии, из-за чрезмерного стремления их выполнить, ваша проблема усугубляется, и вы не оставляете себе выхода. 

В чем заключается масштабируемость. Масштабируемая система – это та, которая вам не мешает. Это то, что вам не постигнуть, не просто слова, это - общая задача по поиску идеала.

Признак хорошего проекта системы: Каждая система адаптирована в соответствии с ее определенными требованиями. Все зависит от специфических особенностей того, что вы создаете.

YouTube не асинхронный, все разбито на блоки.

YouTube верит скорее в философию, чем  в доктрину. Что это означает? Если вы пересматриваете код, и это влечет за собой изменение тысячи строк кода и многих файлов,  скорее всего, это можно было бы сделать проще. Первая демо-версия должна быть простой, далее усложняйте в каждой итерации.

Решение всех проблем – Простота. Ищите самый простой способ решения набора проблем. Есть много сложных проблем, но первое решение не должно быть сложным. Сложность придет сама собой со временем.

Многие системы YouTube начинались, как один файл Python, и становились большими экосистемами по прошествии многих лет.

Главные вопросы в анализе проекта:

  • Какое первое решение?
  • Как вы собираетесь выполнять итерации?
  • Что мы знаем о том, как эти данные будут использоваться?

Все меняется в течение долгого времени. То, с чего начинался YouTube, не имеет ничего общего с тем, что он есть сейчас. YouTube запускался как сайт знакомств. Так что, будьте гибкими.

YouTube CDN. Сначала они заключали для этого контракт со сторонними провайдерами. Но это было очень дорого, и они сделали его сами. Вы можете сами создать вполне хороший видео CDN, если у вас есть хороший специалист по  железу. Создаете очень большую стойку, вставляете машины, затем берете lighttpd, и затем заменяете 404 handler, чтобы найти видео, которое не нашлось. Это заняло две недели, и в первый день он обработал 60 гигабит. Многое можно сделать, используя реально простые инструменты.

Вы должны измеряться. Vitess выгружал один из своих протоколов для реализации HTTP. Это было медленно даже при том, что это было в C. Таким образом, они сорвали HTTP и сделали прямой вызов сокета, используя Python, и это было на 8% дешевле на глобальном ЦП. Окружение для HTTP – это довольно дорого.

Методы масштабируемости

Это не новые идеи, но удивительно, как несколько фундаментальных идей могут применяться в совершенно разных измерениях.

Разделяй и властвуй, как метод масштабирования

  • Все связанное с разделением, работает. Решение, как выполнить это, применяется ко многим вещам, например, для яруса веб-узлов, у вас есть много веб-серверов, которые более или менее тождественны и независимы и вы наращиваете их горизонтально.
  • Это главный вопрос шардинга баз данных. Как вы оформляете партицирование, и связываете части, на которые подразделили. Это вещи, которые необходимо прояснить, потому что они получают большее влияние с ростом.
  • Большую ценность приобретают простые и свободные соединения.
  • Достигнуть этого помогает динамический характер Python. Независимо от того то, насколько плох ваш API, вы можете сделать заглушку, или изменить или преобразовать  ваш выход из большого количества проблем.

Приблизительная корректность – это легкий обман

  • Другой любимый метод. Состояние системы – это то, что мы видим в отчете. Если пользователь не может сказать, что часть системы некорректна и противоречива, то это не так.
  • Пример из жизни. Если вы пишете комментарий, и одновременно кто-то загружает страницу, они могут не вложиться в 300-400 мс, но пользователя, который читает страницу, это не волнует. Но тому, кто пишет комментарий, не будет все равно, и вы должны быть уверены, что пользователь, который написал комментарий, будет его видеть. Таким образом, вы немного хитрите. У системы не должно быть глобально согласующихся транзакций. Это было бы слишком дорого и излишне. Не каждый комментарий – это финансовая операция. Поэтому знайте, когда сможете схитрить.

Обман – знайте, как сфальсифицировать данные.

  • Удивительная техника. Самый быстрый вызов функции - тот, который не происходит. Когда у вас есть монотонно увеличивающийся счетчик, как число просмотров видео или профиля, вы могли бы производить транзакцию с каждым обновлением. Или вы можете выполнять транзакцию через некоторый промежуток времени и обновлять рандомной суммой и, пока она изменяется с нечетного на четное значение, люди, вероятно, будут полагать, что оно реально. Знайте, как подделать данные.

Масштабируемые компоненты

  • Вы должный досконально знать свой API. Насколько хорошо определены входящие данные, насколько хорошо вы понимаете то, что получаете, какие данные вы получаете на выходе – все это фактически помогает понимать приложение без документации. Вы можете сказать, что происходит, до и после вызова функции.
  • В Python чаще всего все сводится RPC (Remote Procedure Call). Структура кода основывается на дисциплине программистов. Поэтому установите хорошие соглашения кода, когда все остальное перестает работать, у вас есть стена RPC, таким образом, вы знаете то, что имеете на входе и что на выходе.
  • Ваши компоненты не будут идеальными. Если что-то не работает, это всегда можно изменить, переписать на Python или С, что-то возможно придется удалить вовсе. Предугадать это заранее невозможно.
  • С таким количеством людей в команде, никто не будет знать систему полностью, таким образом, нужно тчательно определить компоненты.
Источник: 
http://highscalability.com/blog/2012/3/26/7-years-of-youtube-scalability-lessons-in-30-minutes.html

Рекомендуем просмотреть раздел Все новости нашего сайта