Масштабирование — способность наращивать систему для обработки большего количества трафика, не теряя при этом пользовательские качества: скорость и отзывчивость.
Масштабирование различают двух типов: вертикальное (больше памяти, диска, лучше процессор) и горизонтальное (больше серверов в кластере).
- Зачем оно нужно, если и так всё работает?
- Когда? Мониторинг, необдуманные решения, оптимизация и жизнь с одним сервером.
- Типичная схема.
- Балансировка нагрузки.
- Какие, вообще, проблемы на стороне приложения?
- Почему PHP так хорош для масштабирования.
- Сессии.
- База данных.
- Файлы.
- Как быть со статистикой?
10. Бывает, что не надо...
пока
— Обновить PHP (+40%)
— OpCache + потюнить (не должно быть misses)
— Добавить индексы в БД, пооптимизировать
— Включить кеш (memcache, Redis)
— Apache → nginx + php-fpm
11. Далее будут доклады
на тему оптимизации
— PostgreSQL, Илья Космодемьянский
— MySQL, Василий Лукьянчиков
36. Сессии
— По умолчанию в файлах
— NFS?
— БД?
— Нельзя писать в кеш, если данные в сессии важны
— Можно поместить в общее отдельное хранилище
— Redis однопоточный
— По Redis на каждом инстансе, sticky-сессии (ip-hash)
38. Не пишите своего
аналога сессий,
используйте PHP!
—
—
h ps://php.net/manual/ru/class.sessionhandler.php
h ps://php.net/manual/ru/function.session-set-save-
handler.php
47. Зачем?
— Читаем больше, чем пишем? Будет быстрее.
— Отказоустойчивость.
— Бэкапы (реплику можно остановить).
— Тяжёлые вычисления (о статистике далее).
48. read/write split
— 2 пула серверов: master, slave
— Соединение по требованию
— Логика выбора соединения варьируется...
49. Логика
— Писать всегда в master
— Только чтение с slave (array_rand())
— Чтение для записи - ...
50. Засада... репликация
лагает
Иногда данные попадают с 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.
61. где 3 - количество серверов. Альтернаива - map в key-
value хранилище.
Как выбрать сервер?
$connectionID = 'user_db' . ($user_id % 3 + 1);
62. Попроще
Попробовать разделить на части, которые
используются вместе, но не пересекаются.
Надо знать ID пользователя, но легко выбрать все его
посты, посортировать и т.д.
63. Посложнее
Не удаётся сгруппировать данные.
Надо знать ID данных, чтобы их достать. Никаких
JOIN, ORDER и т.д. Таблица используется как key-value.
68. Как быть со
статистикой?
Считать статистику по основным данным - ошибка.
— Скорее всего вам не нужен realtime.
— Не считайте статистику на основной базе.
— Специальный slave.
— OLAP
— Или что-то готовое...
76. SOA
— Система бьётся на отдельные логические части
— Части взаимодействуют через интерфейсы
77. Доменный слой
— Сверхважно отделить его от контекста, в котором
он выполняется
— Что происходит в самом слое не так важно, но
лучше делать это правильно
78. Про доменный слой
— Domain-Driven Design: Tackling Complexity in the
Heart of So ware, Eric Evans
— Implementing Domain-Driven Design, Implementing
Domain-Driven Design
— иBoundedContext DDD в общем
85. Материалы
—
—
—
— Поискать по "highload" в рунете
— Поискать по "sclability" в англонете
Distributed systems for fun and profit
h p://ruhighload.com/
h p://www.insight-it.ru/