Клиент - всегда за одну сессию посещения работает ТОЛЬКО с одним сервером обслуживания. Это может быть как отдельная структура, так и внутри структуры CDN. Я предпочитаю использовать второй вариант.
Сервера - постоянно синхронизируют данные асинхронно между собой (канал обмена данными - поднят всегда!).
После закрытия/смены сессии клиентом - происходит централизованное оповещение сразу всем серверам и они ставят себе в очередь синхронизацию данных именно по этому пользователю.
При этом, стандартная синхронизация серверов БД работает параллельно в штатном режиме.
все SQL запросы сильно лагают
Только пакетный конвейер запросов с контролем загрузки сервера исполнения запрос-пакета и необходимого приоритета исполнения всех нужных запрос-пакетов! Система должна знать (сама принимать решение!): когда ей выполнить запрос, а когда допускается повременить (приоритезация).
Также, можно использовать
HAProxy для отказоустойчивости/балансировки, в качестве "головы".
Или, как альтернативу ему,
Envoy.
PS:
1. Кэширование статики и данных из БД - Вы там не забыли поделить на: EVERYONE, GUEST, USER?
2. Соединение к БД - не переоткрываете по несколько раз, когда делаете обращения к БД за время исполнения скрипта?
3. Объединяете ли запросы с стэки для получения всех нужных данных ОДНИМ запросом из БД?