SlideShare uma empresa Scribd logo
1 de 61
Практическое создание
крупного масштабируемого
проекта web 2.0 с нуля
Дмитрий Бородин
Об авторе
В настоящее время – развлекательное приложение «Лице-Мер»:
•5-е место в рунете по посещаемости в категории «Общение». Выше по
посещаемости - только 3 соц.сети, сами «Вконтакте» и «Мой мир».
•Более 1.100.000 «уников» в сутки.
•20.000 SQL запросов/с.
В прошлом - php.spb.ru (DiMA), первый сайт на русском о PHP (1997г).
Часть 1.
Приступая к разработке…
Традиционный подход к разработке: ТЗ, функционал, ООП.
Неправильные вопросы: выбор языка, базы, фреймворка.
На фоне главных задач, эти – не существенны.
Слово «Highload» обманчиво
Проект, имеющий масштабирование, способен выдержать любую
нагрузку, даже если там ужасный код и не оптимизированный SQL.
Думайте не о Highload, а об архитектуре.
Проблема первого шага [1]
• Все новое – принимается в штыки.
• Богатый опыт программирования – мешает.
Вас ждет кардинально другой подход к разработке, как администратора
и архитектора ПО, а не профессионального программиста.
Проблема первого шага [2]
99% стартапов web 2.0 никогда не запустятся чисто по техническим
причинам – проект не был правильно масштабирован с нуля.
Никто не умеет строить крупные web 2.0 проекты кроме тех, кто их уже
имеет – запущенные и выжившие социальные сети с млн. пользователей.
При проектировании 100 млн. пользователей не должны вызывать
проблем .
Честное горизонтальное
масштабирование
Проект разбит на множество независимых компонент, способных
выполняться на разных серверах (честно).
Все что можно, заранее разбито по множеству баз, серверов, очередей и
т.д. Ничего на «потом» откладывать нельзя. Думайте об этом заранее.
Проект может наращивать системный администратор без участия
программистов и правки кода, под контролем архитектора ПО.
Честное горизонтальное
масштабирование
Масштабирование – это не репликация.
SQL кластеры и прочие «серьезные» решения – тупиковые, в
масштабировании не применимы.
Часть 2.
Доказательства приведенной теории.
Технические причины, почему ваш стартап гарантированно никогда не
запустится.
Примеры типичных страниц в любой социальной сети.
Невозможная задача №1
Мы делаем очередной клон самой популярной соц.сети.
100.000.000 пользовательских профайлов:
•Таблица с профайлами: ФИО, аватар, город…
•Таблица со списком друзей.
Данные разбиты на 200-300 SQL серверов.
Страница «Мои друзья»
Попробуем реализовать эту страницу.
•Список user_id друзей (100 шт.)
•Веб-страница должна показать друзьй по алфавиту:
ФИО, аватар, пол, город.
•User_id из списка – случайные. Данные о каждом разбросаны случайно
по 200 SQL.
Как получить данные?
Обращаться к 100 SQL серверам – нереально.
Каждая веб-страница может сделать 2-3 SQL запроса максимум.
User_id могут быть вообще случайны: из поиска по анкетам.
Вывод: традиционный подход программирования не применим.
Расширяем проблему
Замените слово «друзья» на другую сущность крупного проекта:
•запись в блоге/форуме
•статья в СМИ
•описание товара в магазине
Невозможная задача №2
На всех социальных сайтах есть подписка на разные события по друзьям.
Друг или автор, на которого вы подписаны, сгенерировал некое событие:
•Загрузил фото, статью, файл и т.д.
•Оставил комментарий к существующему объекту (фото, статья и т.д.)
Эти данные должны мгновенно отображаться в вашей ленте новостей.
Вывод
Забудьте про суть проекта, его функционал, назначение и т.д.
Сегодня вы задумали обычный проект. Со временем захотите web 2.0.
Спроектируйте проект на бумаге заранее для всей web 2.0 функций.
Часть 3.
О главном:
•Правильное оперирование данными
•Многопоточность и атомарность в SQL/Memcache
•Отложенная обработка
Memcache – удивительно сложная система
«Невозможная задача»
Какую БД выбрать?
Выбор небольшой – MySQL и PostgreSQL.
Разницы – нет, т.к. используем 1% их возможностей.
Многие крупные проекты используют MySQL.
Стыдится использовать MySQL в серьезных проектах не нужно.
Призыв к той или иной БД – ошибка от непонимания задачи.
Какой язык выбрать?
Ответ: не важно.
Проблема и задачи масштабирования лежат в иной плоскости.
Рекомендую самые простые и распространенные инструменты:
PHP, php-fpm, nginx, MySQL, memcache, Redis.
Призыв к выбору языка/фреймворка – ошибка от непонимания задачи.
Тщательность изучения
Без тщательно изучения выбранных инструментов ничего не работает.
Пример:
•Знание memcache на уровне команд set/get – это 0.5% того, что надо.
•Знание наизусть документации (+cas) – это 5% всего, что надо знать.
Остальные 95% опыта (проблем) возникнут при настоящем Highload.
О главном [1/3]
Основная задача, о которой нужно думать для создания горизонтально
масштабируемого проекта – как хранить и оперировать данными.
Тщательный подход не к оптимизации SQL запроса и коду, а к
минимизации кол-ва чтения и записи данных.
Основные правила highload так же надо соблюдать.
О главном [2/3]
Очень важно думать о многопоточности и атомарности операций.
Это нужно применять и в обычном программировании, но в highload без
этого вообще ничего не работает.
Главные инструменты решения проблем: SQL и Memcache/Redis.
Как показывает практика, об этом никто не задумывается. А к непонятным
редким багам относятся философски.
О главном [3/3]
Последняя из важнейших оптимизаций – все что можно (и нельзя)
отложите в фоновую обработку cron-скриптам.
Более подробно – чуть позже.
Пример оперирования данными
К тезису «О главном [1]».
Допустим, для решения одной задачи, нужно получать данные рандомно
из БД. В таком случае вы займетесь оптимизациями
“SELECT … ORDER BY rand()”, настройками БД и т.д.
Суть правильного подхода к высоким нагрузкам – вы не должны хотеть
использовать “ORDER BY” вообще.
Не создавайте себе проблемы.
Memcache – это не кеш!
• Полноценная и надежная база данных с уникальными
возможностями, недоступными в SQL.
• Никакой многопоточности. Долой эксперименты.
• Полезен в любых проектах, даже не масштабируемых.
• Важнейшая роль в хранении денормализованных данных.
• Один из инструментов решения «невозможной задачи №1».
Тонкости Memcache
Memcache – с виду прост. На деле - в 100 раз сложнее, чем вы думаете!
На примере класса для работы с блокировками.
Особая роль кодов возврата (помимо return) и разветвление логики.
Публично доступны классы и статьи – псевдонаучны и поверхностны.
Тема Memcache в Highload – отдельный мастер-класс на 8 часов.
Memcache::CAS()
Вся мощь в атомарности операций вашего кода на PHP.
CAS – это не транзакции и не блокировки, известные по SQL. Минусы
транзакций и блокировок все понимают. У CAS их нет (есть другие).
Memcache и сессии
Сессии на PHP блокируют потоки.
Сессии в memcache - типичный антипаттерн и баги.
Идеальный вариант – версионные сессии на CAS():
•Нет блокировок
•Много потоков работает параллельно
•Данные не теряются при одновременной записи
Memcache и большие массивы
По аналогии с сессиями – в одном ключе удобно хранить большие
сложные многомерные массивы:
•Много потоков читают и пишут
•Выполняют атомарные операции, без нарушения логики
Memcache Highload
MemcacheDB, как и SQL, упирается в лимиты: iostat, CPU, MEM.
Готовьтесь к дроблению и миграции до начала разработки.
Важная опция: период записи журнала на диск:
•По умолчанию – 5 минут, проект каждые 5 минут висит по 10 секунд.
•Рекомендую – 30 секунд, подписание почти незаметно.
SQL: атомарность и многопоточность
Важность обдумывания многопоточности.
Основное заблуждение: транзакции решают проблемы.
Далее – характерная задача…
Характерная задача
Изначально некий скрипт работал в один поток с неким абстрактным
ресурсом. Пример ресурса: отправка SMS (не чаще 1 sms/сек – иначе бан)
или проигрывание нескольких нот (случайные мелодии на 5 секунд).
Потом скрипт стали запускать в много потоков.
Как не допустить порчи абстрактного ресурса, если он сам не имеет
средства защиты от параллельной подачи ему команд разными
потоками?
Нужно очень простое и короткое решение в 2-5 строк кода.
Типичное ошибочное решение
С файлами: прочитать файл, если там нет флага «Занято», записать его
туда и начать работу.
С SQL: сначала по SELECT получить флаг и если его нет (либо «Свободно»),
записать туда по UPDATE/INSERT флаг «Занято».
Типичный антипаттерн.
Решения задачи
• SQL – блокировки: SELECT … FOR UPDATE, LOCK TABLES, GET_LOCK.
• SQL – транзакции
• SQL – псевдоочереди (Primary Key, Auto_increment или ORDER BY)
• SQL – атомарность (UPDATE TABLE SET flag=‘BUSY’ WHERE flag=‘FREE’)
• Memcache – атомарность add() или cas()
• Файловая система: flock() – причем очень легко незаметно ошибиться! Трюки
от атомарных операций с ФС: mkdir и пр.
• Операционная система: shared memory и прочие трюки - открыть порт и т.д.
Лучшее решение задачи
• UPDATE … SET flag=1 WHERE flag=0
• SELECT … FOR UPDATE
• Memcache::lock() и unlock() – на основе собственного класса
Лично решите эту задачу 20-ю разными способами.
И вам откроется темная сторона силы.
Статистика по задаче
Из примерно 200 хороших программистов (новичков не приглашали) в год
на собеседовании в нашу компанию:
•60% не ответили вообще (100% допустили типичную ошибку)
•30% придумали плохие решения: LOCK TABLE или flock()
•10% придумали решения с атомарностью SQL и/или очередями.
•Ни один человек не назвал SELECT .. FOR UPDATE или memcache.
Вывод: никто не задумывается об этом в обычной жизни.
Часть 4
Конкретные технические подробности в Highload и масштабировании.
Практика использования SQL и memcache в больших масштабах.
Не используйте “KETAMA” в больших проектах.
Проблемы, затыки, решения, трюки, оптимизация SQL и Memcache
SQL Highload [1]
Все запросы – простейшие выборки по Primary key.
Без JOIN или вложенных запросов.
Доп. индексы в InnoDB могут глючать (опасность).
SELECT count(*) никогда не применяйте, слишком медленно.
Альтернатива для Select count(*).
SQL Highload [2]
Auto_increment замените на Sequence, для возможной репликации SQL.
Репликацию SQL для шардинга не используйте.
Применение Sphinx не нужно, когда можно обойтись простым SQL.
Репликация решает задачу по поиску десятков млн. профайлов.
Следите за размерами таблиц. Будьте готовы их разбить.
Это должен уметь делать администратор без участия программиста.
SQL Highload [3]
Проблема отката транзакций: запросы на 2 сервера + memcache.
Транзакции – зло. По возможности замените на SQL-атомарность и
Memcache::lock() по действиям пользователя.
Снижайте уровень изоляции транзакций, опция transaction_isolation.
Необходимо изучить теорию уровней изоляции транзакций.
За годы собеседований на этот вопрос отвечают крайне редко.
SQL Highload [4]
Правильное оперирование данными: SQL потребляет мало CPU.
Пропускная способность сервера упирается только в жесткие диски.
Карта спотов и миграция пользователей между серверами.
Нагрузки по серверам заранее не предугадать.
SQL Highload [5]
Очень редко обсуждаемая опция innodb_flush_log_at_trx_commit.
•1 или 2 – часто сохранятся, сильно грузить диск, надежно.
•0 – реже сохраняться, меньше загрузка диска, не надежно.
Жертвуем надежностью, выжимаем большую скорость.
Остальные советы традиционны: настроить буферы в памяти, отключить
кеш запросов, разобраться с методами записи данных и пр.
SQL кеш [1]
Паттерн сохранения в кеш результатов (чтение и обновление).
Типичные массовые ошибки:
•не правильно составлен ключ/тег в имени кешируемого объекта
•забыли уничтожить кеш при обновлении.
Заведите константу, отключающую кеш по всему проекту с целями
отладки. Все сразу заработало? Баг найден за 5 секунд!
SQL кеш [2]
Самый сложный и часто встречаемый баг – это кусок кода, который вы
забыли написать.
Согласно статистике, 30% от всех багов – «баг отсутствия кода».
Нет кода – нечего отлаживать. Но баг то есть!
Часто связан с неправильным кешированием.
Полезность unit-тестов для самоконтроля.
Лавинообразные нагрузки
Пусть, 100.000.000 пользователей разбиты в таблицы по 1000
пользователей (это называется «спот»). Таблица – файл на диске. Таблицы
– это список профайлов или личных сообщений.
Иногда SQL начинает зависать => пользователи шлют еще запросы =>
больше PHP-потоков подвисает => подвисают и CRON-скрипты, не
обрабатывая других пользователей => SQL прекращает исполнять любые
соединения => полный паралич всей системы.
Защита от лавины
Благодаря разбиению пользователей на мелкие пачки (споты), выявляем
зависшие из них и зависшие user_id. Для этого мониторим PROCESSLIST
всех SQL серверов раз в секунду.
Заносим в черный список зависшие споты и user_id.
Легкая защита: не принимаем никаких запросов от user_id. Команда
CRON-скриптам игнорировать разбор и возвращать их в очередь.
Железная защита: убиваем все запросы, связанные с зависшими спотами.
Причина лавины
Их всего три. Первые – наиболее вероятны.
Физическая. Сервер уперся в лимит по скорости чтения/записи жесткого
диска. При попытке обработать очередной спот, таблица которого не в
ОЗУ, происходит долгое ожидание жестких дисков. См. `iostat`.
Логическая. Очень большая таблица. Например, спам на 1.000.000
сообщений. Обычно летающие запросы стали слишком тяжелы,
CPU+iostat неожиданно взлетелы. Необходимо следить за размерами
таблиц.
Редкая. Вы просто уперлись в возможности сервера.
SQL шардинг [1]
Представим, что мы делаем клон самой популярной социальной сети.
Имеется 100.000.000 пользователей: профайлы, сообщения, друзья,
сведения о файлах и т.д.
Что такое шардинг.
SQL шардинг [2]
Типы данных.
Пользовательская информация: друзья, профайлы, сообщения, статьи,
записи в блогах, файлы. «Социальность», порожденная пользователями.
Общая информация: списки пользователей по признакам, карта спотов,
конфиги, логи проекта, cron-мониторинг, служебные сообщения.
Справочники: таблицы для поиска пользователей, каталог общих
объявлений, баннерная вертушка, каталог товаров магазина и т.д.
SQL шардинг [3]
Пользовательская информация: хранится по спотам. Споты добавляются
по мере роста числа пользователей.
Общая информация: лежит в одной базе. Нагрузки мизерные. В
масштабировании не нуждается. Обычные скрипты не читают эту базу.
Справочники: из-за очень интенсивной нагрузки заводим множество SQL-
реплик. Поиск даже по десяткам млн. пользователей летает!
SQL шардинг [4]
Друзья, сообщения, профайлы и т.д. – пусть будет всего 50 типов таблиц.
В каждом споте (набор 50 таблиц) хранится информация только о какой-то
1000 пользователей из 100 млн. Итого имеется 100 000 000/1000 = 100 000
спотов, т.е. 100 000*50 = 5 000 000 SQL таблиц.
Заведем 150 серверов. На каждом по 1 инстансу MySQL: 100 000 000/150 =
от 600 000 до 700 000 пользователей, 600 спотов, 30 000 таблиц.
Проблема переполнения каталога файлами.
Невозможное возможно
Очевидный вывод из шардинга –JOIN невозможен.
Как решить «Невозможную задачу №1», чтобы вывести на экран ФИО,
аватар и город абсолютно случайных 100 пользователей из 100 000 000?
Необходимо разместить в супер быстрой памяти только то, что реально
нужно: ФИО, аватар и город. Ничего лишнего! Иначе супер быстрая
память станет медленной.
Авторайзер [1]
Запустим 150 инстансов MemcacheDB, по числу SQL серверов. В них
хранится только важное: ФИО, аватар и т.д.
Имея 100 разных user_id читаем данные с авторайзеров.
Еще разок кешируем.
Главная задача архитектора ПО: пресекать запись ненужных данных,
следитьза за iostat, разбивать на более мелкие.
Карта спотов авторайзеров.
Авторайзер [2]
Не храним невосполнимых данных.
Скрипт миграции по серверам и восстановления из SQL.
Имеющиеся бекап системы для memcacheDB не работают.
Ketama в memcache – зло
«Ketama» отлично подойдет небольшому проекту и только для кеша.
Для авторайзеров использовать ее нельзя:
•Сервера не могут умирать и помечаться недоступными.
•Непоследовательное распределения ключей по серверам.
Функцию getMulti эмулируем php-кодом.
Отложенная обработка
90% информации пишем не в SQL и Memcache, а в очереди.
Иерархия очередей.
Зависание нижней очереди не рушит более важный процесс.
Привер. Обновление поля => очередь => запись в авторайзер => очередь
=> запись в профайл SQL => расчет ТОПов => очередь => статистика,
контроль спама и т.д.
Мониторинг очередей, устранение проблем.
Часть 5.
Технические характеристики [1]
• Более 1.100.000 «уников» в сутки.
• Около 60.000 онлайн пользователей.
• База пользователей более 8.000.000.
• Около 100 очень слабых серверов.
• 20.000 SQL/с и 3000 запросов/с на балансере.
• около 100 серверов, 600МБит/с трафик.
Технические характеристики [2]
• Разработка – 3 месяца. Запуск – 2,5 месяца назад (6 августа).
• Более месяца проект находится в ТОПе ВКонтакте по
посещаемости на первом месте.
• Другие проекты: журнал Вкурсе и www.Truegle.ru
Технические характеристики [3]
PHP 5.3, MySQL, php-fpm, APC/xcache (зависит от версии и глючности PHP),
nginx, memcache с патчами.
Очереди – в Redis.
Настоящий php-модуль для работы с Redis (не существует в мире).
Ближайшие планы.
Серийный выпуск масштабируемых проектов.
Спасибо за внимание!
С удовольствием отвечу на ваши вопросы.
Дмитрий Бородин
Skype: borodin777
dima777@gmail.com

Mais conteúdo relacionado

Mais procurados

Архитектура А/Б тестирования: сделай сам
Архитектура А/Б тестирования: сделай самАрхитектура А/Б тестирования: сделай сам
Архитектура А/Б тестирования: сделай самSergey Xek
 
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...Ontico
 
Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)Ontico
 
NoSQL - взрыв возможностей
NoSQL - взрыв возможностейNoSQL - взрыв возможностей
NoSQL - взрыв возможностейAleksey Solntsev
 
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...Oleg Tsarev
 
Какой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис ЦыплаковКакой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис ЦыплаковAlex Tumanoff
 
Баба Яга против!
Баба Яга против!Баба Яга против!
Баба Яга против!Roman Dvornov
 
Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)Ontico
 
DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"Roman Dvornov
 
Василий Чернов — БЭМ в дикой природе
Василий Чернов — БЭМ в дикой природеВасилий Чернов — БЭМ в дикой природе
Василий Чернов — БЭМ в дикой природеYandex
 
DBD lection 4. Big Data, NoSQL. In Russian.
DBD lection 4. Big Data, NoSQL. In Russian.DBD lection 4. Big Data, NoSQL. In Russian.
DBD lection 4. Big Data, NoSQL. In Russian.mikhaelsmirnov
 
Не бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их многоНе бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их многоRoman Dvornov
 
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...IT-Portfolio
 
Сергей Чистович "Подходы к кешированию на UGC-сервисе"
Сергей Чистович "Подходы к кешированию на UGC-сервисе"Сергей Чистович "Подходы к кешированию на UGC-сервисе"
Сергей Чистович "Подходы к кешированию на UGC-сервисе"Yandex
 
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...IT-Portfolio
 

Mais procurados (16)

Архитектура А/Б тестирования: сделай сам
Архитектура А/Б тестирования: сделай самАрхитектура А/Б тестирования: сделай сам
Архитектура А/Б тестирования: сделай сам
 
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...
 
Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)
 
NoSQL - взрыв возможностей
NoSQL - взрыв возможностейNoSQL - взрыв возможностей
NoSQL - взрыв возможностей
 
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
 
Какой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис ЦыплаковКакой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис Цыплаков
 
Баба Яга против!
Баба Яга против!Баба Яга против!
Баба Яга против!
 
Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)
 
DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"
 
Василий Чернов — БЭМ в дикой природе
Василий Чернов — БЭМ в дикой природеВасилий Чернов — БЭМ в дикой природе
Василий Чернов — БЭМ в дикой природе
 
DBD lection 4. Big Data, NoSQL. In Russian.
DBD lection 4. Big Data, NoSQL. In Russian.DBD lection 4. Big Data, NoSQL. In Russian.
DBD lection 4. Big Data, NoSQL. In Russian.
 
Не бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их многоНе бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их много
 
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
 
Сергей Чистович "Подходы к кешированию на UGC-сервисе"
Сергей Чистович "Подходы к кешированию на UGC-сервисе"Сергей Чистович "Подходы к кешированию на UGC-сервисе"
Сергей Чистович "Подходы к кешированию на UGC-сервисе"
 
мир без Jsp. thymeleaf 2.0
мир без Jsp. thymeleaf 2.0мир без Jsp. thymeleaf 2.0
мир без Jsp. thymeleaf 2.0
 
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
 

Semelhante a Практическое создание крупного масштабируемого web 20 c нуля, Дмитрий Бородин

Web20 from zero
Web20 from zeroWeb20 from zero
Web20 from zeroqweasdrty
 
Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)
Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)
Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)Ontico
 
Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrusAlex Chistyakov
 
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...IT-Portfolio
 
Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaAlex Chistyakov
 
MySQL: проблемы роста
MySQL: проблемы ростаMySQL: проблемы роста
MySQL: проблемы ростаKostja Osipov
 
2014-01-04 02 Алексей Зиновьев. Выбор NoSQL базы данных
2014-01-04 02 Алексей Зиновьев. Выбор NoSQL базы данных2014-01-04 02 Алексей Зиновьев. Выбор NoSQL базы данных
2014-01-04 02 Алексей Зиновьев. Выбор NoSQL базы данныхОмские ИТ-субботники
 
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только одинSECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только одинSECON
 
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON
 
разработка бизнес приложений (9)
разработка бизнес приложений (9)разработка бизнес приложений (9)
разработка бизнес приложений (9)Alexander Gornik
 
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"Alexey Zinoviev
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, ParallelsNikolay Samokhvalov
 
Что должен уметь Linux программист
Что должен уметь Linux программистЧто должен уметь Linux программист
Что должен уметь Linux программистru_Parallels
 
Практика эксплуатации уязвимостей в прикладных программах
Практика эксплуатации уязвимостей в прикладных программах Практика эксплуатации уязвимостей в прикладных программах
Практика эксплуатации уязвимостей в прикладных программах solertia
 
High load2007 scaling-web-applications-rus
High load2007 scaling-web-applications-rusHigh load2007 scaling-web-applications-rus
High load2007 scaling-web-applications-rusVladd Ev
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только одинHappyDev
 
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013Alex Chistyakov
 
Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Serguei Gitinsky
 
Dz Java Hi Load 0.4
Dz Java Hi Load 0.4Dz Java Hi Load 0.4
Dz Java Hi Load 0.4HighLoad2009
 

Semelhante a Практическое создание крупного масштабируемого web 20 c нуля, Дмитрий Бородин (20)

Web20 from zero
Web20 from zeroWeb20 from zero
Web20 from zero
 
Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)
Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)
Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)
 
Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrus
 
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
 
Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на Java
 
MySQL: проблемы роста
MySQL: проблемы ростаMySQL: проблемы роста
MySQL: проблемы роста
 
2014-01-04 02 Алексей Зиновьев. Выбор NoSQL базы данных
2014-01-04 02 Алексей Зиновьев. Выбор NoSQL базы данных2014-01-04 02 Алексей Зиновьев. Выбор NoSQL базы данных
2014-01-04 02 Алексей Зиновьев. Выбор NoSQL базы данных
 
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только одинSECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
 
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
 
разработка бизнес приложений (9)
разработка бизнес приложений (9)разработка бизнес приложений (9)
разработка бизнес приложений (9)
 
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels
 
Что должен уметь Linux программист
Что должен уметь Linux программистЧто должен уметь Linux программист
Что должен уметь Linux программист
 
Highload 2011-demona
Highload 2011-demonaHighload 2011-demona
Highload 2011-demona
 
Практика эксплуатации уязвимостей в прикладных программах
Практика эксплуатации уязвимостей в прикладных программах Практика эксплуатации уязвимостей в прикладных программах
Практика эксплуатации уязвимостей в прикладных программах
 
High load2007 scaling-web-applications-rus
High load2007 scaling-web-applications-rusHigh load2007 scaling-web-applications-rus
High load2007 scaling-web-applications-rus
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
 
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
 
Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013
 
Dz Java Hi Load 0.4
Dz Java Hi Load 0.4Dz Java Hi Load 0.4
Dz Java Hi Load 0.4
 

Mais de Fuenteovejuna

Facebook, Robert Johnson
Facebook, Robert JohnsonFacebook, Robert Johnson
Facebook, Robert JohnsonFuenteovejuna
 
Интеграция открытых технологий и взаимодействие со сторонними проектами в усл...
Интеграция открытых технологий и взаимодействие со сторонними проектами в усл...Интеграция открытых технологий и взаимодействие со сторонними проектами в усл...
Интеграция открытых технологий и взаимодействие со сторонними проектами в усл...Fuenteovejuna
 
Shared Personalization Service - How To Scale to 15K RPS, Patrice Pelland
Shared Personalization Service - How To Scale to 15K RPS, Patrice PellandShared Personalization Service - How To Scale to 15K RPS, Patrice Pelland
Shared Personalization Service - How To Scale to 15K RPS, Patrice PellandFuenteovejuna
 
Оптимизация одного из топовых приложений для социальной сети ВКонтакте: 1000 ...
Оптимизация одного из топовых приложений для социальной сети ВКонтакте: 1000 ...Оптимизация одного из топовых приложений для социальной сети ВКонтакте: 1000 ...
Оптимизация одного из топовых приложений для социальной сети ВКонтакте: 1000 ...Fuenteovejuna
 
Social Monitoring Tool codename Looking Glass, Patrice Pelland
Social Monitoring Tool codename Looking Glass, Patrice PellandSocial Monitoring Tool codename Looking Glass, Patrice Pelland
Social Monitoring Tool codename Looking Glass, Patrice PellandFuenteovejuna
 
Профилирование памяти в приложениях на Python, Антон Грицай
Профилирование памяти в приложениях на Python, Антон ГрицайПрофилирование памяти в приложениях на Python, Антон Грицай
Профилирование памяти в приложениях на Python, Антон ГрицайFuenteovejuna
 
Компиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоКомпиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоFuenteovejuna
 
Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...
Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...
Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...Fuenteovejuna
 
Использование 0MQ для построения low latency распределёных систем, Андрей Охл...
Использование 0MQ для построения low latency распределёных систем, Андрей Охл...Использование 0MQ для построения low latency распределёных систем, Андрей Охл...
Использование 0MQ для построения low latency распределёных систем, Андрей Охл...Fuenteovejuna
 
Некоторые аспекты влияния сходимости протокола BGP на доступность сетевых рес...
Некоторые аспекты влияния сходимости протокола BGP на доступность сетевых рес...Некоторые аспекты влияния сходимости протокола BGP на доступность сетевых рес...
Некоторые аспекты влияния сходимости протокола BGP на доступность сетевых рес...Fuenteovejuna
 
Тандемные DDoS-атаки. Проблематика уязвимостей в спецификации TCP IP (фундаме...
Тандемные DDoS-атаки. Проблематика уязвимостей в спецификации TCP IP (фундаме...Тандемные DDoS-атаки. Проблематика уязвимостей в спецификации TCP IP (фундаме...
Тандемные DDoS-атаки. Проблематика уязвимостей в спецификации TCP IP (фундаме...Fuenteovejuna
 
Динамика DDoS-атак в России, Александр Лямин
Динамика DDoS-атак в России, Александр ЛяминДинамика DDoS-атак в России, Александр Лямин
Динамика DDoS-атак в России, Александр ЛяминFuenteovejuna
 
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай КондратовБыстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай КондратовFuenteovejuna
 
Extreme Cloud Storage on FreeBSD, Андрей Пантюхин
Extreme Cloud Storage on FreeBSD, Андрей ПантюхинExtreme Cloud Storage on FreeBSD, Андрей Пантюхин
Extreme Cloud Storage on FreeBSD, Андрей ПантюхинFuenteovejuna
 
Мониторинг XXI-век, Алиса Смирнова, Дима Никоненко
Мониторинг XXI-век, Алиса Смирнова, Дима НиконенкоМониторинг XXI-век, Алиса Смирнова, Дима Никоненко
Мониторинг XXI-век, Алиса Смирнова, Дима НиконенкоFuenteovejuna
 
Native Client, Евгений Эльцин
Native Client, Евгений ЭльцинNative Client, Евгений Эльцин
Native Client, Евгений ЭльцинFuenteovejuna
 
Tarantool Silverbox, Юрий Востриков
Tarantool Silverbox, Юрий ВостриковTarantool Silverbox, Юрий Востриков
Tarantool Silverbox, Юрий ВостриковFuenteovejuna
 
Real time indexes in Sphinx, Yaroslav Vorozhko
Real time indexes in Sphinx, Yaroslav VorozhkoReal time indexes in Sphinx, Yaroslav Vorozhko
Real time indexes in Sphinx, Yaroslav VorozhkoFuenteovejuna
 
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав Крюков
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав КрюковSphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав Крюков
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав КрюковFuenteovejuna
 
Масштабируемая система голосования на базе PostgreSQL PgQ, Сергей Нековаль
Масштабируемая система голосования на базе PostgreSQL PgQ, Сергей НековальМасштабируемая система голосования на базе PostgreSQL PgQ, Сергей Нековаль
Масштабируемая система голосования на базе PostgreSQL PgQ, Сергей НековальFuenteovejuna
 

Mais de Fuenteovejuna (20)

Facebook, Robert Johnson
Facebook, Robert JohnsonFacebook, Robert Johnson
Facebook, Robert Johnson
 
Интеграция открытых технологий и взаимодействие со сторонними проектами в усл...
Интеграция открытых технологий и взаимодействие со сторонними проектами в усл...Интеграция открытых технологий и взаимодействие со сторонними проектами в усл...
Интеграция открытых технологий и взаимодействие со сторонними проектами в усл...
 
Shared Personalization Service - How To Scale to 15K RPS, Patrice Pelland
Shared Personalization Service - How To Scale to 15K RPS, Patrice PellandShared Personalization Service - How To Scale to 15K RPS, Patrice Pelland
Shared Personalization Service - How To Scale to 15K RPS, Patrice Pelland
 
Оптимизация одного из топовых приложений для социальной сети ВКонтакте: 1000 ...
Оптимизация одного из топовых приложений для социальной сети ВКонтакте: 1000 ...Оптимизация одного из топовых приложений для социальной сети ВКонтакте: 1000 ...
Оптимизация одного из топовых приложений для социальной сети ВКонтакте: 1000 ...
 
Social Monitoring Tool codename Looking Glass, Patrice Pelland
Social Monitoring Tool codename Looking Glass, Patrice PellandSocial Monitoring Tool codename Looking Glass, Patrice Pelland
Social Monitoring Tool codename Looking Glass, Patrice Pelland
 
Профилирование памяти в приложениях на Python, Антон Грицай
Профилирование памяти в приложениях на Python, Антон ГрицайПрофилирование памяти в приложениях на Python, Антон Грицай
Профилирование памяти в приложениях на Python, Антон Грицай
 
Компиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоКомпиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей Романенко
 
Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...
Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...
Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...
 
Использование 0MQ для построения low latency распределёных систем, Андрей Охл...
Использование 0MQ для построения low latency распределёных систем, Андрей Охл...Использование 0MQ для построения low latency распределёных систем, Андрей Охл...
Использование 0MQ для построения low latency распределёных систем, Андрей Охл...
 
Некоторые аспекты влияния сходимости протокола BGP на доступность сетевых рес...
Некоторые аспекты влияния сходимости протокола BGP на доступность сетевых рес...Некоторые аспекты влияния сходимости протокола BGP на доступность сетевых рес...
Некоторые аспекты влияния сходимости протокола BGP на доступность сетевых рес...
 
Тандемные DDoS-атаки. Проблематика уязвимостей в спецификации TCP IP (фундаме...
Тандемные DDoS-атаки. Проблематика уязвимостей в спецификации TCP IP (фундаме...Тандемные DDoS-атаки. Проблематика уязвимостей в спецификации TCP IP (фундаме...
Тандемные DDoS-атаки. Проблематика уязвимостей в спецификации TCP IP (фундаме...
 
Динамика DDoS-атак в России, Александр Лямин
Динамика DDoS-атак в России, Александр ЛяминДинамика DDoS-атак в России, Александр Лямин
Динамика DDoS-атак в России, Александр Лямин
 
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай КондратовБыстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
 
Extreme Cloud Storage on FreeBSD, Андрей Пантюхин
Extreme Cloud Storage on FreeBSD, Андрей ПантюхинExtreme Cloud Storage on FreeBSD, Андрей Пантюхин
Extreme Cloud Storage on FreeBSD, Андрей Пантюхин
 
Мониторинг XXI-век, Алиса Смирнова, Дима Никоненко
Мониторинг XXI-век, Алиса Смирнова, Дима НиконенкоМониторинг XXI-век, Алиса Смирнова, Дима Никоненко
Мониторинг XXI-век, Алиса Смирнова, Дима Никоненко
 
Native Client, Евгений Эльцин
Native Client, Евгений ЭльцинNative Client, Евгений Эльцин
Native Client, Евгений Эльцин
 
Tarantool Silverbox, Юрий Востриков
Tarantool Silverbox, Юрий ВостриковTarantool Silverbox, Юрий Востриков
Tarantool Silverbox, Юрий Востриков
 
Real time indexes in Sphinx, Yaroslav Vorozhko
Real time indexes in Sphinx, Yaroslav VorozhkoReal time indexes in Sphinx, Yaroslav Vorozhko
Real time indexes in Sphinx, Yaroslav Vorozhko
 
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав Крюков
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав КрюковSphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав Крюков
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав Крюков
 
Масштабируемая система голосования на базе PostgreSQL PgQ, Сергей Нековаль
Масштабируемая система голосования на базе PostgreSQL PgQ, Сергей НековальМасштабируемая система голосования на базе PostgreSQL PgQ, Сергей Нековаль
Масштабируемая система голосования на базе PostgreSQL PgQ, Сергей Нековаль
 

Практическое создание крупного масштабируемого web 20 c нуля, Дмитрий Бородин

  • 2. Об авторе В настоящее время – развлекательное приложение «Лице-Мер»: •5-е место в рунете по посещаемости в категории «Общение». Выше по посещаемости - только 3 соц.сети, сами «Вконтакте» и «Мой мир». •Более 1.100.000 «уников» в сутки. •20.000 SQL запросов/с. В прошлом - php.spb.ru (DiMA), первый сайт на русском о PHP (1997г).
  • 4. Приступая к разработке… Традиционный подход к разработке: ТЗ, функционал, ООП. Неправильные вопросы: выбор языка, базы, фреймворка. На фоне главных задач, эти – не существенны.
  • 5. Слово «Highload» обманчиво Проект, имеющий масштабирование, способен выдержать любую нагрузку, даже если там ужасный код и не оптимизированный SQL. Думайте не о Highload, а об архитектуре.
  • 6. Проблема первого шага [1] • Все новое – принимается в штыки. • Богатый опыт программирования – мешает. Вас ждет кардинально другой подход к разработке, как администратора и архитектора ПО, а не профессионального программиста.
  • 7. Проблема первого шага [2] 99% стартапов web 2.0 никогда не запустятся чисто по техническим причинам – проект не был правильно масштабирован с нуля. Никто не умеет строить крупные web 2.0 проекты кроме тех, кто их уже имеет – запущенные и выжившие социальные сети с млн. пользователей. При проектировании 100 млн. пользователей не должны вызывать проблем .
  • 8. Честное горизонтальное масштабирование Проект разбит на множество независимых компонент, способных выполняться на разных серверах (честно). Все что можно, заранее разбито по множеству баз, серверов, очередей и т.д. Ничего на «потом» откладывать нельзя. Думайте об этом заранее. Проект может наращивать системный администратор без участия программистов и правки кода, под контролем архитектора ПО.
  • 9. Честное горизонтальное масштабирование Масштабирование – это не репликация. SQL кластеры и прочие «серьезные» решения – тупиковые, в масштабировании не применимы.
  • 10. Часть 2. Доказательства приведенной теории. Технические причины, почему ваш стартап гарантированно никогда не запустится. Примеры типичных страниц в любой социальной сети.
  • 11. Невозможная задача №1 Мы делаем очередной клон самой популярной соц.сети. 100.000.000 пользовательских профайлов: •Таблица с профайлами: ФИО, аватар, город… •Таблица со списком друзей. Данные разбиты на 200-300 SQL серверов.
  • 12. Страница «Мои друзья» Попробуем реализовать эту страницу. •Список user_id друзей (100 шт.) •Веб-страница должна показать друзьй по алфавиту: ФИО, аватар, пол, город. •User_id из списка – случайные. Данные о каждом разбросаны случайно по 200 SQL.
  • 13. Как получить данные? Обращаться к 100 SQL серверам – нереально. Каждая веб-страница может сделать 2-3 SQL запроса максимум. User_id могут быть вообще случайны: из поиска по анкетам. Вывод: традиционный подход программирования не применим.
  • 14. Расширяем проблему Замените слово «друзья» на другую сущность крупного проекта: •запись в блоге/форуме •статья в СМИ •описание товара в магазине
  • 15. Невозможная задача №2 На всех социальных сайтах есть подписка на разные события по друзьям. Друг или автор, на которого вы подписаны, сгенерировал некое событие: •Загрузил фото, статью, файл и т.д. •Оставил комментарий к существующему объекту (фото, статья и т.д.) Эти данные должны мгновенно отображаться в вашей ленте новостей.
  • 16. Вывод Забудьте про суть проекта, его функционал, назначение и т.д. Сегодня вы задумали обычный проект. Со временем захотите web 2.0. Спроектируйте проект на бумаге заранее для всей web 2.0 функций.
  • 17. Часть 3. О главном: •Правильное оперирование данными •Многопоточность и атомарность в SQL/Memcache •Отложенная обработка Memcache – удивительно сложная система «Невозможная задача»
  • 18. Какую БД выбрать? Выбор небольшой – MySQL и PostgreSQL. Разницы – нет, т.к. используем 1% их возможностей. Многие крупные проекты используют MySQL. Стыдится использовать MySQL в серьезных проектах не нужно. Призыв к той или иной БД – ошибка от непонимания задачи.
  • 19. Какой язык выбрать? Ответ: не важно. Проблема и задачи масштабирования лежат в иной плоскости. Рекомендую самые простые и распространенные инструменты: PHP, php-fpm, nginx, MySQL, memcache, Redis. Призыв к выбору языка/фреймворка – ошибка от непонимания задачи.
  • 20. Тщательность изучения Без тщательно изучения выбранных инструментов ничего не работает. Пример: •Знание memcache на уровне команд set/get – это 0.5% того, что надо. •Знание наизусть документации (+cas) – это 5% всего, что надо знать. Остальные 95% опыта (проблем) возникнут при настоящем Highload.
  • 21. О главном [1/3] Основная задача, о которой нужно думать для создания горизонтально масштабируемого проекта – как хранить и оперировать данными. Тщательный подход не к оптимизации SQL запроса и коду, а к минимизации кол-ва чтения и записи данных. Основные правила highload так же надо соблюдать.
  • 22. О главном [2/3] Очень важно думать о многопоточности и атомарности операций. Это нужно применять и в обычном программировании, но в highload без этого вообще ничего не работает. Главные инструменты решения проблем: SQL и Memcache/Redis. Как показывает практика, об этом никто не задумывается. А к непонятным редким багам относятся философски.
  • 23. О главном [3/3] Последняя из важнейших оптимизаций – все что можно (и нельзя) отложите в фоновую обработку cron-скриптам. Более подробно – чуть позже.
  • 24. Пример оперирования данными К тезису «О главном [1]». Допустим, для решения одной задачи, нужно получать данные рандомно из БД. В таком случае вы займетесь оптимизациями “SELECT … ORDER BY rand()”, настройками БД и т.д. Суть правильного подхода к высоким нагрузкам – вы не должны хотеть использовать “ORDER BY” вообще. Не создавайте себе проблемы.
  • 25. Memcache – это не кеш! • Полноценная и надежная база данных с уникальными возможностями, недоступными в SQL. • Никакой многопоточности. Долой эксперименты. • Полезен в любых проектах, даже не масштабируемых. • Важнейшая роль в хранении денормализованных данных. • Один из инструментов решения «невозможной задачи №1».
  • 26. Тонкости Memcache Memcache – с виду прост. На деле - в 100 раз сложнее, чем вы думаете! На примере класса для работы с блокировками. Особая роль кодов возврата (помимо return) и разветвление логики. Публично доступны классы и статьи – псевдонаучны и поверхностны. Тема Memcache в Highload – отдельный мастер-класс на 8 часов.
  • 27. Memcache::CAS() Вся мощь в атомарности операций вашего кода на PHP. CAS – это не транзакции и не блокировки, известные по SQL. Минусы транзакций и блокировок все понимают. У CAS их нет (есть другие).
  • 28. Memcache и сессии Сессии на PHP блокируют потоки. Сессии в memcache - типичный антипаттерн и баги. Идеальный вариант – версионные сессии на CAS(): •Нет блокировок •Много потоков работает параллельно •Данные не теряются при одновременной записи
  • 29. Memcache и большие массивы По аналогии с сессиями – в одном ключе удобно хранить большие сложные многомерные массивы: •Много потоков читают и пишут •Выполняют атомарные операции, без нарушения логики
  • 30. Memcache Highload MemcacheDB, как и SQL, упирается в лимиты: iostat, CPU, MEM. Готовьтесь к дроблению и миграции до начала разработки. Важная опция: период записи журнала на диск: •По умолчанию – 5 минут, проект каждые 5 минут висит по 10 секунд. •Рекомендую – 30 секунд, подписание почти незаметно.
  • 31. SQL: атомарность и многопоточность Важность обдумывания многопоточности. Основное заблуждение: транзакции решают проблемы. Далее – характерная задача…
  • 32. Характерная задача Изначально некий скрипт работал в один поток с неким абстрактным ресурсом. Пример ресурса: отправка SMS (не чаще 1 sms/сек – иначе бан) или проигрывание нескольких нот (случайные мелодии на 5 секунд). Потом скрипт стали запускать в много потоков. Как не допустить порчи абстрактного ресурса, если он сам не имеет средства защиты от параллельной подачи ему команд разными потоками? Нужно очень простое и короткое решение в 2-5 строк кода.
  • 33. Типичное ошибочное решение С файлами: прочитать файл, если там нет флага «Занято», записать его туда и начать работу. С SQL: сначала по SELECT получить флаг и если его нет (либо «Свободно»), записать туда по UPDATE/INSERT флаг «Занято». Типичный антипаттерн.
  • 34. Решения задачи • SQL – блокировки: SELECT … FOR UPDATE, LOCK TABLES, GET_LOCK. • SQL – транзакции • SQL – псевдоочереди (Primary Key, Auto_increment или ORDER BY) • SQL – атомарность (UPDATE TABLE SET flag=‘BUSY’ WHERE flag=‘FREE’) • Memcache – атомарность add() или cas() • Файловая система: flock() – причем очень легко незаметно ошибиться! Трюки от атомарных операций с ФС: mkdir и пр. • Операционная система: shared memory и прочие трюки - открыть порт и т.д.
  • 35. Лучшее решение задачи • UPDATE … SET flag=1 WHERE flag=0 • SELECT … FOR UPDATE • Memcache::lock() и unlock() – на основе собственного класса Лично решите эту задачу 20-ю разными способами. И вам откроется темная сторона силы.
  • 36. Статистика по задаче Из примерно 200 хороших программистов (новичков не приглашали) в год на собеседовании в нашу компанию: •60% не ответили вообще (100% допустили типичную ошибку) •30% придумали плохие решения: LOCK TABLE или flock() •10% придумали решения с атомарностью SQL и/или очередями. •Ни один человек не назвал SELECT .. FOR UPDATE или memcache. Вывод: никто не задумывается об этом в обычной жизни.
  • 37. Часть 4 Конкретные технические подробности в Highload и масштабировании. Практика использования SQL и memcache в больших масштабах. Не используйте “KETAMA” в больших проектах. Проблемы, затыки, решения, трюки, оптимизация SQL и Memcache
  • 38. SQL Highload [1] Все запросы – простейшие выборки по Primary key. Без JOIN или вложенных запросов. Доп. индексы в InnoDB могут глючать (опасность). SELECT count(*) никогда не применяйте, слишком медленно. Альтернатива для Select count(*).
  • 39. SQL Highload [2] Auto_increment замените на Sequence, для возможной репликации SQL. Репликацию SQL для шардинга не используйте. Применение Sphinx не нужно, когда можно обойтись простым SQL. Репликация решает задачу по поиску десятков млн. профайлов. Следите за размерами таблиц. Будьте готовы их разбить. Это должен уметь делать администратор без участия программиста.
  • 40. SQL Highload [3] Проблема отката транзакций: запросы на 2 сервера + memcache. Транзакции – зло. По возможности замените на SQL-атомарность и Memcache::lock() по действиям пользователя. Снижайте уровень изоляции транзакций, опция transaction_isolation. Необходимо изучить теорию уровней изоляции транзакций. За годы собеседований на этот вопрос отвечают крайне редко.
  • 41. SQL Highload [4] Правильное оперирование данными: SQL потребляет мало CPU. Пропускная способность сервера упирается только в жесткие диски. Карта спотов и миграция пользователей между серверами. Нагрузки по серверам заранее не предугадать.
  • 42. SQL Highload [5] Очень редко обсуждаемая опция innodb_flush_log_at_trx_commit. •1 или 2 – часто сохранятся, сильно грузить диск, надежно. •0 – реже сохраняться, меньше загрузка диска, не надежно. Жертвуем надежностью, выжимаем большую скорость. Остальные советы традиционны: настроить буферы в памяти, отключить кеш запросов, разобраться с методами записи данных и пр.
  • 43. SQL кеш [1] Паттерн сохранения в кеш результатов (чтение и обновление). Типичные массовые ошибки: •не правильно составлен ключ/тег в имени кешируемого объекта •забыли уничтожить кеш при обновлении. Заведите константу, отключающую кеш по всему проекту с целями отладки. Все сразу заработало? Баг найден за 5 секунд!
  • 44. SQL кеш [2] Самый сложный и часто встречаемый баг – это кусок кода, который вы забыли написать. Согласно статистике, 30% от всех багов – «баг отсутствия кода». Нет кода – нечего отлаживать. Но баг то есть! Часто связан с неправильным кешированием. Полезность unit-тестов для самоконтроля.
  • 45. Лавинообразные нагрузки Пусть, 100.000.000 пользователей разбиты в таблицы по 1000 пользователей (это называется «спот»). Таблица – файл на диске. Таблицы – это список профайлов или личных сообщений. Иногда SQL начинает зависать => пользователи шлют еще запросы => больше PHP-потоков подвисает => подвисают и CRON-скрипты, не обрабатывая других пользователей => SQL прекращает исполнять любые соединения => полный паралич всей системы.
  • 46. Защита от лавины Благодаря разбиению пользователей на мелкие пачки (споты), выявляем зависшие из них и зависшие user_id. Для этого мониторим PROCESSLIST всех SQL серверов раз в секунду. Заносим в черный список зависшие споты и user_id. Легкая защита: не принимаем никаких запросов от user_id. Команда CRON-скриптам игнорировать разбор и возвращать их в очередь. Железная защита: убиваем все запросы, связанные с зависшими спотами.
  • 47. Причина лавины Их всего три. Первые – наиболее вероятны. Физическая. Сервер уперся в лимит по скорости чтения/записи жесткого диска. При попытке обработать очередной спот, таблица которого не в ОЗУ, происходит долгое ожидание жестких дисков. См. `iostat`. Логическая. Очень большая таблица. Например, спам на 1.000.000 сообщений. Обычно летающие запросы стали слишком тяжелы, CPU+iostat неожиданно взлетелы. Необходимо следить за размерами таблиц. Редкая. Вы просто уперлись в возможности сервера.
  • 48. SQL шардинг [1] Представим, что мы делаем клон самой популярной социальной сети. Имеется 100.000.000 пользователей: профайлы, сообщения, друзья, сведения о файлах и т.д. Что такое шардинг.
  • 49. SQL шардинг [2] Типы данных. Пользовательская информация: друзья, профайлы, сообщения, статьи, записи в блогах, файлы. «Социальность», порожденная пользователями. Общая информация: списки пользователей по признакам, карта спотов, конфиги, логи проекта, cron-мониторинг, служебные сообщения. Справочники: таблицы для поиска пользователей, каталог общих объявлений, баннерная вертушка, каталог товаров магазина и т.д.
  • 50. SQL шардинг [3] Пользовательская информация: хранится по спотам. Споты добавляются по мере роста числа пользователей. Общая информация: лежит в одной базе. Нагрузки мизерные. В масштабировании не нуждается. Обычные скрипты не читают эту базу. Справочники: из-за очень интенсивной нагрузки заводим множество SQL- реплик. Поиск даже по десяткам млн. пользователей летает!
  • 51. SQL шардинг [4] Друзья, сообщения, профайлы и т.д. – пусть будет всего 50 типов таблиц. В каждом споте (набор 50 таблиц) хранится информация только о какой-то 1000 пользователей из 100 млн. Итого имеется 100 000 000/1000 = 100 000 спотов, т.е. 100 000*50 = 5 000 000 SQL таблиц. Заведем 150 серверов. На каждом по 1 инстансу MySQL: 100 000 000/150 = от 600 000 до 700 000 пользователей, 600 спотов, 30 000 таблиц. Проблема переполнения каталога файлами.
  • 52. Невозможное возможно Очевидный вывод из шардинга –JOIN невозможен. Как решить «Невозможную задачу №1», чтобы вывести на экран ФИО, аватар и город абсолютно случайных 100 пользователей из 100 000 000? Необходимо разместить в супер быстрой памяти только то, что реально нужно: ФИО, аватар и город. Ничего лишнего! Иначе супер быстрая память станет медленной.
  • 53. Авторайзер [1] Запустим 150 инстансов MemcacheDB, по числу SQL серверов. В них хранится только важное: ФИО, аватар и т.д. Имея 100 разных user_id читаем данные с авторайзеров. Еще разок кешируем. Главная задача архитектора ПО: пресекать запись ненужных данных, следитьза за iostat, разбивать на более мелкие. Карта спотов авторайзеров.
  • 54. Авторайзер [2] Не храним невосполнимых данных. Скрипт миграции по серверам и восстановления из SQL. Имеющиеся бекап системы для memcacheDB не работают.
  • 55. Ketama в memcache – зло «Ketama» отлично подойдет небольшому проекту и только для кеша. Для авторайзеров использовать ее нельзя: •Сервера не могут умирать и помечаться недоступными. •Непоследовательное распределения ключей по серверам. Функцию getMulti эмулируем php-кодом.
  • 56. Отложенная обработка 90% информации пишем не в SQL и Memcache, а в очереди. Иерархия очередей. Зависание нижней очереди не рушит более важный процесс. Привер. Обновление поля => очередь => запись в авторайзер => очередь => запись в профайл SQL => расчет ТОПов => очередь => статистика, контроль спама и т.д. Мониторинг очередей, устранение проблем.
  • 58. Технические характеристики [1] • Более 1.100.000 «уников» в сутки. • Около 60.000 онлайн пользователей. • База пользователей более 8.000.000. • Около 100 очень слабых серверов. • 20.000 SQL/с и 3000 запросов/с на балансере. • около 100 серверов, 600МБит/с трафик.
  • 59. Технические характеристики [2] • Разработка – 3 месяца. Запуск – 2,5 месяца назад (6 августа). • Более месяца проект находится в ТОПе ВКонтакте по посещаемости на первом месте. • Другие проекты: журнал Вкурсе и www.Truegle.ru
  • 60. Технические характеристики [3] PHP 5.3, MySQL, php-fpm, APC/xcache (зависит от версии и глючности PHP), nginx, memcache с патчами. Очереди – в Redis. Настоящий php-модуль для работы с Redis (не существует в мире). Ближайшие планы. Серийный выпуск масштабируемых проектов.
  • 61. Спасибо за внимание! С удовольствием отвечу на ваши вопросы. Дмитрий Бородин Skype: borodin777 dima777@gmail.com