Chmura dla graczy. Uruchamiamy serwer Minecrafta i HLDS
Rasowi gracze dobrze wiedzą, że nie ma grania w sieci bez dobrego zaplecza obliczeniowego. Gry akcji, strzelanki, a przede wszystkim gry typu massive multiplayer online RPG wymagają centralnego serwera, który odbiera od wszystkich graczy informacje o postępach gry, synchronizuje stan świata i rozsyła go do każdego z osobna.
Wiele gier zawiera oczywiście wbudowane oprogramowanie serwerowe – uruchamiasz taką aplikację na swoim komputerze i dajesz innym graczom możliwość łączenia się przez Internet. To wystarczy, gdy gra kilka osób, w mniej wymagające tytuły, najlepiej w sieci LAN, ale gdy graczy pojawia się więcej, zaczynają się problemy. Typowe domowe łącza internetowe „nie wyrabiają”, pasmo transferu w górę jest zwykle ich wąskim gardłem. Opóźnienia sprawiają, że gracz korzystający z hosta ma nieuczciwą przewagę, a gdy mu się to wypomni, to może się obrazić i odejść, a wówczas z grania nici dla wszystkich.
Dlatego poważni gracze wybierają serwery autonomiczne – specjalne oprogramowanie uruchamiane w centrach danych, działające bez względu na to, kto akurat do nich się podłączył, zapewniające niskie opóźnienia i wysoką wydajność przetwarzania świata gry. Ich wada to oczywiście koszty. Hosting takiego oprogramowania nie jest za darmo, co więcej, zwykle serwer gry ma znacznie wyższe wymagania, niż prosta strona WWW na WordPressie, często dostępny jest też tylko w wersji na Windows.
Co więc robić? Najczęściej grupa znajomych, która chce pograć w swoim gronie online, robi zrzutkę na serwer i kupuje VPS-a o wyśrubowanych parametrach. Administrator instaluje serwer, rozsyła w grupie dane do logowania, a potem – potem wszyscy są niezadowoleni, bo ich kosztujący setki złotych miesięcznie VPS działa niestabilnie, dla niektórych graczy w niespodziewanych momentach pojawiają się opóźnienia. I mimo że hoster zapewnia o najwyższych parametrach swojej usługi, a administrator eksperymentuje z dostrajaniem konfiguracji, to nic nie pomaga. Problem tkwi bowiem na poziomie infrastruktury. Typowemu hostingowi VPS-ów, korzystającemu z kontenerów OpenVZ czy Virtuozzo, doskwierają opóźnienia na poziomie jądra systemu, nie mówiąc już o problemach z elastycznym skalowaniem zużycia zasobów, czy niską wydajnością pamięci masowej. W tej sytuacji zamożniejsi gracze zaciskają zęby i wykupują dedykowany serwer, który rozwiązuje ich kłopoty, a mniej zamożni męczą się z VPS-ami.
Z naszych doświadczeń wynika jednak, że serwery uruchamiane w wydajnej chmurze obliczeniowej są znacznie lepszym rozwiązaniem, niż VPS-y i znacznie tańszym, niż serwery dedykowane. Dlaczego tak jest?
- Pełna wirtualizacja, zapewniana przez hiperwizory takie jak Xen czy ESXi, pozwala na znacznie lepszą izolację zasobów, niż techniki konteneryzacji w stylu OpenVZ, dzięki czemu serwer gry pracuje stabilnie nawet przy bardzo wysokich obciążeniach. Nie bez znaczenia jest też to, że wydajność wirtualnej pamięci masowej w chmurze Oktawave jest wyższa niż dedykowanych fizycznych macierzy storage'owych, a co dopiero dysków wykorzystywanych przez typowe VPS-y.
- Serwery gier wykorzystywane są zupełnie inaczej, niż np. serwery WWW. Nie muszą być dostępne przez cały czas. System rozliczeń, w którym płaci się tylko za realnie wykorzystane zasoby, jest więc dla graczy idealny. Kupując serwer dedykowany, płacisz za cały miesiąc jego pracy, bez względu na to, czy jest on akurat potrzebny, czy też nie, tymczasem po przygotowaniu serwerowej instancji w Oktawave uruchamiasz ją na czas gry, a gdy przestaje być potrzebny, wyłączasz do następnego razu. W ten sposób płacisz wyłącznie za czas, w jakim serwer był uruchomiony, co oznacza, że koszty utrzymania nawet bardzo mocnej wirtualnej instancji serwera gier w Oktawave mogą być kilkanaście razy niższe, niż koszty utrzymania serwera dedykowanego.
Tyle teorii. Pokażemy, jak uruchomić w Oktawave serwery Minecrafta i HLDS (serwera dla gier Valve bazujących na silniku Source).
Klocki w chmurze – świat dla Ciebie i Twoich znajomych
Minecrafta przedstawiać specjalnie nie trzeba. Zbierasz materiały, a potem robisz z nich różne rzeczy, np. maszynę Turinga czy zamek w Malborku. W tym niekończącym się świecie kubików, w którym jedynym oficjalnym celem jest przetrwanie, można żyć samemu, ale o wiele ciekawiej żyć z przyjaciółmi. Co prawda, lista publicznie dostępnych serwerów Minecrafta jest bardzo długa, ale wszystkie one mają pewną wadę – nikt nie zagwarantuje, że to co budujesz w pocie czoła, nie zostanie popsute przez jakiegoś anonimowego łotra. Jeśli więc chcesz poczuć się w swoim świecie bezpiecznie, najlepiej nie dopuszczać do niego nieznajomych.
Krok 1: przygotowujemy instancję OCI
Jeśli korzystaliście już z serwerów wirtualnych w Oktawave, to ten etap powinien być prosty. Jeśli nie, to polecamy nasz przewodnik Jak dodawać instancje (OCI) i jak nimi później zarządzać?, a także zapoznanie się z przewodnikiem Jak zmienić rozmiar dysku OVS.
Naszym celem będzie uzyskanie instancji klasy Small, z dyskiem klasy Tier-2, działającej pod kontrolą Debiana 7. Dlaczego nie sugerujemy uruchomienia czegoś większego? Odpowiedź jest prosta – Minecraft ma swoje specyficzne wymagania. Po pierwsze, wbrew obiegowym mitom serwer gry wcale nie potrzebuje dużej ilości RAM, 2 GB pamięci dla instancji Small powinny wystarczyć nawet 30-40 graczom. Wzięcie instancji Colossus z 64 GB RAM niewiele by tu zmieniło. Po drugie, Minecraft jest aplikacją jednowątkową – 16 wirtualnych procesorów nic mu nie pomoże. W najlepszym razie możecie skorzystać z modu Minecrafta o nazwie Optifine, pozwalającego na wykorzystanie dwóch rdzeni – a właśnie tyle zapewnia instancja Small. Po trzecie, pamięć masowa na poziomie Tier-2 sprawia, że nie trzeba się bawić w zakładanie buforów w RAM-dyskach, by poradzić sobie z ogromną liczbą operacji zapisu/odczytu na plikach gry. Przy 20 tysięcach IOPS dostępnych na wolumenie Oktawave Tier-2, Minecraft poradzi sobie nawet z największymi światami.
Krok 2: instalujemy środowisko Javy
Po stworzeniu instancji OCI należy przygotować środowisko uruchomieniowe dla Minecrafta. Logujemy się więc po SSH (zgodnie z poradnikiem Jak dostać się do konsoli instancji OCI poprzez przeglądarkę oraz RDP/SSH?), aktualizujemy Debiana poleceniami apt-get update && apt-get upgrade
, a następnie instalujemy Javę 7 od Oracle'a (można korzystać też z opensource'owej OpenJDK, ale wersja Oracle wygląda na nieco szybszą). Oficjalny instalator Oracle'a jest niewygodny i niezbyt przyjazny Debianowi, ale na szczęście dostępne jest nieoficjalne repozytorium, pozwalające na wygodniejszą instalację.
Dodajemy repozytorium poleceniami:
echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu precise main" | tee -a /etc/apt/sources.list
echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu precise main" | tee -a /etc/apt/sources.list
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886
apt-get update
a następnie instalujemy poleceniem
apt-get install oracle-java7-installer
które uruchomi instalator Javy (należy wyrazić zgodę na warunki licencji).
Następnie należy ustawić Javę 7 jako domyślną w systemie
apt-get install oracle-java7-set-default
i sprawdzić, czy poprawnie działa:
java -version
Wynik powinien być podobny do poniższego:
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) 64-Bit Server VM (build 24.0-b56, mixed mode)
Krok 3: instalujemy Minecrafta
Serwer Minecrafta pobrać można ze strony https://minecraft.net/download. Wykorzystamy w tym celu polecenie:
wget
minecraft_server.1.6.4.jar
(wpisz to polecenie w jednym wierszu)
(uwaga – należy sprawdzić numer aktualnej wersji i w razie potrzeby zmienić powyższy link).
Następnie warto przygotować konto zwykłego użytkownika, z którego uruchamiany będzie serwer (uruchamianie go jako root nie jest dobrym pomysłem, choćby ze względu na często pojawiające się luki w Javie). Robimy to poleceniami
useradd -c "minecraft" -m minecraft
mkdir /home/minecraft/
cp -R /root/* /home/minecraft/
chown -R minecraft:minecraft /home/minecraft/
Krok 4: konfigurujemy i uruchmiamy Minecrafta
Sposobów na optymalne uruchomienie serwera Minecrafta jest mnóstwo, a jeden jest lepszy od drugiego. Z naszych doświadczeń wynika jednak, że z tych wszystkich sekretnych parametrów przekazywanych do Javy przydaje się jedynie włączenie przyrostowego zbierania nieużytków (flaga -Xincgc), zapewniające większą płynność działania świata gry.
Przełączamy się więc na konto użytkownika minecraft poleceniem
su minecraft
i uruchamiamy serwer poleceniem
java -jar -Xincgc -Xmx2G minecraft_server.1.6.4.jar
W ten sposób stworzyliśmy nowy świat Minecrafta, do którego można dostać się pod adresem IP instancji OCI, na domyślnym porcie 25565. Jak można zauważyć, przy pierwszym starcie, serwer wyszukuje na początku pliki konfiguracyjne i istniejące światy – jeśli nie znajdzie ich, stworzy nowe.
Teraz pozostaje nam tylko zabić proces serwera (ctrl+C), a następnie przyjrzeć się utworzonemu przy pierwszym starcie plikowi server.properties. To tam można ustalić praktycznie wszystkie opcje świata gry, takie jak możliwość walki między graczami, pojawianie się potworów i zwierząt, czy też tryb grania – zwykły survival czy też kreatywny. Szczegółowe objaśnienia znajdziecie w wiki Minecrafta.
Przed rozpoczęciem gry należy też zajrzeć do pliku ops.txt. Wpisać należy do niego nazwę konta w Minecrafcie, dzięki czemu zostanie ono oznaczone jako operator serwera, mający prawo do wydawania poleceń administracyjnych. Po zalogowaniu się do klienta Minecrafta i wywołaniu czatu, poleceniem /help można obejrzeć całą ich listę (są tam m.in. polecenia wykopywania czy banowania).
Jeśli zależy zaś nam na prywatności świata, to warto otworzyć plik white-list.txt i dodać do niego listę kont znajomych. Dzięki temu nikt niepowołany nie dobierze się do naszych konstrukcji, by przerobić je w gębę trolla.
Warto też zainstalować w systemie narzędzie screen, dzięki któremu można przekierować wyjście działającego polecenia na wirtualny terminal, nie wiążąc w ten sposób terminala na serwerze.
apt-get install screen
Jeśli chcemy sobie uprościć życie z późniejszym uruchamianiem i wyłączaniem serwera, warto przygotować sobie skrypt startowy demona init. Dla Debiana znaleźć taki skrypt można np. tutaj. Po zapisaniu pliku jako minecraft-init oraz skopiowaniu go do katalogu /etc/init.d/, aktualizujemy listę skryptów poleceniem update-rc.d minecraft-init defaults
.
Wówczas uruchomienie serwera sprowadzać się będzie do wydania polecenia /etc/init.d minecraft-init start
, a jego zatrzymanie do polecenia /etc/init.d minecraft-init stop
.
To wszystko. Pamiętajmy, by po zakończeniu zabawy, gdy serwer nie będzie już nam potrzebny, wyłączyć Minecrafta, a następnie zatrzymać maszynę wirtualną. W ten sposób nie będziemy płacić w Oktawave za czas, w którym nikt nie grał.
Jeszcze jedna rada na koniec – oficjalny Minecraft jest trochę nudny. O wiele lepiej od razu zainstalować CraftBukkita, niezależną wersję serwera, którą uzupełniać można o przeróżne, czasem naprawdę niezwykłe wtyczki. Robi się to dokładnie tak samo, tyle że CrafBukkita pobrać można ze strony dl.bukkit.org. Oczywiście, im więcej wtyczek zainstalujemy, tym więcej RAM serwer będzie potrzebował, ale w Oktawave to nie problem – rekonfiguracja istniejącej instancji OCI zabiera kilka chwil.
HLDS – źródło w chmurze
Valve miłośnikom gier online przedstawiać nie trzeba. Tytuły takie jak Counterstrike: Source, Team Fortress 2, Left 4 Dead czy Half-Life 2: Deathmatch to klasyka, i wciąż grają w nie miliony ludzi na całym świecie. Publicznych serwerów, z których można skorzystać jest bardzo dużo, ale jeśli ktoś chce w pełni dostosować świat gry do swoich wymagań, to pozostaje mu uruchomić własny serwer HLDS (Half-Life Dedicated Server). Będzie on w stanie obsługiwać każdą z wymienionych gier.
Krok 1: przygotowujemy instancję OCI
Proponujemy wykorzystać jako system operacyjny Ubuntu 12.04 LTS. Czemu? Valve testuje swoje oprogramowanie dla Linuksa przede wszystkim na Ubuntu. Jako typ instancji wybieramy Starter – oferowane 0,9 GB RAM i jeden wirtualny procesor całkowicie wystarczą. Jako że HLDS jest aplikacją jednowątkową, uruchomienie dwóch procesorów nie przyniesie żadnych korzyści. Domyślny rozmiar dysku – 5 GB – też będzie wystarczył (o ile nie chcemy przygotować serwera dla wielu gier), warto jednak przełączyć jego klasę na Tier-2, tak jak opisano w przewodniku Jak zmienić rozmiar dysku OVS.
Krok 2: przygotowujemy Ubuntu
Serwer HLDS to aplikacja 32-bitowa, tymczasem dostępne w Oktawave obrazy systemów są 64-bitowe. Tak więc po zaktualizowaniu Ubuntu (logując się przez SSH i wydając polecenia sudo apt-get update && apt-get upgrade
) musimy jeszcze pobrać 32-bitowe środowisko uruchomieniowe, za pomocą polecenia:
sudo apt-get install lib32gcc1 ia32-libs
Następnie tworzymy konto użytkownika, na którym będzie uruchamiany HLDS:
sudo adduser hlds
sudo adduser hlds sudo
i poleceniem su hlds
przełączamy się na użytkownika serwera, ustawiając katalog na domyślny domowy poleceniem cd /home/hlds/
.
Krok 3: pobieramy serwer HLDS
Instalacja serwera możliwa jest dzięki narzędziu hldsupdatetool autorstwa Valve – ono odpowiada też za aktualizacje serwera gier. Pobieramy go z serwerów Valve poleceniem
wget http://www.steampowered.com/download/hldsupdatetool.bin
Teraz należy przyznać plikowi uprawnienia uruchomienia
chmod +x hldsupdatetool.bin
uruchomić narzędzie poleceniem ./hldsupdatetool.bin
i wyrazić zgodę na warunki licencji, wpisując yes
pod komunikatem.
hlsupdatetool instaluje w aktualnym katalogu klienta usługi Steam. Uruchamiamy go poleceniem ./steam
. Spowoduje to sprawdzenie aktualności oprogramowania i pobranie kilkudziesięciu megabajtów danych. Gdy klient steam jest już aktualny, można za jego pomocą zainstalować serwer dla jednej z gier działających na HLDS. Można to zrobić za pomocą poleceń
./steam -command update -game nazwagry -dir ~/nazwagry_hlds -verify_all -retry
Wartości, które może przyjmować parametr nazwagry, znaleźć można np. tutaj – przykładowo aby zainstalować Team Fortress 2, należy użyć tf
, a Counter-Strike 1.6 cstrike
.
Teraz należy przygotować się na dłuższe czekanie – jeśli instalujemy np. Team Fortress 2, to klient steama pobierze ponad 3 GB plików.
Krok 4: uruchomienie serwera gry
Przed uruchomieniem serwera należy ustawić jego podstawowe opcje. Plik z ustawieniami znajdziecie w katalogu orangebox/nazwagry/cfg. Możliwych ustawień są setki, opis większości z nich znajdziecie m.in. w polskiej wiki HLDS. Warto też zapoznać się z artykułem na stronach Steam. Tutaj jedynie przypomnimy, że wszystkie zmienne, które nie zostaną ustawione w pliku konfiguracyjnym, przyjmą wartości domyślne, które w wypadku większości gier powinny wystarczyć. Eksperymentujcie z nimi na własną odpowiedzialność. Warto na pewno ustawić wartość zmiennej sv_region
na 3
(serwer znajdujący się w Europie), dzięki czemu gracze z dalszych miejsc świata nie będą uruchomionego w Oktawave serwera widzieli przy filtrowaniu po regionach.
Podobnie jak w wypadku Minecrafta, warto teraz przygotować odpowiedni skrypt startowy, co pozwoli serwerowi gry działać nawet po wylogowaniu z sesji SSH. Najpierw instalujemy narzędzie screen (sudo apt-get install screen
), a następnie przygotowujemy skrypt hlds
w katalogu /etc/init.d/
poleceniem sudo nano /etc/init.d/hlds
.
Jeden z takich skryptów (srcds-service) znaleźć można na GitHubie tutaj. Po skopiowaniu jego zawartości do pliku hlds, należy zmienić wartość zmiennych SRCDS_USER (na hlds), DIR (na /home/hlds/orangebox) oraz PARAMS (to już zależy od typu gry, jaka ma być domyślnie uruchamiana – np. -game cstrike
uruchamia serwer Counter-Strike, zaś -game tf
– Team Fortress 2).
Szczegółowy opis parametrów uruchomienia serwera znajduje się w dokumencie na stronach Steam. Przydatne porady znajdziecie też na polskiej wiki HLDS.
Teraz pozostaje już tylko zapisać skrypt. Można nim sterować za pomocą poleceń
sudo /etc/init.d/hlds start
(start serwera)
sudo /etc/init.d/hlds restart
(restart serwera)
sudo /etc/init.d/hlds stop
(zatrzymanie serwera)
Jeśli chcecie, aby serwer uruchamiał się wraz z maszyną wirtualną w Oktawave, należy wydać polecenie sudo /etc/init.d/hlds enable
. Wyłączenie autostartu to oczywiście sudo /etc/init.d/hlds disable
.
W zasadzie można już grać. Administrator serwera gry powinien zainsteresować się dwoma rozszerzeniami – frameworkiem rozszerzeń Metamod:Source oraz rozszerzeniem dla administratorów SourceMod.
Kilka przemyśleń
Z naszych doświadczeń jako graczy wynika, że chmura obliczeniowa jest najbardziej opłacalnym rozwiązaniem dla tych, którzy grają okazjonalnie, chcąc postawić sobie serwer np. na weekend. Czegokolwiek jednak nie wybierzecie, pamiętajcie, by szukając właściwych serwerów unikać dostawców, którzy swoje VPS-y oferują jako tylko dodatek do współdzielonego hostingu. Mimo często atrakcyjnych cen, wskutek wykorzystywanych rozwiązań wirtualizacji nie są oni w stanie zaoferować stabilnego i wydajnego działania maszyn wirtualnych, nie mówiąc już o wydajności pamięci masowych.
Zanim też wybierzecie parametry takiego serwera, warto zapoznać się dokładnie ze specyfikacją wymogów oprogramowania serwerowego. Rzadko kiedy dobrze się ono paralelizuje, więc wieloprocesorowe konfiguracje nic tu nie przynoszą. Sprawdźcie też, jakie opóźnienia wiążą się z lokalizacją wykorzystywanego centrum danych – dla graczy z Polski serwer fizycznie położony np. we Francji czy USA jest kiepskim pomysłem.
Oczywiście jeśli chcecie skorzystać z Oktawave, sprawa będzie prostsza. U nas typ wykorzystywanej maszyny wirtualnej można swobodnie zmieniać, by ustalić, która opcja będzie najbardziej dopasowana do potrzeb grających. A do tego nie musicie się martwić o lagi, gdyż serwery są w Polsce. Miłego giercowania!
PS. Pamiętajcie, że każdy nowy użytkownik Oktawave dostaje na start 25 zł, by móc przetestować swoją maszynkę. Więcej na ten temat znajdziecie tutaj.
Maciej Kuźniar, prezes Oktawave sp. z o.o. oraz główny architekt. Pasjonat technologii związanych z przetwarzaniem i przechowywaniem danych, posiadający 10 lat doświadczenia w pracy dla klientów klasy enterprise (banki, telekomy, FMCG). Autor koncepcji technologicznie wspierających rozwój startupów oraz rozwiązań architektonicznych gwarantujących wysokie HA i SLA dla systemów IT.
Zdjęcia Computer servers, Laptops connected with database on the white background , Cloud computing, technology connectivity concept oraz Cloud computing concept on computer keyboard with white keys pochodzą z serwisu Shutterstock.