Добрый день.
Работаю над одним проектом на PHP. Это монолит. Все крутится на одном сервере: Intel Core i7, 32 Гб RAM, 500 Гб SSD. В принципе все хорошо и нагрузку пока держит. Но хожу немного забежать вперед и понять, как правильно масштабироваться.
В проекте используются такие технологии: PHP Yii2, есть memcached, сессии хранятся в redis, также используются очереди, которые работают также через redis.
Первое что приходит в голову - это вынести БД на отдельный сервер. Потом ставить балансировщик и распределять на несколько серверов входящие запросы. Что делать с memcached и redis, их тоже на отдельный сервер выносить?
Вот тут хочется понять, как правильно подбирать сервера для этих задач? Как посчитать, какой нужен процессор, память и т.д. Хочется сделать надежную систему и в то же время не разбрасываться ресурсами, т.к. бюджет очень ограничен.
Заранее спасибо за ответы!
Начать надо с замеров. Собрать профиль выполнения, посмотреть на самые горячие места, оценить возможно ли эти места как-то распараллелить, если да, то как, и какие издержки могут возникнуть. От ответов на эти вопросы зависит всё остальное.
Если большая нагрузка на БД, то можно сделать репликацию.
Ваше приложение должно поддерживать несколько БД с разделением на операции.
Вот с него и можете начать.
Т.е. оставить пока как есть, и на отдельный сервер вынести реплику? А не лучше в начале вынести полностью БД на отдельный сервер, а потому уже настраивать репликацию?
Подскажите, вот я решил вынести БД на отдельный сервер. Как рассчитать параметры сервера. Нужен SSD, объем понятно, а что с ОЗУ и процессором. Как правильно рассчитать эти параметры? Как выбрать оптимальный сервер, чтобы не переплачивать?
Все вышеописанное отлично поможет вам с горизонтальным масштабированием... но почти наверняка, к сожалению, линейно, т.е. увеличилась нагрузка в 2 раза - удваивайте количество серверов.
---------- не воспринимайте как наезд ---------------
дальше нижеописанное можно сказать одним словом - переписывайте ;)
В первую очередь я бы избавился от корневых проблем, которые почти наверняка у вас сидят из-за основы Yii - http rest технология (кстати не факт) и построение представления на сервере.
Если вы начнете переносить все связанное с отображением и построением внешнего вида на клиент, вы почти наверняка поднимите скорость на порядок, отложив необходимость масштабирования на большой срок, но тогда непонятно, зачем вам Yii :) т.е. вместо разработки приложения на сервере на php вам лучше писать все связанное с интерфейсом пользователя на javascript, а сервер пусть обрабатывает логику и держит базу данных. Т.е. выносите view наружу (фактически ваши view превратятся в просто поток данных в виде json а ui переносите на client js).
Данный вариант пока не рассматриваю, так как переписывать все на react или vue, или что-то подобное сейчас не предоставляется возможным. Но спасибо за совет.