87

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

  • Upload
    ontico

  • View
    7.046

  • Download
    1

Embed Size (px)

Citation preview

Горизонтальноемасштабирование

Что, зачем, когда и какАлександр Макаров

Yii core team, Stay.com

slides.rmcreative.ru/2015/horizontal-scaling-highload/

Что такоемасштабирование?

Возможность увеличить производительность проектаза минимальное время путём добавления ресурсов.

Способымасштабирования

—Вертикальное. Больше памяти, быстрее диск,лучше процессор в пределах одного сервера.—Горизонтальное. Больше серверов в кластере.

А оно надо? И так всёработает!

Как проверить?—— siege

ab

abab ‐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 

siegesiege ‐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, Василий Лукьянчиков

Это просто и можетдать вам время

Мало!!!

Но мы же уже всёсделали?!

Мониторинг—Выиграйте время—Настройте мониторинг—Он покажет, куда и как расти

Повторяйте постоянно.

Что может показатьмониторинг

—Упёрлись в диск—Мало памяти—Мало процессора—Сеть не выдерживает—Всё более-менее, но ошибки валятся— ...

На что обращатьвнимание прямо

сейчас—Доступность—Нехватка ресурсов—Ошибки

Мониторим ресурсы—————

MonitZabbixMuninNagiosServerDensity

Мониторим ошибки——

RollbarSentry

НотификацииВажно уведомить, но не стоит спамить.

Что анализировать—RPS—Response time—Количество процессов—Количество потоков—Размеры очередей— ...

Будет подробно вдокладе Александра

Крижановского завтра

Бизнес-анализ———На основе своих данных (позже)

Google Analyticsmixpanel

Когда?Нагрузка бывает как запланированная, так и нет:

—Сезонная—Реклама—Новости—Акции

Как бороться снагрузкой?

Бизнес решает. Важна цена вопроса.

Возможно, это будетдешевле:

—Профайлинг, очевидные оптимизации—Кеш в memcached—Правка конфигов сервера— ...

Если железо дешевлепрограммиста

Типичная схема

Балансировщик + несколько серверов приложения

Что даёт?—Возможность обработать больше запросов—Надёжность

Почему PHP так хорошдля масштабирования

Share nothing по умолчанию.То есть слабая связанность для слоя серверов

приложений.

Балансировканагрузки

—nginx———Аппаратные

SquidHAProxy

Проблемы—Как выбрать сервер?—Как хранить сессии?

Выбор сервера—По очереди из списка (round-robin)—География IP—Статистика (least-connected, доступность)—Как-то ещё

nginxh/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.phph/ps://php.net/manual/ru/function.session-set-save-

handler.php

Закрывайте сессииsession_write_close();

Файлы—Специализированное решение— «Шардирование» средствами PHP

Специализированныерешения

——

GlusterFSAmazon S3

PHPFlysystem

Раздача——

nginxVarnish

Замечания—Не хранить в базе!—Можно хранить локальный кеш. Например, дляроутинга запросов.

База данных—Репликация 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 RabbitMQbeanstalkdAmazon SQSGearman

Подробно будетсегодня в докладе

Константина Осипова

Архитектура

Меньше связанности!Чем меньше связанности, тем проще менять одно

решение на другое.

Связанность?—В коде (SOLID, GRASP)—В доменном слое—В архитектуре в целом

SOA—Система бьётся на отдельные логические части—Части взаимодействуют через интерфейсы

Доменный слой—Сверхважно отделить его от контекста, в которомон выполняется—Что происходит в самом слое не так важно, нолучше делать это правильно

Про доменный слой—Domain-Driven Design: Tackling Complexity in theHeart of So.ware, Eric Evans— Implementing Domain-Driven Design, ImplementingDomain-Driven Design— и BoundedContext DDD в общем

В архитектуре— share nothing—логика на стороне приложения—низкая связанность

Не стоитнедооцениватьбраузерную

оптимизацию

Абстракция идробление совсем не

бесплатны.

Не действуйтевслепую.

Думайте.

Проверяйте.

Материалы————Поискать по "highload" в рунете—Поискать по "sclability" в англонете

Distributed systems for fun and profith/p://ruhighload.com/h/p://www.insight-it.ru/

Как всё этопопробовать?

—DigitalOcean— Linode— ...

Вопросы?——

slides.rmcreative.ru/2015/horizontal-scaling-highload/rmcreative.ru