Распределение нагрузки или как избежать неприятных падений
Немного истории
В 2013 году, занимаясь разработкой эмулятора сервера одной популярной MMO-FPS, перед нашей командой встал вопрос распределения нагрузки на сервер.
Спустя несколько недель дискуссий мы решили разделить три основных сервера(Auth/Game/Battle) на множество мелких серверов, падение которых было бы не смертельным для игрового клиента.
Ближе к делу
Таким образом, у нас появились следующие сервера:
- LoginServer(TCP)
Сервер, к которому в первую очередь обращается клиент. Тут наш юзер проходит авторизацию.
- MasterServer(TCP)
На мастер-сервер клиент попадает только в случае успешной авторизации на LoginServer. И... сразу же перенаправляется на ближайший к себе(клиенту) GameServer.
- GameServer(TCP)
Самый нагруженный среди всех серверов. На нем игрок попадал к списку каналов сервера, после выбора канала - в лобби.
- ShopServer(TCP)
"Исчезновение предметов из игрового магазина в случае падения ShopServer'а особо никого не может напугать, да и поднять если что - успеем." - примерно с таким лозунгом мы приняли решение о создании отдельного сервера для внутриигрового магазина.
- ClanServer(TCP)
Подключение происходило при входе в меню кланов - клиенту отправлялась информация о его клане(в случае, если игрок находился в клане) или список кланов(в случае, если игрок не находился в клане). Так-же было доступно создание клана/Управление кланом/Удаление клана.
- ChatServer(TCP)
Обмен сообщениями как в лобби/комнате, так и прямо во время боя.
- BattleServer(UDP)
На боевой сервер отправлялась информация о созданной на канале GameServer'а комнате, информация о лидере. Так-же происходил обмен пакетами с информацией о местонахождении игроков в бою.
Одна важная деталь
Все сервера, помимо LoginServer'а и MasterServer'а дублировались для каждого "мира", а так-же работали синхронно между "мирами" - игрок мог перейти с одного "мира" на другой без потери какой-либо информации.
Извлекаем важное
Суть решения достаточно проста - множество небольших серверов, образующих в своей цепи отличное решение для уменьшения нагрузки на серверные машины.
Плюсы
- Падение одного сервера из цепи не смертельно
- Распределение нагрузки
- Небольшие обновления/хотфиксы без отключения всего проекта на тех.работы
- Риск падения серверов от высокой нагрузки уменьшается в разы