Распределение игровых серверов по выделенным серверам
Я управляю небольшим бизнесом по размещению игровых серверов для нишевой игры и арендую выделенные серверы для снижения затрат, каждый из которых запускает множество экземпляров игровых серверов. Игровые серверы могут быть созданы и удалены в любое время, и мне нужно решить, на какой машине будет установлен игровой сервер при его создании. После создания сервера он может быть перенесен на другой компьютер, если администратор пожелает.
Я работаю над улучшением бэкэнда, и меня больше всего беспокоит выделение игровых серверов для машин. В настоящее время я использую наивный алгоритм:
Я назначаю вес каждой машине, примерно пропорциональный количеству ЦП / ОЗУ.
Чтобы приблизительно приблизить ресурсы, используемые каждым игровым сервером, я назначаю каждому игровому серверу вес в зависимости от максимального количества игроков, которые могут играть на этом сервере.
Всякий раз, когда кто-либо создает игровой сервер или просит перенести свой существующий игровой сервер на другую машину, я рассчитываю следующее для каждой машины:
(сумма весов игровых серверов на машине) / (вес машины)
и я выделяю игровой сервер на машину с самым низким результатом.
Моя главная задача здесь заключается в расчете весов для каждого игрового сервера. Существует много различных факторов, определяющих использование ресурсов, таких как количество игроков, которые в данный момент находятся в сети, установленные моды, настройки сервера и т. Д. В результате я не думаю, что можно назначить точный вес на основе свойств сервера, даже если Я сделал более сложную формулу по сравнению с тем, что я сейчас делаю с максимальным количеством игроков.
Я думаю, что было бы более эффективно распределять серверы на основе эмпирических данных об использовании ресурсов, либо с помощью какой-либо программы балансировки нагрузки, либо с помощью специально разработанного решения. Но я не уверен, как это сделать, и я также понимаю, что могут быть совершенно разные подходы, которые я не рассматривал, поэтому любые советы будут с благодарностью!
1 ответ
Вы можете стандартизировать узел, получающий фиксированное количество игр разных размеров, и клонировать этот узел много раз. Однако это работает, только если ваши шаблоны использования относительно постоянны.
Кластерное программное обеспечение с размещением на основе использования существует. Для неизолированных прикладных программ, для контейнерных экземпляров или для полных виртуальных машин. Вы не упомянули контейнеры или что-то еще, поэтому я предполагаю, что они не используются. Вы также не упомянули платформу операционной системы, поэтому предположим, что Linux.
Возьмем, к примеру, кластеры кардиостимулятора, как в RHEL HA. Ресурсы в таком кластере могут иметь определенное использование ресурсов. Таким образом, ваши большие и маленькие серверы имеют разные требования к процессору и памяти и размещены соответствующим образом. В качестве бонуса вы можете восстановиться после сбоя узла и перенести ресурсы на другой узел. На минусе: кластеры высокой доступности сложно построить, и они нуждаются в тестировании, чтобы убедиться, что они работают правильно.
Если у вас был контейнер для развертывания, Kubernetes мог бы управлять им в кластере. Опять же, немного сложностей, чтобы получить эти функции.
Вы могли бы пересмотреть подход "голый металл" и назначить каждому серверу свою собственную виртуальную машину. Гипервизор может быть запущен вами или каким-либо облачным провайдером. В любом случае найдите значения vCPU и vRAM, оптимальные для разных размеров. Размещение на узлах выполняется для вас в облаке с помощью такого продукта, как VMware DRS, или вручную.