Сервер

Все о сервере, как он работает.

Заявки и прием заявок на сервере GMGame

На сервере GMGame для того, чтобы начать играть, нужно пройти процедуру подачи и рассмотрения заявки. Этот процесс состоит из трех этапов:

1. Подача заявки:

image.png

image.png

2. Прием заявки и голосование:

image.png

3. Обработка заявки:

image.png

Эта система подачи и рассмотрения заявок на сервере GMGame не появилась сразу. Она была разработана и усовершенствована в течение нескольких лет, учитывая пожелания и отзывы игроков. Она показала свою эффективность в том, что обеспечивает более качественный и дружелюбный состав игроков, а также предотвращает появление читеров, троллей и других нежелательных элементов.

Одна из особенностей этой системы заключается в том, что заявки принимают не администрация сервера, а сами игроки, имеющие роль “Гражданство GMGame”. Это дает возможность игрокам самостоятельно выбирать, кого они хотят видеть в своем сообществе, а также повышает их ответственность и вовлеченность в процесс.

После того, как заявка принята, игрок получает доступ к новым возможностям на сайте и на сервере. На сайте он может создавать метки и территории игроков, а также участвовать в розыгрыше, за голосование на мониторингах. На сервере он может строить свои постройки, взаимодействовать с другими игроками, принимать участие в событиях и многое другое.

О бэкапах на сервере GMGame

Думаю нет необходимости говорить о важности резервного копирования или о подходах к этому процессу, поэтому мы поделимся нашим опытом.

На нашем сервере используется резервное копирование с дедупликацией. Резервное копирование реализовано на borg backup

image.png

Плюсы такого подхода:
К минусам можно отнести:

У нас резервное копирование выполняется, каждые 10 минут, а копии хранятся по следующим правилам:

Такой подход мы стали использовать c июля 2021 года и сейчас самый ранний бэкап, на который мы можем откатиться — 2021-06-30, если это потребуется.

Разумеется бэкапы за 3 года и даже за 3 месяца скорее для истории, чем для практического применения.

По цифрам сейчас у нас суммарный размер бэкапов 133.01 GB, если бы все эти бэкапы просто хранились целиком в сжатом виде, то они занимали бы 4.06 TB, а оригинальный размер, без сжатия, составил бы 5.67 TB

image.png

В бэкапах хранятся следующие данные:

Для повышения надежности мы используем несколько репозиториев борга для хранения бэкапов и делаем периодически отдельные копии данных.

save-off save-all save-on

К сожалению, нет достоверной информации и достаточных исследований о необходимости останавливать сохранения мира на время создания резервной копии.

Дело в том, что если попытаться создавать копию во время сохранения мира на диск, то в бэкап могут попасть частично сохраненные блоки. Но в то же время ручное прерывания сохранения вызывает всплеск задержки на сервере, что может негативно влиять на игровой процесс.

Но так как майнкрафт сохраняет на диск данные периодически, по умолчанию каждые 5 минут, то мы просто делаем резервную копию в промежутках между сохранениями, по сути читая статичные даные.

Мониторинг

Для мониторинга используем просто Healthchecks

image.png

Информация о размерах и файлах бекапов актуальна на момент написания статьи. В настоящее время список файлов для бекапа может измениться, при этом технология резервного копирования остается без изменений

Как устроен сервер

Сервер построен с использованием прокси Velocity и разделен на несколько миров. На данный момент их четыре:

Это обусловлено тем, что ресурсы ограничены, а сам майнкрафт не может полноценно использовать все возможности процессора и большую часть вычислений производит в одном потоке. Такой подход с мирами обеспечивает разделение вычислений между ядрами процессора и если нагрузка на одни мир высокая, то это не оказывает влияния на остальные.

image.png

Другая проблема в ограниченном месте на жестком диске. Например мир майнкрафта 10000х10000 занимает около 20Gb места, а мир с размерами 20000х20000 около 40Gb и так далее в квадратичной последовательности. Так же с увеличением мира требуется больше места под хранение бэкапов.

Ресурсный мир призван решить эту проблему, ограничив основной мир, игроки могут бесконечно выкапывать ресурсный, а так как на нем нет никаких построек игроков, то этот мир можно удалять и создавать новый, по мере исчерпания ресурсов. Так же такой подход позволяет не портить внешний вид основного мира и экономить место на резервном копировании.

image.png

Фермерский мир призван разгрузить остальные миры, так как различные механизмы и большое скопление мобов на фермах может сильно нагружать сервер. В этом мире не так критичен ТПС, так как игроки в основном стоят АФК и фармят ресурсы, поэтому они не испытывают трудностей с постоянным отставанием сервера. В то же время в других мирах игроки могут комфортно играть.

Изначально, все эти миры работали просто в screen и управлялись набором различных скриптов, которые позволяли перезапускать, обновлять и останавливать серверы и плагины.

Проект рос и сейчас серверы управляются через панель управления pterodactyl.io, это позволило:

image.png

image.png

О интерактивной карте

Для реализации интерактивной карты используется открытый проект https://github.com/overviewer/Minecraft-Overviewer/

У нас используется стандартный функционал, в виде меток, ограничения высоты, поворотов и прочего и свои доработки.

Метки:

Может управлять любой игрок сервера, метки храняться в базе и по крон заданию, специльный скрипт, если видет изменения, собирает эти метки и формирует из них конфиг, подходящией овервью.

Такой конфиг представляет собой python файл содержащий массив словарей, в котором есть id, координаты xyz, имя и описание, эти конфиги формируются для каждой карты каждого сервера.

image.png

image.png

Территории:

Территориями также может управлять любой игрок и они также храняться в базе сайта. Для их реализации испольузется js скрипт, который при загрузке карты запрашивает по специальному API сайта массив угловых точек с именами и прочим и с помощью API leaflet строит на карте необходимые территории

image.png

image.png

Территории так же используются для того, чтобы игрок мог пометить понравившуюся территорию, как занятую. Если игрок бросает играть на сервере, то территория удаляется через некоторое время.

Внешний вид карты:

Это customwebassets, стандартная возхможность овервью. Дизайн и верстка от Престижа.

Рендер карты запускается в течении 15 минут, после окончания предыдущего рендера. Это сделано баш скриптом по крону. Он проверяет не запущено ли процесса рендера или синхронизации в данный момент, после чего, если их нет, запускает синхронизацию файлов сервера и запускает сам рендер.

Синхронизация сделана для того, что бы на карте не появлялось артефактов, которые могу быть, если область карты, которая рендерится в текущей момент, изменяется игроками. Это проявляется на карте в виде переставленных или пустых чанков. Синхронизация в данном случае минимизирует появление таких артефактов.

Почему важно учитывать нагрузку ферм на сервере?

Эта статья предназначена для тех, кто не слишком углубляется в технические детали нагрузки ферм. Особенно она будет полезна тем, кто любит строить, не задумываясь о том, почему что-то работает именно так или почему нужно делать иначе.

Важно помнить что сервер — это не одиночная игра. В одиночной игре вы можете создавать лаги только для себя, и это никому не помешает. На сервере же ваша ферма или большое количество мобов могут ухудшить игровой опыт других игроков. Это не только раздражает, но и снижает производительность всего сервера. Поэтому существуют ограничения на использование ферм и количество мобов.

Чтобы комфортно играть всем на сервере при 20 TPS, нужно поддерживать MSPT ниже 50. Посмотреть MSPT в игре, можно в табе нажав на клавишу TAB.

tablist.png

Почему важно соблюдать ограничения на сервере?

Соблюдение ограничений на сервере — ключ к стабильной и комфортной игре для всех участников. Когда фермы или скопления мобов создают чрезмерную нагрузку, это не только снижает производительность сервера, но и ухудшает игровой опыт других игроков. Ограничения основаны на многолетнем опыте администрирования и наблюдениях, позволяя избежать проблем с производительностью, такими как лаги или краши, и поддерживать стабильную работу сервера.

Что такое TPS и MSPT?

TPS и MSPT — это ключевые показатели производительности Minecraft-сервера.

TPS (Ticks Per Second) измеряет, сколько игровых тиков сервер обрабатывает за одну секунду. В идеальных условиях TPS всегда должно быть 20 — это значит, что сервер работает без задержек и обрабатывает игровые события с максимальной скоростью.

MSPT (Milliseconds Per Tick) показывает, сколько времени уходит на обработку одного игрового тика в миллисекундах. Каждый тик должен обрабатываться за 50 миллисекунд или меньше, чтобы поддерживать TPS на уровне 20. Если MSPT превышает 50, сервер начинает замедляться, что приводит к лагам и снижению TPS.

Эти показатели помогают понять, насколько эффективно работает сервер и как на его производительность влияют различные элементы, такие как фермы, механизмы и скопления мобов.

Что такое FPS?

FPS (Frames Per Second) — количество кадров в секунду, которое зависит от конфигурации ПК и оборудования игрока. Этот параметр может значительно варьироваться в зависимости от мощности графической карты, процессора и других факторов на стороне клиента.

Стоит также отметить, что FPS на клиенте напрямую зависит от установленных модов и текстур паков. Особое влияние оказывают моды, добавляющие анимации, а также текстурпаки с высоким разрешением. Такие дополнения значительно увеличивают нагрузку на графический процессор и могут заметно снижать производительность, особенно на менее мощных системах.

Примеры и тесты из практики

В этой статье мы скорее всего не будем углубляться в технические детали или сложные объяснения. Вместо этого приведем конкретные примеры и результаты тестов, проведенных в игровом мире. Это поможет лучше понять, как различные механики и постройки влияют на сервер, и почему важно учитывать их воздействие.

Эта информация основана на многолетних наблюдениях и опыте, накопленном за более чем четыре года игры и администрирования серверов. Хотя она может не быть абсолютно точной с технической точки зрения, эти выводы сделаны на основе реальных ситуаций, с которыми сталкиваются игроки и администраторы. Они помогают лучше понять, как различные аспекты игрового процесса влияют на производительность сервера и комфорт участников.

Описание тестового стенда

Для проверки производительности и влияния различных механик на сервер использовался тестовый стенд. Он включает в себя следующую конфигурацию:

Настройки мира:

Используемые моды:

Настройка Sodium:

Sodium_settings_all.png

Хотя тестовый стенд отличается от реальной конфигурации сервера, его основная цель — предоставить ориентировочные данные. Мы не стремимся к идеальной точности, а фокусируемся на получении приблизительных цифр, которые помогают оценить общее влияние игровых механик на TPS и MSPT. Это позволяет выявить ключевые проблемы и принять меры для оптимизации.

Несмотря на то, что сервер работает на ядре Paper, а тесты проводятся на Fabric, полученные данные будут полезны. Fabric приближен к ванильной механике, а Paper включает множество оптимизаций. Учитывая эти нюансы, тестовый стенд все же позволит получить достаточно близкие к реальности результаты.

При проведении тестов будут оцениваться FPS, TPS и MSPT

Создание мира

Мир был создан абсолютно ванильным образом с использованием стандартных настроек на первой и второй вкладке. Третья вкладка осталась без изменений.

World_create_all.png

Первый взгляд

На первом взгляде, сразу после входа в мир, не будет никаких ферм, нагрузок или мобов. Это чистая, пустая игровая среда, которая позволяет нам увидеть начальное состояние мира без влияния каких-либо механик или построек, создающих дополнительную нагрузку на сервер.

world.webp

Основные команды
Дополнительные команды:

Для создания дополнительных виртуальных игроков

Основной аккаунт для тестов и скриншотов — prestig9110, который будет находиться в точке /tp 0 86 0.

Режим creative используется только для того, чтобы игроки не были убиты мобами во время тестирования.

Для тестов, которые проводятся в воздухе, будет использоваться высота 270 блоков, в то время как для тестов на земле — высота 70 блоков.

Тест #1: Стандартная прогрузка с несколькими игроками

test_1.1.png

test_1.2.png

test_1.3.png

test_1.4.png

Нагрузка на сервер зависит от расстояния между игроками и их положения. Когда игроки находятся далеко друг от друга, каждый из них загружает в среднем 70 враждебных мобов и +-30/35 мирных мобов, что суммарно для 5 игроков даёт 350 враждебных и +-175 мирных мобов. Если все игроки находятся в одной точке, количество загружаемых мобов делится между ними, и сервер грузит только одно количество мобов на всех, например, +-70 враждебных мобов на 5 игроков.

Аналогичная ситуация возникает и с чанками. При радиусе симуляции в 8 чанков, для одного игрока серверу нужно обработать 256 чанков. Если игроки распределены по разным точкам, то обрабатывается 256 * 5 = 1280 чанков. Однако если все игроки находятся в одной точке, они используют одни и те же чанки, и серверу нужно обработать только 256-280 чанков, так как они не могут точно стоять в одной точке. 

Если игроки находятся в воздухе, это также влияет на нагрузку. В воздухе меньше блоков, с которых могут появляться мобы, и так как вокруг в 80% пустота, нагрузка на сервер снижается. В отличие от земли, где мобы могут спауниться в большем количестве, в воздухе их количество ограничено. Таким образом, небольшим плюсом является строительство в воздухе или выкапывание большой ямы (например, 256x256), что снижает нагрузку на сервер.

В данном примере нет смысла акцентировать внимание на FPS, так как основная нагрузка идёт на сервер.

Тест #2: сундуки



После ddos атаки

После случившейся DDoS-атаки были сделаны несколько выводов. К сожалению, все еще есть люди, которые не могут понять, что проект бесплатный и не может на регулярной основе оплачивать какие-то дорогостоящие услуги, например, аренду места в дата-центре или платить за какую-то дорогостоящую защиту. Также были проведены работы по сокрытию реального IP сервера, для того чтобы впредь такой проблемы не возникало. И я хочу описать в этой статье, как работает подключение к серверу и как мы можем решить проблему в случае новой DDoS-атаки.

1. Для решения проблемы на арендованном VPS сервере в московском дата-центре развернут прокси (haproxy), а между этим VPS и игровым сервером поднят VPN туннель (wireGuard). Теперь, в сильно упрощенном виде, трафик идет так — клиент-> haproxy -> игровой сервер и обратно по тому же маршруту.

image.png

Плюсы такого решения:

Минусы:

2. Все веб-сервисы (сайт, карта, панели управления) переключены на прокси Cloudflare. Что также позволяет скрыть реальный IP и частичное кеширование, что полезно для карты. А благодаря большой сети CDN, это только положительно влияет на скорость загрузки. К сожалению, бесплатно только для http-трафика.

Также, в случае если по каким-то причинам не будет работать схема из первого пункта, то уже настроена и обкатана DDoS-защита от TCPShield. Для перехода на нее достаточно будет выключить VPN-туннель и включить защиту в ЛК TCPShield. Что позволит продолжить играть на сервере, пусть и с меньшим комфортом, так как пинг будет значительно больше.

По итогу получаем, что сервер стал более защищенным, с минимальным влиянием на комфортность игры и бюджет.

image.png

Конфиги сервера

Эта статья предоставляет обзор основных настроек серверов и вспомогательных функций. Здесь вы найдете ключевые параметры, необходимые для оптимальной работы серверов, а также дополнительные функции, способствующие эффективности и безопасности серверной инфраструктуры.

Конфигурация физического сервера

GMGame world - строительный мир

Границы миров

server.properties

Подробнее о каждом параметре: https://docs.papermc.io/paper/reference/server-properties

difficulty=hard
view-distance=16
simulation-distance=8
level-type=default

bukkit.yml

Подробнее о каждом параметре: https://docs.papermc.io/paper/reference/bukkit-configuration

spawn-limits: # Количество мобов на игрока
  monsters: 70 # Монстры 
  animals: 10 # Животные
  water-animals: 5 # Водные животные (Дельфины, спруты, ...) 
  water-ambient: 20 # Водные животные (Рыбы)
  water-underground-creature: 5 # Водные подземные животные (Светящийся спрут)
  axolotls: 5 # Аксолотль 
  ambient: 15 # Окружение (Летучие мыши)
ticks-per: # Количество тиков на спавн моба [20 тиков = 1 сек]
  animal-spawns: 400 # 20 сек
  monster-spawns: 10 # 0.5 сек
  water-spawns: 100 # 5 сек
  water-ambient-spawns: 100 # 5 сек
  water-underground-creature-spawns: 100 # 5 сек
  axolotl-spawns: 100 # 5 сек
  ambient-spawns: 100 # 5 сек

spigot.yml

Подробнее о каждом параметре: https://docs.papermc.io/paper/reference/spigot-configuration

Описание данного файла появится позже

paper-global.yml

Подробнее о каждом параметре: https://docs.papermc.io/paper/reference/global-configuration

Описание данного файла появится позже

paper-world-defaults.yml

Подробнее о каждом параметре: https://docs.papermc.io/paper/reference/world-configuration

Описание данного файла появится позже

Farm world - фермерский мир

Границы миров

server.properties

Подробнее о каждом параметре: https://docs.papermc.io/paper/reference/server-properties

difficulty=hard
view-distance=14
simulation-distance=8
level-type=default

bukkit.yml

Подробнее о каждом параметре: https://docs.papermc.io/paper/reference/bukkit-configuration

spawn-limits: # Количество мобов на игрока
  monsters: 70 # Монстры 
  animals: 10 # Животные
  water-animals: 5 # Водные животные (Дельфины, спруты, ...) 
  water-ambient: 20 # Водные животные (Рыбы)
  water-underground-creature: 5 # Водные подземные животные (Светящийся спрут)
  axolotls: 5 # Аксолотль 
  ambient: 15 # Окружение (Летучие мыши)
ticks-per: # Количество тиков на спавн моба [20 тиков = 1 сек]
  animal-spawns: 400 # 20 сек
  monster-spawns: 1 # 0.5 сек
  water-spawns: 10 # 0.5 сек
  water-ambient-spawns: 10 # 0.5 сек
  water-underground-creature-spawns: 10 # 0.5 сек
  axolotl-spawns: 10 # 0.5 сек
  ambient-spawns: 10 # 0.5 сек

spigot.yml

Подробнее о каждом параметре: https://docs.papermc.io/paper/reference/spigot-configuration

Описание данного файла появится позже

paper-global.yml

Подробнее о каждом параметре: https://docs.papermc.io/paper/reference/global-configuration

Описание данного файла появится позже

paper-world-defaults.yml

Подробнее о каждом параметре: https://docs.papermc.io/paper/reference/world-configuration

Описание данного файла появится позже

Resources world - ресурсный мир

Границы миров

server.properties

Подробнее о каждом параметре: https://docs.papermc.io/paper/reference/server-properties

difficulty=hard
view-distance=24
simulation-distance=8
level-type=amplified

bukkit.yml

Подробнее о каждом параметре: https://docs.papermc.io/paper/reference/bukkit-configuration

spawn-limits: # Количество мобов на игрока
  monsters: 70 # Монстры 
  animals: 10 # Животные
  water-animals: 5 # Водные животные (Дельфины, спруты, ...) 
  water-ambient: 20 # Водные животные (Рыбы)
  water-underground-creature: 5 # Водные подземные животные (Светящийся спрут)
  axolotls: 5 # Аксолотль 
  ambient: 15 # Окружение (Летучие мыши)
ticks-per: # Количество тиков на спавн моба [20 тиков = 1 сек]
  animal-spawns: 100 # 5 сек
  monster-spawns: 1 # 0.05 сек
  water-spawns: 20 # 1 сек
  water-ambient-spawns: 20 # 1 сек
  water-underground-creature-spawns: 20 # 1 сек
  axolotl-spawns: 20 # 1 сек
  ambient-spawns: 20 # 1 сек

spigot.yml

Подробнее о каждом параметре: https://docs.papermc.io/paper/reference/spigot-configuration

Описание данного файла появится позже

paper-global.yml

Подробнее о каждом параметре: https://docs.papermc.io/paper/reference/global-configuration

Описание данного файла появится позже

paper-world-defaults.yml

Подробнее о каждом параметре: https://docs.papermc.io/paper/reference/world-configuration

Описание данного файла появится позже

Система миров

Система миров на сервере — это умное решение, которое обеспечивает стабильную производительность и равномерную нагрузку. Действия в одном мире не вмешиваются в работу других, что создает комфортные условия для игры и оптимизирует процессы на сервере.

Лобби

На сервере приключения начинаются в его главном мире - лобби сервера. Здесь игроки могут войти в свой аккаунт и после перейти в основной мир выживания.

lobby.webp

GMGame

Основной мир — это место выживания, где игроки воплощают свои крупные проекты, создают города и воплощают свои творческие идеи. В основном мире запрещено строить как общественные, так и частные фермы. Исключением является ряд ферм, построенных в основном мире до открытия фермерского.

Этот мир не подвергается вайпам.

gmgame_1.webp

Фермерский мир

Фермерский мир предназначен для создания как больших общественных, так и не сильно больших личных ферм. Однако строительство гигантских ферм, способных негативно влиять на производительность сервера и мешать другим игрокам, запрещено. Также запрещено строить портальные фермы.

Этот мир не подвергается вайпам.

farm_1.webp

Ресурсный мир

Ресурсный мир предназначен исключительно для добычи ресурсов, необходимых для строительства и развития в других мирах.

Важно отметить, что этот мир не предназначен для постоянного проживания, строительства личных баз или ферм.

Периодически, обычно при обновлении версии сервера, в этом мире проводится полный вайп. По мере необходимости мир может быть расширен.

res_1.webp

Перемещение между мирами

Для перемещения между этими тремя мирами используются порталы, которые установлены в каждом мире на нулевых или близких к нулевым координатах. Просто пройдите через соответствующий портал, чтобы попасть в нужный мир.

servers.png

Порталы стилизованы уникальной рамкой и наполняются разнообразными частицами, которые видны на значительном расстоянии, что делает их легко узнаваемыми и привлекательными для игроков.

Важно помнить, что при использовании порталов игрок перемещается из одного мира в другой, на его последнее местоположение в этом мире.

Например, если игрок проходит через портал в основном мире, чтобы перейти в мир ферм, он переместится в мир ферм и окажется в точке портала вблизи нулевых координат. Однако, если он захочет вернуться обратно, то, пройдя через портал, ведущий в основной мир, он окажется в основном мире рядом с порталом, через который он входил ранее. 

Быстрое перемещение

На нашем сервере вы можете с легкостью перемещаться благодаря специальным возможностям, доступным для покупки. Узнайте больше о том, как приобрести эти удобные функции, перейдя по ссылке.

Блоки телепортации предлагают более удобный и быстрый способ перемещения. Для этого стоит просто нажать по этому предмету правой кнопкой мыши, держа его в правой руке. 

Например, благодаря блокам телепортации, вы можете находиться на своей базе в основном мире и, используя телепорт, перейти в ресурсный мир. Сначала вы окажетесь на спавне, но после путешествия по ресурсному миру, если захотите вернуться на базу, просто воспользуйтесь блоком перемещения, а не бежите на спавн. Он перенесет вас обратно в основной мир на ваше последнее местоположение, то есть к вашей базе. Таким образом, вам не придется долго бегать к порталам. Если вы захотите снова попасть в ресурсный мир, вы вернетесь в точку, где использовали предыдущий телепорт, поскольку блоки телепортации переносят игрока из мира в мир на его последнее местоположение.

Эти блоки стоит попробовать всего лишь один раз, и вы быстро освоите их принцип работы, открыв для себя новые, более удобные способы перемещения, которые изменят вашу жизнь в игре.