SlideShare a Scribd company logo
Горизонтальное
масштабирование
Что, зачем, когда и как
Александр Макаров
Yii core team, Stay.com
slides.rmcreative.ru/2015/horizontal-scaling-highload/
Что такое
масштабирование?
Возможность увеличить производительность проекта
за минимальное время путём добавления ресурсов.
Способы
масштабирования
— Вертикальное. Больше памяти, быстрее диск,
лучше процессор в пределах одного сервера.
— Горизонтальное. Больше серверов в кластере.
А оно надо? И так всё
работает!
Как проверить?
—
— siege
ab
ab
ab ‐n 100 ‐c 10 http://example.com/
 
Concurrency Level:      10 
Time taken for tests:   1.889 seconds 
Complete requests:      100 
Failed requests:        0 
Write errors:           0 
Total transferred:      1003100 bytes 
HTML transferred:       949000 bytes 
Requests per second:    52.94 [#/sec] (mean) 
Time per request:       188.883 [ms] (mean) 
Time per request:       18.888 [ms] (mean, across all concurrent requests) 
Transfer rate:          518.62 [Kbytes/sec] received 
 
Connection Times (ms) 
              min  mean[+/‐sd] median   max 
Connect:       57   59   1.7     59      64 
Processing:   117  126   7.5    124     162 
Waiting:       57   62   7.0     60      98 
Total:        175  186   8.0    184     224 
 
Percentage of the requests served within a certain time (ms) 
  50%    184 
  66%    186 
  75%    187 
  80%    188 
  90%    192 
  95%    203 
  98%    216 
siege
siege ‐b ‐c10 ‐t60S http://example.com/
 
** SIEGE 2.72 
** Preparing 10 concurrent users for battle. 
The server is now under siege... 
Lifting the server siege...      done. 
 
Transactions:               4066 hits 
Availability:             100.00 % 
Elapsed time:              60.00 secs 
Data transferred:          13.73 MB 
Response time:              0.22 secs 
Transaction rate:          67.77 trans/sec 
Throughput:             0.23 MB/sec 
Concurrency:               14.95 
Successful transactions:        4066 
Failed transactions:               0 
Longest transaction:            3.28 
                    
— RPS / TPS
— Response time
Бывает, что не надо...
пока
— Обновить PHP (+40%)
— OpCache + потюнить (не должно быть misses)
— Добавить индексы в БД, пооптимизировать
— Включить кеш (memcache, Redis)
— Apache → nginx + php-fpm
Далее будут доклады
на тему оптимизации
— PostgreSQL, Илья Космодемьянский
— MySQL, Василий Лукьянчиков
Это просто и может
дать вам время
Мало!!!
Но мы же уже всё
сделали?!
Мониторинг
— Выиграйте время
— Настройте мониторинг
— Он покажет, куда и как расти
Повторяйте постоянно.
Что может показать
мониторинг
— Упёрлись в диск
— Мало памяти
— Мало процессора
— Сеть не выдерживает
— Всё более-менее, но ошибки валятся
— ...
На что обращать
внимание прямо
сейчас
— Доступность
— Нехватка ресурсов
— Ошибки
Мониторим ресурсы
—
—
—
—
—
Monit
Zabbix
Munin
Nagios
ServerDensity
Мониторим ошибки
—
—
Rollbar
Sentry
Нотификации
Важно уведомить, но не стоит спамить.
Что анализировать
— RPS
— Response time
— Количество процессов
— Количество потоков
— Размеры очередей
— ...
Будет подробно в
докладе Александра
Крижановского завтра
Бизнес-анализ
—
—
— На основе своих данных (позже)
Google Analytics
mixpanel
Когда?
Нагрузка бывает как запланированная, так и нет:
— Сезонная
— Реклама
— Новости
— Акции
Как бороться с
нагрузкой?
Бизнес решает. Важна цена вопроса.
Возможно, это будет
дешевле:
— Профайлинг, очевидные оптимизации
— Кеш в memcached
— Правка конфигов сервера
— ...
Если железо дешевле
программиста
Типичная схема
Балансировщик + несколько серверов приложения
Что даёт?
— Возможность обработать больше запросов
— Надёжность
Почему PHP так хорош
для масштабирования
Share nothing по умолчанию.
То есть слабая связанность для слоя серверов
приложений.
Балансировка
нагрузки
— nginx
—
—
— Аппаратные
Squid
HAProxy
Проблемы
— Как выбрать сервер?
— Как хранить сессии?
Выбор сервера
— По очереди из списка (round-robin)
— География IP
— Статистика (least-connected, доступность)
— Как-то ещё
nginx
h p://nginx.org/en/docs/h p/load_balancing.html
А что если упрёмся в
балансировщик?
Сессии
— По умолчанию в файлах
— NFS?
— БД?
— Нельзя писать в кеш, если данные в сессии важны
— Можно поместить в общее отдельное хранилище
— Redis однопоточный
— По Redis на каждом инстансе, sticky-сессии (ip-hash)
Прокси для memcached
и Redis
h ps://github.com/twi er/twemproxy
Не пишите своего
аналога сессий,
используйте PHP!
—
—
h ps://php.net/manual/ru/class.sessionhandler.php
h ps://php.net/manual/ru/function.session-set-save-
handler.php
Закрывайте сессии
session_write_close();
Файлы
— Специализированное решение
— «Шардирование» средствами PHP
Специализированные
решения
—
—
GlusterFS
Amazon S3
PHP
Flysystem
Раздача
—
—
nginx
Varnish
Замечания
— Не хранить в базе!
— Можно хранить локальный кеш. Например, для
роутинга запросов.
База данных
— Репликация master-slave
— Репликация master-master
— Репликация руками
— Шардирование
— Партицирование (расскажет Денис Иванов далее)
master-slave
Зачем?
— Читаем больше, чем пишем? Будет быстрее.
— Отказоустойчивость.
— Бэкапы (реплику можно остановить).
— Тяжёлые вычисления (о статистике далее).
read/write split
— 2 пула серверов: master, slave
— Соединение по требованию
— Логика выбора соединения варьируется...
Логика
— Писать всегда в master
— Только чтение с slave (array_rand())
— Чтение для записи - ...
Засада... репликация
лагает
Иногда данные попадают с master на slave с задержкой.
Для MySQL:
mysql ‐e "SHOW SLAVE STATUS;" | grep Seconds_Behind_Master
PostgreSQL:
select now() ‐ pg_last_xact_replay_timestamp() AS replication_delay;
— 0 = OK. Читаем с slave.
— Больше 0 = ждём или читаем с master.
— NULL = ещё не реплицировали (логи!). Читаем с
master.
Причины
— Медленная сеть.
— Не справляется реплика.
— Слишком много слейвов (>20 на мастер).
master-master
Зачем?
— Отказоустойчивость.
— Может быть быстрее.
Логика
Выбираем рандомное соединение.
Минусы
— Лаг репликации выше.
— Поломка = потеря данных. Поломка
реплицируется.
— Может забить сеть.
О репликации в MySQL
сегодня расскажет
Андрей Аксенов
Репликация руками
Всегда можно сделать это руками.
Шардирование
Размазывание данных по нескольким серверам.
Отдельные таблицы
Отдельные соединения. WHERE IN вместо JOIN.
Часть одних и тех же
данных
где 3 - количество серверов. Альтернаива - map в key-
value хранилище.
Как выбрать сервер?
$connectionID = 'user_db' . ($user_id % 3 + 1);
Попроще
Попробовать разделить на части, которые
используются вместе, но не пересекаются.
Надо знать ID пользователя, но легко выбрать все его
посты, посортировать и т.д.
Посложнее
Не удаётся сгруппировать данные.
Надо знать ID данных, чтобы их достать. Никаких
JOIN, ORDER и т.д. Таблица используется как key-value.
Обычные задачи
становятся
необычными
— Выбрать TOP 10.
— Постраничная разбивка.
— Выбрать с наименьшей стоимостью.
— Выбрать посты юзера X.
А правильно ли мы
выбрали хранилище...
Шардинг из коробки
— memcache
— Redis
—
— ...
Cassandra
Подробно о
шардировании сегодня
будет в докладе
Дениса Иванова
Как быть со
статистикой?
Считать статистику по основным данным - ошибка.
— Скорее всего вам не нужен realtime.
— Не считайте статистику на основной базе.
— Специальный slave.
— OLAP
— Или что-то готовое...
Фоновая обработка
Всё, что не критично сделать прямо сейчас, можно
обработать в фоне.
Зачем?
— Быстрее ответ сервера
— Можно размазать нагрузку
— Можно обработать на другом сервере
— Можно обработать не PHP
— ...
Как?
— AMQP: ,
—
—
—
ActiveMQ RabbitMQ
beanstalkd
Amazon SQS
Gearman
Подробно будет
сегодня в докладе
Константина Осипова
Архитектура
Меньше связанности!
Чем меньше связанности, тем проще менять одно
решение на другое.
Связанность?
— В коде (SOLID, GRASP)
— В доменном слое
— В архитектуре в целом
SOA
— Система бьётся на отдельные логические части
— Части взаимодействуют через интерфейсы
Доменный слой
— Сверхважно отделить его от контекста, в котором
он выполняется
— Что происходит в самом слое не так важно, но
лучше делать это правильно
Про доменный слой
— Domain-Driven Design: Tackling Complexity in the
Heart of So ware, Eric Evans
— Implementing Domain-Driven Design, Implementing
Domain-Driven Design
— иBoundedContext DDD в общем
В архитектуре
— share nothing
— логика на стороне приложения
— низкая связанность
Не стоит
недооценивать
браузерную
оптимизацию
Абстракция и
дробление совсем не
бесплатны.
Не действуйте
вслепую.
Думайте.
Проверяйте.
Материалы
—
—
—
— Поискать по "highload" в рунете
— Поискать по "sclability" в англонете
Distributed systems for fun and profit
h p://ruhighload.com/
h p://www.insight-it.ru/
Как всё это
попробовать?
— DigitalOcean
— Linode
— ...
Вопросы?
—
—
slides.rmcreative.ru/2015/horizontal-scaling-highload/
rmcreative.ru

More Related Content

PPTX
Спасение 6 млн файлов в условиях полного хецнера (Даниил Подольский, Дмитрий ...
PDF
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)
PPTX
Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Моск...
PDF
Кэширование данных в web приложениях. Использование memcached / Юрий Красноще...
PDF
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
PDF
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
PDF
NoSQL - коротко о главном / Сергей Туленцев (TextMaster)
PDF
Android Cloud... точнее Cloud из Android / Охрименко Алексей (Acronis)
Спасение 6 млн файлов в условиях полного хецнера (Даниил Подольский, Дмитрий ...
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)
Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Моск...
Кэширование данных в web приложениях. Использование memcached / Юрий Красноще...
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
NoSQL - коротко о главном / Сергей Туленцев (TextMaster)
Android Cloud... точнее Cloud из Android / Охрименко Алексей (Acronis)

What's hot (20)

PPTX
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
PDF
Бинарные (файловые) хранилища: страшная сказка с мрачным концом / Даниил Подо...
PDF
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
PPTX
Поддержка высоконагруженного проекта: мониторинг, резервирование, обслуживани...
PDF
Загрузка больших объемов данных для бизнес-аналитики
PDF
С чего начать внедрение Hadoop в компании. Доклад Алексея Еремихина (Badoo).
PPTX
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
PDF
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
PPTX
Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...
PDF
Балансировка нагрузки и отказоустойчивость в Одноклассниках
PPTX
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
PPTX
Docker в работе: взгляд на использование в Badoo через год
PPTX
«Секретные» технологии инвестиционных банков / Алексей Рагозин (Дойче Банк)
PDF
Реализация восстановления после аварий / Сергей Бурладян (Avito)
PDF
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
PPTX
HDD, SSD, RAM, RAID, и кого на ком кэшировать / Михаил Конюхов (Perfect Solut...
PDF
Реалтайм статистика скорости работы нативных и веб-приложений у реальных поль...
PDF
Юрий Насретдинов, Badoo
PDF
Сергей Аверин "Распространенные ошибки применения баз данных"
PDF
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
Бинарные (файловые) хранилища: страшная сказка с мрачным концом / Даниил Подо...
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Поддержка высоконагруженного проекта: мониторинг, резервирование, обслуживани...
Загрузка больших объемов данных для бизнес-аналитики
С чего начать внедрение Hadoop в компании. Доклад Алексея Еремихина (Badoo).
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...
Балансировка нагрузки и отказоустойчивость в Одноклассниках
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
Docker в работе: взгляд на использование в Badoo через год
«Секретные» технологии инвестиционных банков / Алексей Рагозин (Дойче Банк)
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
HDD, SSD, RAM, RAID, и кого на ком кэшировать / Михаил Конюхов (Perfect Solut...
Реалтайм статистика скорости работы нативных и веб-приложений у реальных поль...
Юрий Насретдинов, Badoo
Сергей Аверин "Распространенные ошибки применения баз данных"
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
Ad

Viewers also liked (11)

PPTX
Как устроен поиск / Андрей Аксенов (Sphinx)
PPT
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
PDF
Как понять, что происходит на сервере? / Александр Крижановский (NatSys Lab.,...
PDF
Современная операционная система: что надо знать разработчику / Александр Кри...
PPTX
Как устроена MySQL-репликация / Андрей Аксенов (Sphinx)
PDF
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
PDF
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
PPTX
Какие бывают провайдеры услуг дата-центров и как выбрать оптимальный? / Игорь...
PDF
Как балансировать на «сетевом» канате под куполом тяжелой нагрузки? / Сергей ...
PDF
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
PDF
С чего начать внедрение Hadoop в компании / Алексей Еремихин (Badoo)
Как устроен поиск / Андрей Аксенов (Sphinx)
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Как понять, что происходит на сервере? / Александр Крижановский (NatSys Lab.,...
Современная операционная система: что надо знать разработчику / Александр Кри...
Как устроена MySQL-репликация / Андрей Аксенов (Sphinx)
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
Какие бывают провайдеры услуг дата-центров и как выбрать оптимальный? / Игорь...
Как балансировать на «сетевом» канате под куполом тяжелой нагрузки? / Сергей ...
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
С чего начать внедрение Hadoop в компании / Алексей Еремихин (Badoo)
Ad

Similar to Горизонтальное масштабирование: что, зачем, когда и как /Александр Макаров (Yii, Stay.com) (20)

PPT
Rybak Big Projects New
PDF
Что такое Highload? Секреты высокой нагрузки
PDF
Tech Talks @NSU: Что такое Highload? Секреты высокой нагрузки.
PDF
Екатерина Войденко "Горизонтальное масштабирование MySQL"
PPT
Быстрое масштабирование систем
PPTX
UFADevCom'13#1 Шерыхалин Олег
ODP
Scaling Web Sites By Sharding And Replication Hl2008 Rus
PPTX
Проектируем облачный веб-сервис "по-взрослому" (Сергей Рыжиков)
PPTX
Highload: проблемы и решения
PPTX
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
PPTX
Жизнь проекта на production
PDF
High load2007 scaling-web-applications-rus
PPT
Web20 from zero
PPT
Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)
PPT
распределенная архитектура Lamp приложений петр зайцев
PPT
Development on the Knee by Vladimir Khramtsov
PPT
Практическое создание крупного масштабируемого web 20 c нуля, Дмитрий Бородин
PPTX
1c bitrix-cluster-et
PPTX
(1 часть) 1С-Битрикс. Как настроить двухуровневую конфигурацию веб-приложения...
PPTX
Web application scalability
Rybak Big Projects New
Что такое Highload? Секреты высокой нагрузки
Tech Talks @NSU: Что такое Highload? Секреты высокой нагрузки.
Екатерина Войденко "Горизонтальное масштабирование MySQL"
Быстрое масштабирование систем
UFADevCom'13#1 Шерыхалин Олег
Scaling Web Sites By Sharding And Replication Hl2008 Rus
Проектируем облачный веб-сервис "по-взрослому" (Сергей Рыжиков)
Highload: проблемы и решения
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production
High load2007 scaling-web-applications-rus
Web20 from zero
Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)
распределенная архитектура Lamp приложений петр зайцев
Development on the Knee by Vladimir Khramtsov
Практическое создание крупного масштабируемого web 20 c нуля, Дмитрий Бородин
1c bitrix-cluster-et
(1 часть) 1С-Битрикс. Как настроить двухуровневую конфигурацию веб-приложения...
Web application scalability

More from Ontico (20)

PDF
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
PDF
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
PPTX
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
PDF
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
PDF
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
PDF
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PDF
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
PDF
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
PPTX
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
PPTX
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
PDF
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
PPTX
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
PPTX
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
PDF
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
PPT
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
PPTX
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
PPTX
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
PPTX
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
PPTX
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
PDF
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...

Горизонтальное масштабирование: что, зачем, когда и как /Александр Макаров (Yii, Stay.com)