Showing posts with label MySQL. Show all posts
Showing posts with label MySQL. Show all posts

Wednesday, January 29, 2014

YouTube


Онлайн видео портал YouTube вырос невероятно быстро, более миллиарда просмотров видео в день, с командой из нескольких экспертов.
Платформа
  • Apache
  • Python
  • Linux (SuSe)
  • MySQL
  • psyco, динамический python->C компилятор
  • lighttpd для видео вместо Apache
Взгляд изнутри
  • Более одного миллиарда просмотров видео в день
  • Основан 2/2005
  • 3/2006 30 миллионов просмотров в день
  • 7/2006 100 миллионов просмотров в день
  • 2 системных администратора, 2 архитектора по масштабированию
  • 2 разработчика интерфейсов, 2 сетевых инженера, 1 DBA
  • NetScalar используется для балансировки нагрузки и кеширования статичного контента.
  • Apache запускается с mod_fast_cgi.
  • Запросы маршрутизируются на обработку серверу приложений на Python.
  • Сервер приложений общается с различными БД и другими источниками информации, необходимыми.
  • Горизонтальное масштабирование простым добавлением машин.
  • Код Python обычно не является узким местом, большинство времени он ожидает ответа RPC.
  • Python позволяет быструю и гибкую разработку и внедрение новых функций. Это особо критично в свете сложностей, с которым сталкивается проект.
  • Обычно менее 100 мс на обработку страницы.
  • Использование psyco, динамического python->C компилятора, который при помощи JIT подхода оптимизирует внутренние циклы.
  • Для высокозатратных действий для CPU, таких как шифрование, используются С расширения.
  • Предвариетльная генерация и кеширование HTML для тяжелых в рендеринге страниц.
  • Кеширование на уровне записей в БД.
  • Полностью сформированные объекты Питона кешируются.
  • Некоторые данные вычисляются и отправляются в приложение, где они кешируются в локальной памяти. Это малоиспользуемая стратегия. Самый быстрый кеш в сервере приложений и это не занимает много времени, разослать предварительно вычисленные данные на все сервера. Нужен только агент, который мониторит изменения, делает предварительные вычисления и отправляет данные.
Доставка видео
  • Стоимость доставки включает стоимость канала, оборудования и энергопотребления.
  • Каждое видео обслуживается мини кластером. Каждое видео обслуживается более чем одним сервером.
  • Использование кластера означает:
    • больше дисков обслуживают контент — больше скорость чтения.
    • централизованное управление — если один сервер выходит из строя, другие берут на себя его функции.
    • онлайн бэкап.
  • Сервера используют lighttpd для видео:
    • Apache обладал большим оверхедом.
    • Использует epoll для ожидания множества fds.
    • Переключились с одного процесса на многопроцессную конфигурацию для обслуживания большего количества подключений.
  • Наиболее популярный контент передается CDN:
    • CDN реплицирует контент в нескольких местах. Таким образом увеличивается вероятность нахождения контента ближе к пользователю, с меньшим числом hop’ов.
    • CDN сервера выдают контент из памяти, т.к. контент очень популярен, поэтому передвижение контенти из кеша и в кеш случаются редко
  • Менее популярный контент (1-20 просмотров в день) использует сервера YouTube с различных площадок.
    • Эффект длинного хвоста. Видео редко смотрят, но такого видео очень много. Необходим доступ к произвольным секторам дисков.
    • Кеширование контента не особо помогает в данном случае, поэтому затраты на кеш скорее всего не дадут результата. Поэтому если Ваш продукт обладает эффектом длинного хвоста, то скорее всего механизмы кеширования Вас не спасут.
  • Тюнинг RAID контроллера и других низкоуровневых вещей, которые могут помочь.
  • Тюнинг памяти на серверах до оптимального размера.
Обслуживание скриншотов
  • Удивительно сложно реализовать эффективно.
  • Каждому видео соответствует 4 скриншота, поэтому скриншотов гораздо больше.
  • Скриншоты хранятся на 4х машинах.
  • Встретили проблемы обработки большого количества мелких объектов:
    • Большое количество seek’ов по диску и проблемы inode кешем и page кешем на уровне ОС.
    • Достигли лимита директорий, в частности Ext3. Перешли на более иерархическую структуру.
    • Последние доработки в 2.6 kernel могут улучшить Ext3 работу с большими директориями в 100 раз, но вообще хранение большого количества файлов в файловой системе не очень хорошая идея.
    • Большое количество запросов в секунду, т.к. одна страница может иметь до 60 скриншотов.
    • Под такой нагрузкой Apache вел себя плохо.
    • Использовалие squid (reverse proxy) перед Apache’м. Некоторое время это спасало, но с ростом нагрузки производительность падала (с 300 запросов в секунду до 20).
    • Попробовали использовать lighttpd но с единым потоком он подвисал. Встретили проблемы многопроцессности, т.к. каждый процесс содержал свой отдельный кеш.
    • С таким количеством изображений установка нового сервера занимала 24 часа.
    • Перезагрузка машини занимала 6-10 часов на прогрев кеша и сокращения количества обращений к жесткому диску.
  • Для решения проблем начали использовать Google BigTable, распределенное хранилище данных:
    • Устранение проблемы мелких файлов, т.к. файлы слепляются
    • Быстрый, отказоустойчиывай. Предполагает работу в ненадежной сети.
    • Сниженные задержки, т.к. используется распределенный многоуровневый кеш. Этот кеш работает между множеством разных площадок с оборудованием.
База данных
Ранние годы:
  • Используют MySQL для хранения метаданных, таких как пользователи, теги и описания.
  • Обслуживали данные монолитными разделами RAID 10 с 10 дисками.
  • Прошли стандартные этапы эволюции: один сервер, один мастер с несколькими серверами на чтение, partitioning базы данных, переход к шардам.
  • Проблемы с задержками репликации. Мастер многопоточный запускался на мощном сервере, так что он мог обрабатывать много запросов. Сервера на чтение однопоточные и, как правило, запускались на менее производительных машинах. Репликация асинхронная, поэтому сервера на чтение могли существенно отставать от мастера.
  • Использование архитектуры с репликацией приводит к существенным затратам на производительность записи реплицируемых данных.
  • Одним из решений была приоритезация трафика при помощи разделения его на два кластера — кластер видео доставки и кластер общего назначения. Идея была в том, что просмотр видео является основной функцией, на которую должно выделяться больше ресурсов. Социальные функции менее приоритетны и они могут обрабатываться менее производительным кластером.
Последние годы:
  • Перешли на использование partitioning
  • Разделили БД на шарды, пользователей распределяют по разным шардам.
  • Рспределение чтения и записи.
  • Повышенная локальность кеша, приводящая к меньшему количеству IO.
  • Привело к 30% снижению количества оборудования.
  • Снизили задержку реплицирования до нуля.
  • Возможность неограниченного масштабирования БД.
Выводы
    Борьба за время. Креативные и рискованные заплатки могут решить проблему в краткосрочной перспективе пока Вы работаете над долгосрочным решением.
    Приоритеты. Знайте, что наиболее важно для Вашего сервиса и расставляйте приоритеты Вашему персоналу, концентрируйте усилия на приоритетных направлениях.
    Ввязывайтесь лишь в свои битвы. Не бойтесь аутсорсинга некоторых основополагающих сервисов. YouTube использует CDN услуги для доставки наиболее популярного контента. Создание своей собственной сети доставки занимает слишком много времени и стоит слишком дорого. Скорее всего у Вас есть такие же возможности для повышения эффективности Вашего проекта. Обратите взгляд на идеологию Software/Infrastructure as a Service за дополнительными идеями.
    Сохраняйте простоту! Простота реализации позволяет Вам изменять архитектуру намного быстрее, тем самым Вы можете решать проблемы существенно быстрее. Правда в том, что никто не знает, что такое простота, но если Вы не боитесь делать изменения — то это хороший знак того, что простота имеет место быть.
    Шард (Shard). Механизм шард позволяет изолировать хранение данных, CPU, память и операции IO. Это не только увеличивает производительность записи.
    Постоянные итерации по узким местам:
    - ПО: БД, кеширование
    - ОС: операции I/O
    - Оборудование: память, RAID
    Команда. Наличие отличной, разносторонне опытной команды, которая понимает как работает система в целом и что внутри системы. С хорошей командой возможно все.

Friday, October 25, 2013

PHP, MySQL Apache - MAC OS X


MAMP - PHP,MySQL,Apache для MAC OS X Snow Leopard 10.5

PHP Активация

1. Запускаем терминал
2. Выполняем sudo -s
3. Вводим пароль - toimage
4. Выполняем nano /etc/httpd/httpd.conf
5. Переходим к строкам и раскомментируем их ( то есть убираем значок # перед строкой)

Строка 240 которая выглядит так: LoadModule php4_module libexec/httpd/libphp4.so -
Строка 284 которая выглядит так: AddModule mod_php4.c

6. Переходим дальше по строкам и правим их:

Строка 445 должна выглядеть так: DirectoryIndex index.html index.htm index.php index.phtm index.phtml
Строка 848 должна выглядеть вот так: LanguagePriority ru en da nl et fr de el it ja kr no pl pt pt-br ltz ca es sv tw

Сохраняем это все Ctrl+O и выходим nano - Ctrl + X

7. Теперь при запуске Personal Web Sharing получаем рабочий веб-сервер с рабочим PHP



PHP
The PHP development team would like to announce the immediate availability of PHP 5.3.8.

Установка связки Apache + PHP + MySQL на Mac OS X
07.08.2009 - 16:21 опубликовано bumaga
Open Source Программирование на Mac Сервер Программирование Софт Apache MySQL PHP
Очень плохо
Плохо
Хорошо
Очень хорошо
Превосходно

В прошлой статье я рассказывал о том, как установить и сконфигурировать популярную СУБД MySQL на машину под управлением Mac OS X.

В сегодняшней статье как я и обещал мы поставим самый популярный веб-сервер Apache и интерпретатор PHP, затем соединив все воедино получим локальный, полнофункциональный веб-сервер.


Думаю, для многих будет приятной новостью узнать, что в Mac OS X по умолчанию уже установлен веб-сервер Apache, что отчасти облегчает нашу задачу. Для его активации нужно выполнить ряд простых действий, а именно зайти в меню  → Системные настройки → Общий доступ и в открывшемся окне отметить галочкой пункт Общий веб-доступ:


Теперь ваш веб-сервер запущен и работает. Получить доступ к своему сайту вы можете набрав в адресной строке браузера http://127.0.0.1/~ ваш логин.

Обратите внимание, что файлы *.html вашего сайта хранятся в «хомяке» (домашней папке пользователя) в каталоге Сайты. Сейчас вы можете создать любой статический сайт и любоваться им покуда в глазах не будет рябить.

Для того чтобы сайт был динамическим, к уже установленному веб-серверу Apache, необходимо «прикрутить» интерпретатор языка PHP. Сделать это можно несколькими путями, самый простой из которых я и поведаю.

Сначала скачиваем php-модуль для Apache, который включает в себя основные расширения PHP, в том числе и расширение для работы с СУБД MySQL. Скачав запускаем пакет и производим его установку. На этом процесс установки и настройки закончен. Убедиться в том, что все работает нормально можно создав в папке Сайты файл index.php следующего содержания:


<?php phpinfo(); ?>

Затем в адресной строке ввести адрес сайта http://127.0.0.1/~you login/index.php. Если на экране появиться следующая страница (см. ниже), то вы все сделали правильно и вас можно поздравить.


Обратите внимание!

PHP устанавливается в каталог /usr/local/php5 - там же храняться все файлы для его настройки;
Apache хранит свои настройки в /etc/apache2, главный настроечный файл httpd.conf.
Дополнительную информацию по настройке вы всегда сможете найти в интернете, так как это очень обширная тема и информации по ней предостаточно.


PHP Активация MAC OS X

1. Запускаем терминал
2. Выполняем sudo -s
3. Вводим пароль - toimage
4. Выполняем nano /etc/httpd/httpd.conf
5. Переходим к строкам и раскомментируем их ( то есть убираем значок # перед строкой)

Строка 240 которая выглядит так: LoadModule php4_module libexec/httpd/libphp4.so -
Строка 284 которая выглядит так: AddModule mod_php4.c

6. Переходим дальше по строкам и правим их:

Строка 445 должна выглядеть так: DirectoryIndex index.html index.htm index.php index.phtm index.phtml
Строка 848 должна выглядеть вот так: LanguagePriority ru en da nl et fr de el it ja kr no pl pt pt-br ltz ca es sv tw

Сохраняем это все Ctrl+O и выходим nano - Ctrl + X

7. Теперь при запуске Personal Web Sharing получаем рабочий веб-сервер с рабочим PHP