Upload
ontico
View
7.046
Download
1
Embed Size (px)
Citation preview
Горизонтальноемасштабирование
Что, зачем, когда и какАлександр Макаров
Yii core team, Stay.com
slides.rmcreative.ru/2015/horizontal-scaling-highload/
Способымасштабирования
—Вертикальное. Больше памяти, быстрее диск,лучше процессор в пределах одного сервера.—Горизонтальное. Больше серверов в кластере.
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
Бывает, что не надо...пока
—Обновить PHP (+40%)—OpCache + потюнить (не должно быть misses)—Добавить индексы в БД, пооптимизировать—Включить кеш (memcache, Redis)—Apache → nginx + php-fpm
Что может показатьмониторинг
—Упёрлись в диск—Мало памяти—Мало процессора—Сеть не выдерживает—Всё более-менее, но ошибки валятся— ...
Возможно, это будетдешевле:
—Профайлинг, очевидные оптимизации—Кеш в memcached—Правка конфигов сервера— ...
Почему PHP так хорошдля масштабирования
Share nothing по умолчанию.То есть слабая связанность для слоя серверов
приложений.
Выбор сервера—По очереди из списка (round-robin)—География IP—Статистика (least-connected, доступность)—Как-то ещё
Сессии—По умолчанию в файлах—NFS?—БД?—Нельзя писать в кеш, если данные в сессии важны—Можно поместить в общее отдельное хранилище—Redis однопоточный—По Redis на каждом инстансе, sticky-сессии (ip-hash)
Не пишите своегоаналога сессий,
используйте PHP!——
h/ps://php.net/manual/ru/class.sessionhandler.phph/ps://php.net/manual/ru/function.session-set-save-
handler.php
База данных—Репликация master-slave—Репликация master-master—Репликация руками—Шардирование—Партицирование (расскажет Денис Иванов далее)
Зачем?—Читаем больше, чем пишем? Будет быстрее.—Отказоустойчивость.—Бэкапы (реплику можно остановить).—Тяжёлые вычисления (о статистике далее).
read/write split— 2 пула серверов: master, slave—Соединение по требованию—Логика выбора соединения варьируется...
Засада... репликациялагает
Иногда данные попадают с 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.
где 3 - количество серверов. Альтернаива - map в key-value хранилище.
Как выбрать сервер?$connectionID = 'user_db' . ($user_id % 3 + 1);
ПопрощеПопробовать разделить на части, которыеиспользуются вместе, но не пересекаются.
Надо знать ID пользователя, но легко выбрать все егопосты, посортировать и т.д.
ПосложнееНе удаётся сгруппировать данные.
Надо знать ID данных, чтобы их достать. НикакихJOIN, ORDER и т.д. Таблица используется как key-value.
Обычные задачистановятся
необычными—Выбрать TOP 10.—Постраничная разбивка.—Выбрать с наименьшей стоимостью.—Выбрать посты юзера X.
Как быть состатистикой?
Считать статистику по основным данным - ошибка.—Скорее всего вам не нужен realtime.—Не считайте статистику на основной базе.—Специальный slave.—OLAP—Или что-то готовое...
Зачем?—Быстрее ответ сервера—Можно размазать нагрузку—Можно обработать на другом сервере—Можно обработать не PHP— ...
Доменный слой—Сверхважно отделить его от контекста, в которомон выполняется—Что происходит в самом слое не так важно, нолучше делать это правильно
Про доменный слой—Domain-Driven Design: Tackling Complexity in theHeart of So.ware, Eric Evans— Implementing Domain-Driven Design, ImplementingDomain-Driven Design— и BoundedContext DDD в общем
Материалы————Поискать по "highload" в рунете—Поискать по "sclability" в англонете
Distributed systems for fun and profith/p://ruhighload.com/h/p://www.insight-it.ru/