Основы построения масштабируемых высоконагруженных...

114
Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов) Алексей Рыбак Badoo Development (badoo.com)

description

Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов). Алексей Рыбак Badoo Development (badoo.com). Задачка на разминку. - PowerPoint PPT Presentation

Transcript of Основы построения масштабируемых высоконагруженных...

Page 1: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Основы построения масштабируемых

высоконагруженных веб-проектов

Семинар (8 часов)

Алексей Рыбак Badoo Development (badoo.com)

Page 2: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Задачка на разминку

Пусть в нашем распоряжении имеется некоторый веб-сервер. Выполняя запросы, часть времени он проводит в ожидании ответов от удаленного сервера базы данных, остальное время занимает работа процессора. Считая, что ресурсы базы данных и пропускная способность сети – неограниченны: при каких условиях сервер может отдавать 1000 запросов в секунду?

Page 3: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Наш план• Введение• Базовые компоненты и

архитектуры• Управление и поддержка больших

проектов• Избранное по заявкам, обсуждение

проблем, любые ваши вопросы

Page 4: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

0. Введение

Page 5: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Кто зачем пришёл (1/2)• Не очень хорошо знаком с

архитектурой и принципами масштабирования много-серверных систем, хочу узнать основы

• В нашем проекте уже несколько серверов, хочу узнать, как расти дальше

• Мне всё более-менее понятно, хочу систематизировать знания и получить консультации по ряду вопросов

Page 6: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Кто зачем пришел (2/2)

• программист• администратор• руководитель группы/отдела• всё вышеперечисленное• ничего из выше

перечисленного

Page 7: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Ещё пару вводных слов• Стек технологий – LNMP • Многие проблемы носят

фундаментальный характер• Постараемся «перезагрузить» мозг • Будет много живого общения• Не стесняйтесь прерывать и

задавать вопросы• Будет много флипчарт-сессий

Page 8: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Почему “перезагрузить” мозг?Как программирует «продвинутый новичок»?1. Осознаёт предметную область (бизнес-

анализ, пользовательские сценарии)2. Создаёт «модель» и «над-язык» (данные,

сущности, операции над ними)3. Пишет код, внося изменения в над-язык

(реже – пересматривая модель)

• В п.2 мы кое-что забыли• Модель не имеет системного каркаса• Нужна верификация модели с системной

точки зрения – системное проектирование

Page 9: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Проектирование (1/2)• Многоуровневый анализ• Логический уровень: модель данных• Software-уровень: ОС, ФС, веб-

сервера, базы данных и другие базовые компоненты

• Hardware-уровень: диски, память, сеть, CPU …

• У всех компонент – и программных, и железных - есть свои важные особенности, которые играют колоссальную роль

Page 10: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Проектирование (2/2)

• Любой архитектор обязан иметь навыки системного администрирования

• Правильное «объединение» всех компонент

• О масштабировании нужно заботиться заранее

• Всё это - не преждевременная оптимизация

Page 11: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Сети массового обслуживания

• Массовый поток требований случайного характера

• Телефонные станции, супермаркеты, автомагистрали, call-центры, ремонтные предприятия…и конечно интернет-проекты!

• Первая работа - А.К.Эрланг, «The Theory of Probabilities and Telephone conversations», 1909

• Не пугайтесь, не будем углубляться в математику, главное – «чувствовать» модели

Page 12: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Базовая модельочередь

требования обслуженные заявки

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

Характеристики:• число требований в ед. t• пропускная способность (число обслуженных требований)• среднее время обслуживания, распределение (моменты)• число отказов в ед. t

Важное свойство: нелинейная (стремительная) «деградация»

канал обслуживания

Page 13: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

очередь

требования

N-канальная СМО с ожиданием

каналы (N)

обслуженныезаявки

Ищите подобные модели в своих проектах.Это - архитектура вашего бизнеса. Остальное – в-общем, вторично.

Page 14: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Цели изучения СМО

Повышение эффективности:• Пропускная способность• Время ожидания• Совокупная стоимость

Page 15: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Попробуем рассчитать на «пальцах» проект

• Суточная аудитория - 10 млн человек• Оператор – процесс веб-сервера• Требование – запрос от браузера• Расчёт крайне грубый• Время на один запрос – 0.1 сек• 75% загрузка: 24 час X 45 мин X 60 сек = 64800 сек• Всего запросов на оператора 64800*10 = 0.648 млн• Каждый пользователь делает 30 кликов• Всего запросов 30*10млн = 300 млн• На один сервер – 10 процессов• Число серверов 300 / (10*0.648) = 46.2

Page 16: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Этот расчёт – неверный • Не учитываем «случайность» распределения• Не учитываем структуру запросов (1 хит != 1

запрос)• Не учитываем суточное распределение• Для UGC 10 млн на практике – это сотни, а то

и тысячи серверов• В жизни системы куда сложнее, поэтому иной

раз проще не считать, а сразу проводить измерения

Page 17: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Базовые софтверные компоненты проекта

• Веб-сервер• Сервер приложений (может быть

интегрирован в веб-сервер)• СУБД• Кеш-сервер• Цель: «прокачать» как можно больше

хитов за как можно меньшие деньги

Page 18: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Масштабирование

зара

бота

ли

потратили

линейное

эфф

ективностьГоворят, что scaling и performance – разные вещи. Это не совсем так. Это всё про деньги. Scaling – класс кривой, Performance – её характер (например, угол наклона)

линейное, но с плохой производительностью

нелинейное

Page 19: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

1. Базовые компоненты и архитектуры

Page 20: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Скорость доступа к данным

#00 #01cache

CPU

Memory

cache

>1e-5 s

<1e-9 s< 1e-6 s

>1e-4 s

“HARD” DISK

FS cache

Network

типичные цифры

Page 21: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Диск – слабое звено• Если что-то лежит на диске, не меняется и часто

читается – оно мгновенно в FS cache и доступ к нему такой же быстрый как к памяти

• Считать по сети из памяти удаленной машины чаще быстрее, чем с локального диска

• Читать/писать последовательно и много – значительно выгоднее

• Пакетная запись на диск: накопили в памяти и сбросили. Можно вовсе асинхронно (возможны потери).

• Будущее – за SSD

Page 22: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Linux: параллелизм

• Процессы (processes)• Трэды (threads)• Для осуществления «параллельной»

работы необходимы переключения между режимами ядра и задачи - переключение контекста (context switch)

• Ключевой момент для большинства классов серверов – модель обработки сетевых соединений

Page 23: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Модели обработки сетевых соединений

• Process per connection– CGI: fork per connection– Pooling: Apache (v.1, mpm_prefork – min, max,

spare), PostgreSQL+pgpool, PHP-FPM …• Thread per connection

– Pooling: Apache (mpm_worker – min, max, spare), MySQL(thread_cache)

• FSM (finite state machine)– «современные» ядра: kqueue, epoll– общий интерфейс libevent, libev– FSM + process pooling: nginx– FSM + thread pooling: memcached v>1.4

Page 24: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Обработка сетевых соединений веб-сервером

• process-per-connection (apache 1, 2 mpm_prefork)

• медленные клиенты = куча процессов• thread-per-connection (apache 2 mpm_worker) • медленные клиенты = куча потоков• Keep-Alive – 90% неактивных клиентов• накладные расходы – context switches, RAM• “lightweight“ (nginx, lighttpd, …)• nginx (не нгинкс, не нжинекс и даже не

нгинекс, а эн-жин-ыкс (engine-x)!)

Page 25: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

flipchart case #1

• Отдача статики веб-сервером

Page 26: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Почему nginx?• 1 master + N workers (10**3 – 10**4 conn)• N: CPU, вероятность блокирующих операций• FSM + поддержка эффективных методов работы с

соединениями• большое внимание к скорости и качеству кода• минимум копирования данных• Keep-Alive: 100Kbytes active / 250 bytes inactive• очень удобная конфигурация• даже есть встроенный кастрированный perl• sysoev.ru, [email protected]

Page 27: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Типичная конфигурациявеб-сервера

• Что делает сервер? • Выполняет код• Обслуживает клиента

• Разве повар принимает заказ?• Разные задачи, разделить• Двухуровневая схема (frontend/backend)• nginx + Apache + mod_php, mod_perl, mod_python• nginx + FCGI (например, php-fpm)

Page 28: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

[front/back]end: концепт

nginx

Apache mod_php, mod_perl, mod_python FastCGI

«легковесный» сервер (LWS)

«тяжеловесный» сервер (HWS)

«статика», SSI, perl «динамикa»

«быстрые» и «медленные» клиенты

Page 29: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

[front/back]end:масштабирование

SLB

F

F

F

B

B

B

B

N/Nf

N/Nb • F и В – «логический» уровень• F и B гомогенны (обслуживание, замена)• F и B могут быть разными «физическими» серверами или одним сервером (единый однородный «слой» серверов, на каждом LWS и HWS)

Page 30: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Масштабирование

зара

бота

ли

потратили

линейное

эфф

ективность

Page 31: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Масштабирование веб-кластера

• Гомогенность: при большом числе серверов можно не разделять front- и back-endы

• Независимость компонент• Минимум общих ресурсов (share-nothing => share

accurately)• Некоторые распространённые ловушки:

– общие данные на nfs (сессии, код) => локальные копии кода, сессии в memcached

– локальный кеш => общий кеш– что-то пишем в базу realtime => сделать тяжелые

операции асинхронными

Page 32: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

nginx: load balancing

upstream backend { server backend1.example.com weight=5; server backend2.example.com:8080; server unix:/tmp/backend3;}

server { location / { proxy_pass http://backend; }}

Page 33: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

nginx: fastcgiupstream backend { server www1.lan:8080 weight=2; server www2.lan:8080;}server { location / { fastcgi_index index.phtml; fastcgi_param [param] [value] ... fastcgi_pass backend; }}

Page 34: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Отдача защищенной статики

• через скрипт – плохо («тяжелый» процесс на каждого клиента)

• X-Accel-Redirect («тяжелый» процесс быстро проверяет, можно ли отдавать, и даёт «указание» веб-серверу)

• модули (URL-сертификаты)• http://sysoev.ru/nginx/docs/http/

ngx_http_secure_link_module.html• http://wiki.nginx.org/NginxHttpAccessKeyModule

Page 35: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Кеширование

• «память»-10-9-10-6,«сеть»-10-4,«диск»-10-3 и выше• страницы(+картинки и т.д.), HTML-блоки, «объекты»• эффективность: соотношения hit/miss/set, «кеш-

память на одного юзера»• HTML-блоки: не всегда эффективно• А был ли мальчик? (if-modified-since)• Кеширование веб-сервером (прокси-кэш)• Объектный кеш: сериализованные данные• «Некогерентный»(несогласованный) кеш

Page 36: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Несогласованность локального кеша

frontend

LCdata

data

backend

backend

LC

Global Cache Global Cache

+

+

Global Cache

Page 37: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

• danga.com/memcached/ (LiveJournal)• «глобальный» кеш-сервер• оптимизированная работа с памятью (slab alloc,

object versions) и сетевыми соединениями (libevent)• Крупнейшие мировые проекты: LJ, slashdot, digg,

facebook (десятки терабайт) • идеален для сессий, объектного кеша• multi-get, stats (get, set, hit, miss + slab info)• легко масштабировать • i = crc32(key)%N и вариации• время жизни, LRU и пролонгация • неидеально написан, особенно после facebook

memcached

Page 38: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Кластеризация сессий

• http-conn: кидаем клиента на один сервер в рамках сессии (производительность, неравномерная нагрузка)

• NFS: никакая масштабируемость, SPOF, “nfs stale handle”, скорость

• Database: SPOF, скорость (лучше: heap, cluster)

• Memory: высокая скорость, почти линейная маcштабируемость. Memcached, Zend Session clustering

Page 39: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

flipchart session

• Есть ли вопросы?• Case#2: база знаний (википедия)• Case#3: медиа-хранилище (фото-

видео-хостинг, файлопомойка)

Page 40: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Компоненты (cont.)

Что ещё входит в базовые компоненты:• Application servers: обычно

интергированы в веб-сервер (исключение - FCGI). Пару слов про PHP-FPM и особенности PHP

• СУБД (MySQL)

Page 41: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Приложения

• Приложения на скриптовых языках• «Собирают» динамические страницы• Много блокирующего IO• Часто создают существенную нагрузку

на CPU• В качестве примера рассмотрим PHP

Page 42: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Особенности PHP

• Acceleration (APC, xcache, ZPS, eAccelerator)

• memory & CPU usage (zval: C(1M), Perl(10M), PHP(20M))

• modules rock!• FCGI (fpm)

Page 43: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

FPM

• PHP-FPM: PHP FastCGI process manager

• Менеджер FastCGI-процессов для PHP• Архитектура сервера напоминает nginx

(master + N workers)

Page 44: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

PHP-FPM: эксплуатация

• Плавно обновляться, не теряя соединения

• Видеть все ошибки• Автоматически реагировать на

подозрительное поведение воркеров (выход, тормоза, массовые падения)

• New: динамическое количество воркеров (apache-like)

Page 45: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

PHP-PFM: основные возможности

• Плавный перезапуск/обновление кода

• Мастер ловит stderr воркеров• Автоматический трейсинг и

завершение работы медленных воркеров

• Аварийный перезапуск при массовом падении воркеров

Page 46: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

PHP-PFM: доп. возможности

• Error header снимает проклятие пустой белой страницы (200 OK на ошибку)

• fastcgi_finish_request() – отдать output клиенту, но продолжить работу (сессии, статистика и т.д.)

• Accelerated upload (поддержка request_body_file - nginx 0.5.9+)

Page 47: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

FPM на пути к PHP• Mamba, Badoo (2004-2006): набор

разрозненных патчей• Андрей Нигматулин. 2007: один патч поверх

PHP (5.3.0-0.5.12, http://php-fpm.org)• 2009: проект отнимает массу времени,

«берёт руководство» Michael Shadle, коммитит dreamcat4 http://launchpad.net/php-fpm

• Конец 2009 … Антон Довгаль, Jerome Loyet - FPM наконец в PHP! Отдельный SAPI, 5.3.*.

• Groups: highload-php-(en|ru)@googlegroups.com

Page 48: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Базы данных

• Самый «капризный» компонент• Пофантазируем о том, как бы мы

разрабатывали СУБД• Поймем «модель» обслуживания• Поговорим о масштабировании

Page 49: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Вы - БД и выполняете SELECT

в первом приближении:• установить соединение,

выделить ресурсы• скорость, память на

стороне сервера…• получить запрос• проверить кэш запросов• разобрать SQL-

выражение • bind vars, stored proc…

• получить данные• index lookup, buffer cache,

disk read• отсортировать данные• in-memory, filesort, key buffer• отдать результат• очистить ресурсы, закрыть

соединение

Page 50: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

MySQL: кратко о самом важном• Движки - MyISAM, InnoDB, Memory(Heap); Pluggable• Блокировка: MyISAM на уровне таблиц, InnoDB на уровне

строк • «Ручные» блокировки: select lock, select for update• Индексы: B-TREE, HASH (no BITMAP)• point->rangescan->fullscan; • fully matching prefix; innoDB PK: clustering, data(“using index”), • myisam key cache, innodb buffer pool• dirty buffers, transaction logs: innodb_flush_trx_log_at_commit • many indexes – heavy updates• sorting: in-memory (sort buffers), filesort• USE EXPLAIN! Using temporary, using filesort • innodb_flush_method = O_DIRECT• лучше использовать маленькие таблицы вместо одной

большой

Page 51: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

• типы приложений: OLAP/OLTP • обычно OLAP – MyISAM, OLTP - InnoDB• представьте, что вы – БД• какие операции следует выполнить?• нельзя ли заменить одни операции другими?• нельзя ли вовсе отказаться от каких-либо

операций?• хороший и правильный запрос к БД – тот,

которого нет ;)• не бойтесь денормализации• позаботьтесь о масштабировании заранее

Проектирование

Page 52: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Денормализация• шашечки или ехать? • денормализация

– лишний join– сортировка– группировка– фильтрация– агрегация из разных источников– горизонтальное разбиение

таблиц• Кейсы

– Case#4: Счётчики– Case#5: Деревья в БД– Case#6: Поисковый индекс

Page 53: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Некоторые «приёмчики»

• multi-операции• On duplicate update• table switching (rename)• memory tables как результаты

промежуточных вычислений• updated = updated

Page 54: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

СУБД: масштабирование

• пользовательский контент• ОЧЕНЬ много IUD-операций• линейное масштабирование• репликация или кластеризация

(sharding)• эксплуатация, стоимость владения• отказоустойчивость, мин. SPOF• балансировка нагрузки • удобство обслуживания

Page 55: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Масштабирование

• Scale up vs Scale out • Репликация (очень нелинейное)• Вертикальное: по задачам (по

таблицам)• Горизонтальное: по «основным»

сущностям – пользователям, документам и т.д. – sharding

Page 56: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Репликация «на пальцах»

• Был один сервер w/r << 1• Добавили ещё один, 100% рост• Но w/r на мастере растёт – w не

масштабируются• Чем больше серверов – тем хуже• Социальные сервисы – много операций

записи

Page 57: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Проблемы репликации

• Линейна только при очень малом числе серверов (writes не масштабируются)

• Очень много данных• Неэффективная утилизация ресурсов (копии

данных на диске и в кеше)• Особенности реализации (MySQL: раздача

лога, один тред и т.д. – и порождённые извращения)

Page 58: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

G: 1) больше, если «тяжелее» writes 2) больше для приложений с интенсивной записью

Page 59: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Black hole«dummy» slave

Server#1

filtered binlogдля slavesServer#2

MasterServer#1

MySQL: replication filtering

• Master: binlog-[do|ignore]-db• фильтр «ручками»: SET SQL_BIN_LOG=0• Slave: replicate[|-wild]-[do|ignore]-[db|table]• BLACKHOLE engine: «черная дыра», no data

Page 60: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Relay slaves

relayslave

slave slave slave slave

master

• --log-slave-updates• топология

– 1 relay, M slaves– M (relay + slave)– и вариации на тему

Page 61: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Масштабирование

зара

бота

ли

потратили

линейное

эфф

ективность

Page 62: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Sharding: разделение данных

• Статическое (детерминированное), num_key%n_serv, crc32(md5(str_key))%n_serv, «первая буква логина» и т.д.

• Это практически неуправляемо• Математические трюки: магические 12, 24 и прочие

– всё равно плохо• «Динамическое»: добавление новых машин,

замена, перенос, балансировка – без изменения кода

• Минус динамического: часть приложения, которая отвечает за адресацию – SPOF, м.б. высокая нагрузка

Page 63: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Sharding: прозрачность• Минимум головной боли при поддержке• Управление разделением данных без

вмешательства в код• «Проксирование»• Координирующий сервис (отвечает на вопрос

“где?”)• Динамическая координация менее прозрачна,

но архитектурно более правильна• «Виртуализация» физических координат {server, db_suffix, table_suffix} => storage_id

Page 64: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

WebApp Координатор

где?

Node # 1234

data

Storage nodes

Page 65: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Case#7: Sharding

• flipchart!

• самый сложный для понимания материал

• не стесняйтесь задавать вопросы!

Page 66: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

MySQL в Badoo (1/2)

• минимизировать совокупную стоимость владения• максимально гибко контролировать все

подсистемы• минус в теории - плюс на практике• MySQL не даёт "нагородить" сложные

зависимости между данными• MySQL не диктует неэффективную или сложно

управляемую архитектуру• многие проблемы больших проектов схожи и не

зависят от выбора СУБД• cost-oriented development

Page 67: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

MySQL в Badoo (2/2)• InnoDB• никаких сложных запросов, FK, триггеров и

процедур• "продвинутая" репликация• "продвинутый" апгрейд схем данных• шардинг - виртуализация "физических"

координат {serverX, dbY, tableZ} => shard_id• никаких "прозрачных" прокси• динамическая координация клиентов• очереди событий на базе MySQL• архитектура не меняется пятый год (рост с 0 до

80 млн пользователей, несколько ДЦ)

Page 68: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Очереди

• Если шардинг – это разделение в пространстве, то очередь – разделение во времени

• Если что-то можно сделать потом – пусть клиент не ждёт

• Легко сделать «универсальный» фреймворк для работы с очередями

Page 69: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

RPC

• RPC = Remote procedure calls• Синхронно: удаленные сервисы• Асинхронно: очереди• Вариации: логически синхронно,

физически асинхронно• Проблема транзакционной целостности

Page 70: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

RPC/MQ: концепт

“client”

“client”

“server”

“server”

request

result

MessageQueue

Consumersmessage

синхронное, “point-to-point”

асинхронное, “publisher-subscriber”

Page 71: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

database

“publisher” “subscriber”

1) enqueue/dequeue2) publish 1) enqueue/dequeue

2) subscribe/receive

MQ на БД

Page 72: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Универсальная очередь

• {event_class, event_data}• Внутри базы – нет проблем с транзакциями• Publisher/Subscriber• Диспетчеризация событий• Топология: (де)централизованная доставка

и обработка

Page 73: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Case#8: очередь

• flipchart!

• модель данных

• сбор данных

• failover

• децентрализованная очередь

Page 74: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Особенности архитектур

• flipchart!• Case#9: Сетевое СМИ• Case#10: Социальная сеть

Page 75: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

• Один сервер• Несколько серверов (скажем, десять)• Много серверов (сотни, тысячи… много ДЦ) • И ещё чтобы не очень падало и удобно

поддерживалось• Переход между уровнями обычно

сопровождается «кризисом»• Ключевое значение играет масштабируемая

архитектура

Кризисы роста

Page 76: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Масштабируемая архитектура

• Независимые или слабо-связанные веб-сервера

• Горизонтальное разделение данных • RPC (сервисы, очереди)• Обслуживание без вмешательства в

код

Page 77: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Некоторые ловушки

• Высокая степень связанности (данных, процедур, компонент) – плохое масштабирование

• Полу-решения (накапливание рисков)• Плохо управляемые инструменты • Горе от ума (решения с позиций

«теоретиков», вредные с инженерной точки зрения). Классический пример - ORM

Page 78: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Что читать?• RTFM ;)• Слайды с конференций – mysql, velocity, osconn.

tutorials, архитектура wikipedia, fotolog, youtube … - highscalability.com

• Блоги - особенно тех, кто занимается консалтингом http://jcole.us/blog/,

http://www.mysqlperformanceblog.com/ фид http://www.planetmysql.com – сборная солянка• Books - немного High Performance MySQL (2nd ed.

Shwartz, Zaitsev & co), Building Scalable Web Sites (Henderson), Scalable Internet Architectures (Schlossnagle), Настройка производительности UNIX-систем (Мусумеси, Лукидес) – вообще о производительности, книги издательства MySQL AB Press (руководство администратора и тд); Managing gigabytes, Architecture of a Database System

Page 79: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

2. Управление и поддержка больших проектов

Page 80: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Большие проекты

• Миллионы пользователей• 24x7• «Много» серверов• Многозвенная архитектура• Мегабайты кода• Зоопарк!• Быстрый или мертвый

Page 81: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

«Технологические» риски

• тормозим (или лежим)• медленно реагируем на ошибки (не

реагируем или совсем не видим).• плохо масштабируемся (или вообще не

масштабируемся)• медленно меняемся (или не способны

меняться)• высокая стоимости владения, низкий возврат

инвестиций и т.д.

Page 82: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

development+support=100%

Dev

elop

men

t (tim

e)

Support (time)

• маленькие проекты• начало проекта

«динамичные» проекты

«загнанные», неразвивающиеся проекты, «динозавтры»

100%

100%

Page 83: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Кривой «технологический» менеджмент приводит к тяжелым болезням роста

Page 84: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Разработка с учётом дальнейшей поддержки

• бизнес-идея

• модель

• варианты реализаций

• верификация

• планирование

• производственные работы

Page 85: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

René Magritte   Les amants

наиболее распространенная ошибка: не видим, что происходит на «физическом» уровне

например, какие операции происходят в процессе обработки запроса

Page 86: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Что нужно видеть?• вспомните о моделях СМО• запросы к СУБД и внешним

сервисам, прочие «блокирующие» или «тяжелые» операции

• простые измерения «ручками» - таймеры

• ошибки (любые!)

Page 87: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

• время между возникновением внештатной ситуации и её исправлением должно быть минимальным

• жизненный цикл проблемы

WTF? !

неопределённость предсказуемость

;)

визуализация интеллект команды

Поддержка

Page 88: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Development: визуализация потенциально узких мест (debug toolbar, логи), тестыProduction: мониторинг (расширенный), измерение производительности в реальном времени, сбор и анализ логов

Инструменты

Page 89: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

«пожалуйста, сообщите нам об этом» и «не забудьте указать адрес страницы»

«Все ходы записаны. Мы уже изучаем, почему такое могло произойти. Приходите ещё, мы обязательно исправим все косяки»

Error_log!

плохо

хорошо

Page 90: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Мониторинг

• измеряй и властвуй• «тупой» мониторинг серверов не даёт нужной

информации• нужен мониторинг приложения и компонент• измерение качества архитектуры• открытость: общее видение системы у всех

членов команды• снижение стоимости владения, повышение

качества поддержки

Page 91: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

req/sec

average time

• Scripts• Virtual hosts• Physical servers

PINBA: мониторинг в режиме реального времени

Page 92: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Краткая история одной аварии с иллюстрациями

Page 93: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

время обработки запроса

Page 94: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

WTF?

Page 95: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Теперь нам известны скрипты, периодичность, и более-менее ясно, где копать дальше

Page 96: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Анализ данных

• найти, где копать• включить детальную отладку • анализ графиков• пики, периоды, характерные

масштабы• распределения, достаточное

качество

Page 97: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Идеальный для саппорта софт меряет сам себя

Page 98: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Эксплуатация веб-кластера• Число запросов (полное, на сервер …)• Время ответа (среднее, распределение,

по скриптам, по серверам …)• Использование ресурсов (rusage)• Непрерывный мониторинг в реальном

времени• Качество приложений - что меняется при

релизах?

Page 99: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

PINBA: архитектура• Клиентский модуль для PHP• Для любого запроса собираем

script_name, host, time, rusage …• При завершении отправляем UDP• И так со всех машин веб-кластера • Серверный тред внутри MySQL (v.

5.1.0+)• SQL-интерфейс ко всем данным

Page 100: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

PINBA: данные

• request: script_name, host, domain, time, rusage, mempeak, output size, timers

• timers: время + пары “ключ (тэг) – значение”

• пример: 0.001 sec; {group => db::update, server => dbs42}

Page 101: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

• SQL: “сырые” данные или отчеты• Отчеты – это отдельные таблицы,

обновляются «на лету»• Базовые отчёты (~10): по системе, по

скриптам, по хост+скрипт…• Отчеты по произвольным тегам

(ENGINE=PINBA COMMENT='report:foo,bar‘) => {script_name, foo_value, bar_value, count, time}

• http://pinba.org – много примеров

PINBA: Отчёты

Page 102: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Например, так «протухает» код

Page 103: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Наимедлейшие из медленных

Page 104: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Memcached: статистика

• Stats• Stats slabs• Stats items• Stats cachedump• Req/sec• Hit/miss• Bytes read/written

Page 105: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Memcached: stats

Page 106: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Cachedump (1/4)17й слаб = 128 K

stats cachedump 17ITEM uin_search_ZHJhZ29uXzIwMDM0QGhvdG1haWwuY29t [65470 b; 1272983719 s]ITEM uin_search_YW5nZWw1dHJpYW5hZEBob3RtYWlsLmNvbQ== [65529 b; 1272974774 s]ITEM unreaded_contacts_count_55857620 [83253 b; 1272498369 s]ITEM antispam_gui_1676698422010-04-17 [83835 b; 1271677328 s]ITEM antispam_gui_1708317782010-04-15 [123400 b; 1271523593 s]ITEM psl_24139020 [65501 b; 1271335111 s]END

Page 107: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Cachedump (2/4)

• Выдираем из cachedump имя группы• Распределение по размеру (аномалии)• Просто ошибки• Или пора включать архивацию• Или разбивать объекты• Для memcached большой объект это очень

плохо: все ждут

Page 108: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Cachedump (3/4)

• Выдираем из cachedump имя группы• Распределение по времени доступа• Можно тоньше играть со временами

хранения• t жизни >> t времени доступа• Уменьшить время хранения для данной

группы

Page 109: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Cachedump (4/4)

• довольно медленно• не всё (по крайней мере, в старых

версиях)• трактуйте результаты как

статистические "сэмплы"• или увеличивайте статический буфер в

исходниках

Page 110: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

• Callgrind и т.п. – хорошо, но много• Снижаем размерность: мерить только то, что

потенциально «тормозит» (disc, запросы к «сервисам» – db, memcached, с/c++,…)

• И ещё average time, CPU, число запросов по группам

• Автоматически добавим в конец любой страницы• Devel: всегда включен • Production: можем писать в лог

auto debug & profiling (1/1)

Page 111: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

• что происходит на «физическом» уровне• визуализация СМО• визуализирован «cost» любого ответа с бэкенда• легко ловить нетривиальные «косяки»

– при рефреше нет dbq->memq– много «get’ов» вместо «multiget’a» (или insert’a)– межсерверные транзакции– несколько разных соединений с одной и той же базой– cache-set при "лежащей" базе/ошибке– чтение со slave данных, только что записанных на

master– и так далее…

auto debug & profiling (2/2)

Page 112: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

• Меряйте больше!• сonn/req, cpu/mem usage для всех сервисов• Статистику с баз, apache/nginx…• Memcached: get/miss по группам ключей,

расширенная статистика (slabs + items)• la, cpu/mem usage с серверов• Характерные времена загрузки на клиенте

(DOM_READY, ON_LOAD) – МЕГА ВАЖНО• network…

Что измерять

Page 113: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Вопросы на выбор• задавайте любые • нагрузочное тестирование• программа пост-анализа мониторинга• сбор и обработка логов• выкладка в бой• среда (devel, stage, production)• откаты/накаты схем• SQL vs NoSQL• профилирование скриптов• найм, собеседование• минусы “Agile”

Page 114: Основы построения масштабируемых высоконагруженных веб-проектов Семинар (8 часов)

Спасибо!

[email protected]• Если Вы хотите получить

презентацию – заполните, пожалуйста анкету

• Буду крайне признателен за любые отзывы и пожелания, особенно критические