자료실

온라인 게임 - 다계층 서버 개념 및 설정
작성자 | admin 2022-01-03  |    조회수 : 887  




Region Server의 기능은 자율적으로 계획할 수 있습니다. 많은 중대형 온라인 게임 애플리케이션의 구조에서 매우 중요하며, 매우 필요한 모듈입니다. 많은 경우 유저 분류, 하드웨어 이용, 네트워크 트래픽 같은 다양한 리소스가 필요합니다. 분산, 집중, 순환 및 다양한 동적 처리와 분배를 수행해야만 온라인 유저를 잃지 않는 상황에서 효율적으로 모든 리소스를 이용하고 돈과 시간, 인력을 절약할 수 있으며 좋은 게임을 제공한다는 목적을 달성할 수 있습니다.

Photon Cloud에는 이미 다년간 정상 운영 중인 Region Server / Cluster Server와 같은 다계층 서버 구조가 존재하며 기업 사용자와 AAA 등급의 게임사들에게 사랑받고 있습니다. 현재 최신 Photon Server v5에 이 기능이 추가되었기 때문에 이번 편에서는 관련 개념과 설치 단계를 설명하려고 합니다~



Photon Server 5의 초기 설치 방법 설명은 Photon Server 5 설치 및 설정의 링크를 참조하시기 바랍니다.




Photon Server 5 — 다계층 서버 개념



다계층 서버 구조의 경우 개념은 아래 그림을 참조할 수 있습니다. 대부분의 메인 서버는 프론트엔드 가이드를 수행합니다. 해당 기능은 주로 연결된 지역 서버의 이름과 네트워크 위치를 확인하는 것입니다. 일부 App ID의 식별 및 플레이어 로그인 인증 및 기타 기능을 수행합니다.




1층


Photon Server 구조에서는 프론트엔드 서버의 이름을 목적에 따라 짓기 때문에 우리는 이것을 위 그림의 첫 번째 레이어처럼 NameServer라고 부릅니다. 우리의 예제에서는 Taiwan Taipei에 위치하고 있으므로 위 그림에서는 지역을 바로 기재했습니다.

물론 NameServer가 실제로 여러 개 존재할 수도 있습니다. 즉, NameServer를 여러 개 설정한 후 서로 백업할 수 있으므로 서버 연결에 실패하면 클라이언트 측에서 다른 영향 없이 자동으로 두 번째, 세 번째 NameServer로 자동 전환할 수 있습니다.

2층


이곳은 Region Server, 즉 지역 서버가 있는 곳입니다. Taiwan / Japan / Korea 같은 지역에 설치할 수 있고 주로 현지 유저를 위해 서비스하는 용도입니다. 일반적으로 Region Server 한 개에 만 명 이상의 인원이 동시에 접속하여 매칭되는 상황에 대처할 수 있어야 합니다.

Photon Server 구조에서 팀 할당, 게임 로비, 유저 전환을 수행하는 지역 서버를 우리는 MasterServer라고 부릅니다.

어떤 지역 유저가 특별히 많은 경우, 서비스하는 서버를 몇 대 추가하면 됩니다. 예를 들어 미국은 미국 동북에 MasterServer 2대와 미국 서부 MasterServer 3대를 운영하는 방식이 가능합니다. 때로는 백업이 필요하기 때문에 같은 Region에 여러 MasterServer를 설정하여 Cluster를 계획하고 유저 전환에 대한 요구 사항을 충족시킬 수 있습니다.

3층


이곳은 실제 게임이 실행되는 곳으로 Photon Server에서는 이를 GameServer라고 부릅니다. 이는 종종 실제 기계실의 위치를 뜻하기 때문에, 우리는 그림에서 Taipei, Tokyo, Seoul 등 명칭을 사용하곤 합니다.

일반적으로 1개 GameServer가 1000~2000 CCU를 지원하며 구성 요소의 분류나 백업을 원하면 같은 Region/위치에 여러 GameServer를 설정하여 동일한 Region이지만 만 명이 넘는 사람이 동시에 접속하는 상황도 처리할 수 있습니다.


Photon Server 5 — 가변 네트워크 배포 유형



(1) Default 기본 설치


기본 설치 시 LoadBalancing (MyCloud) 사용 시 호스트에서 세 개의 독립적인 Photon App이 실행되며 각각이 독립적인 애플리케이션입니다.
우리는 NameServer, MasterServer와 GameServer를 다음 그림처럼 부릅니다.



(2) LoadBalancing 설치


VM (가상 기계) 여러 대 혹은 개별 호스트를 사용하여 GameServer 여러 대를 매칭하여 유저 수준 분류 혹은 기기의 유지 보수 기간 변경, 혹은 프로그램 A/B Testing의 각종 상황을 달성합니다.
예를 들어 아래 그림에는 Game Server를 독립적으로 실행하는 두 개의 VM이 있으므로 A/B Testing을 전환하거나 각각 2500 CCU 사용 인원을 지원하여 최대 5000명의 사용자가 접속한 상황에 동시에 대응할 수 있습니다.



(3) 여러 Region/Cluster Server의 설치


게임 속 유저가 전 세계에 분포해 있을 때 유일한 프론트엔드 가이드가 필요하거나 다른 백업 메커니즘이 필요하고 아니면 NameServer도 자체 계획한 플레이어 인증 기능을 매칭해야 합니다. 이때 NameServer는 VM기기 1대에서 독립적으로 실행하는 것이 가장 좋은 방법입니다.





Photon Server 5 — 다계층 서버 설정



이전 개념을 단순화하여 가장 빠른 방법으로 최소화하고 두 개의 VM을 사용하여 Photon Server를 설정하고 스트리밍 또는 백업 멀티레이어 서버 설정 작업을 수행하고 필요한 모든 설정 단계를 이해합니다. 이런 식으로 미래에는 여러분이 개별 프로젝트를 위한 범용 혹은 특수 멀티레이어 게임 서버를 설계할 수 있습니다.

그림처럼 두 개의 VM이 있고 이를 두 Region으로 시뮬레이션하고 각각 PhotonServer의 기본값을 사용하여 설치한다고 가정합니다.



1. VM의 설정


VM 인스턴스 2개가 설정된 Google Cloud Platform의 Computer Engine을 사용하고 있습니다. 유형:
  • ● 기기 유형: n2-standard-4(4개 vCPU, 16GB 메모리).
  • ● 이미지 파일: windows-server-2019-dc-v20210914
  • ● 부팅 디스크: 50 GB, 균형 잡힌 영구 디스크
  • ● 외부 IP: 임시
  • ● 네트워크 서버 등급: 프로페셔널 버전
  • ● 지역: asia-east1-b


2. VM 방화벽 규칙


모든 VM의 nic (네트워크 인터페이스 카드) 설정에서 PhotonServer / Client 연결을 허용하는 규칙을 추가합니다.
  • ● 유형: 입력
  • ● 타깃: 모든 적용
  • ● 필터: IP 범위: 0.0.0/0
  • ● Protocol/Port: udp:5055–5058
  • ● 동작: 허가


3. Photon Server 설치 주의 사항


기본 설치 시 License 설치 위치가 정확한지 확인해야 하며, VM 두 대에 PhotonServer 라이선스 2개가 있어야 합니다. 그렇지 않을 경우 PhotonServer의 App이 실행되지 않을 수 있습니다.

4. Public IP의조회 방식


MasterServer와 GameServer의 Public IP 위치가 주로 다음과 같음을 알아야 합니다.
(1) NameServer로 MasterServer 찾기
(2) MasterServer로 GameServer 찾기
(3) GameServer가 MasterServer에 주동적으로 등록할 수 있고 서버 간 통신을 허용합니다.

가장 간단한 방법은 cmd에서 nslookup을 실행하여 non-authoritative answer의 Address, 즉 아래 그림의 34.81.abc.xyz처럼 기기의 Public IP.를 획득하는 것입니다.



5. NameServer.json 의 설정


NameServer가 어떤 Master Server가 사용 가능한지 알 수 있도록 Master Server IP를 설정하고 정보를 얻은 후 Client를 어느 Region이나 Cluster로 안내할 수 있습니다.

다음 코드는 NameServer.json의 설정이며 파일 위치는 Photon Control의 Edit nameserver.json의 옵션을 사용하여 쿼리를 남겨주세요. 일반적으로 PhotonServer\deploy에 있습니다.

{
  "Nodes": [
    // --- Public - Taiwan ---
    {
      "Region": "TAIWAN",
      "IpAddress": "34.81.123.001", //VM1의 Public IP 기재
      "IpAddressIPv6": "::1",
      "Hostname": "taiwan"
    },
     // --- Public - Japan ---
    {
      "Region": "JAPAN",
      "IpAddress": "34.81.123.002", // VM2의 Public IP 기재
      "IpAddressIPv6": "::2",
      "Hostname": "japan"
    },
  ]
}


주의:여기서 MasterServer 2대를 찾기 위해 필요한 GamesServer는 한 대 입니다. 그러므로 우리의 VM 두 대에서 NameServer.jso 한 대를 선택해 편집하면 됩니다. 다른 vm의 NameServer.json은 전혀 변경할 필요가 없습니다.


6. GameServer의 Public IP 설정


외부 Client가 연결할 수 있도록 GameServer를 해당 기기의 Public IP에 바인딩해야 합니다. PhotonServer를 VM 두 대에 배포하기 때문에 각 VM의 GameServer를 모두 설정하여 각자의 Public IP에 바인딩할 수 있어야 합니다.

설정한 파일 위치: PhotonServer\deploy\LoadBalancing\GameServer\bin
파일명: GameServer.xml.config


<Master> <PublicIPAddress></PublicIPAddress> <PublicIPAddressIPv6></PublicIPAddressIPv6> </Master>

주의:위 xml의 <PublicIPAddress></PublicIPAddress>빈값(값을 입력할 필요없음)이므로 GameServer가 바인딩을 위한 로컬 Public IP 위치를 자동으로 찾습니다.


7. GameServer에서 Master Server와 관련된 설정


우리의 MasterServer와 GameServer는 같은 VM에 있기 때문에 default 설치 시 해당 단계가 필요하지 않습니다. 하지만 이곳의 값을 부주의하게 변경하진 않았는지 확인해도 좋습니다..

설정한 파일 위치: PhotonServer\deploy\LoadBalancing\GameServer\bin파일: GameServer.xml.config


<S2S> <MasterIPAddress>127.0.0.1</MasterIPAddress> </S2S>


만일 MasterServer와 GameServer가 같은 VM에 있지 않으면 위의 값에는 진짜 MasterServer IP를 입력해야 합니다. 그렇지 않으면 유저는 이 GameServer에 들어갈 수 없습니다!!


8. Photon Server Apps 사용


Photon Control의 LoadBalancing(MyCloud)에서 Start as Application을 실행합니다.

이럴 경우 VM에서NameServer App, MasterServer App, GameServer App 순으로 실행됩니다. 그러나 두 개의 VM이 있으므로 각 VM을 실행해야 합니다! (VM 한 대의 NameServer는 사용하지는 않지만 지금은 일단 놔둬도 됩니다).



연결 테스트



자체 구축된 Photon Server가 이전 문단에서 설명한 대로 설치됐으면 다음 단계는 Client 연결 테스트 몇 가지를 수행하는 것입니다. 단계와 방법은 다음과 같습니다.

1. Client 설정


새 Unity 프로젝트를 만들고 PUN 2를 다운로드/설치하면 내부 Demo를 사용하여 연결 테스트를 수행합니다.

2. PUN-Cockpit 화면


Unity Editor에서 PUN-Cockpit 화면을 열었을 때 파일 위치:
Assets/Photon/PhotonUnityNetworking/Demos/PunCockpit/PunCockpit-Scene.unity




3. PUN Photon Server Settings


Photon Server Settings (Server Settings)에서 주의해야 할 사항:
  • ● App Id PUN/Chat : 입력하지 말고 빈칸으로 두세요.
  • ● User Name Server : 체크 (check)
  • ● Fixed Region: 빈값, Latency가 가장 짧고 속도가 가장 빠른 Region이 선택된다는 의미입니다.
  • ● Server : NameServer의 Public IP를 입력하세요
  • ● Port : 0은 기본 연결 포트를 자동으로 사용함을 의미합니다.
  • ● Protocol : Udp
  • ● Dev Region : 입력하지 말고 빈칸으로 두세요.

기본 설정을 완료하면 아래 그림처럼 표시됩니다.



log 사항을 위 그림과 같이 설정하세요.
Unity Console에서 디버그 리소스를 조회하기에 좋고 아니면 SNS에서 질문할 때 사용하죠~



4. Play


이어서 Editor의 Play를 실행하고 이 테스트 프로그램을 확인하세요.

연결에 성공하면 Infos의 리소스 패널에서 Server Address가 설정해둔 MasterServer Public IP와 연결된 Cloud Region과 같은 것을 볼 수 있습니다. 그리고 Best Region in Preferences에는 과거의 모든 최적의 Region Server 이력 기록도 존재합니다.

아래 그림처럼 우리가 NameServer에서 설정한 Cloud Region: taiwan 에 연결되었습니다.



또한 Create Room/Join Lobby 같은 기타 버튼을 눌러 기능을 테스트해 볼 수도 있고 debug log에 쓰인 메시지도 겸사겸사 확인할 수 있습니다.



위 그림과 같이 NameServer에 제대로 접속하고 인증한 후 최적의 Region을 찾아 MasterServer로 전환하는 등 모든 접속 과정의 정보를 볼 수 있고 이어서 유저가 Lobby에 입장하거나 방을 만들 때까지 기다리면 됩니다. 문제가 있으면 log에서 잘못된 연결 메시지도 볼 수 있습니다.


5. MasterServer 및 GameServer의 유저 연결 확인


Client의 연결 여부와는 관계없이 Photon Server에서 조회할 수 있습니다. Photon ControlOpen Logs 기능에서 기기의 모든 Server Logs를 불러올 수 있습니다.

(1) NameServer: Client 가 지정한 Region / MasterServer를 찾을 수 없는 경우, NameServer.log 에서 Warning Log를 볼 수 있습니다. 사용 가능한 Region이 있으면 어떠한 log도 없으므로 Client의 연결 동작이 매우 정확하고 어떤 문제도 발생하지 않습니다.

(2) MasterServer: MSMaster.log 를 확인하여 Client가 연결되어 있는지 확인할 수 있고 Client의 IP adress와 일부 자료도 있을 것입니다.

(3) GameServer: GSGame.log를 확인할 수 있습니다. 클라이언트가 Create/Join Room 작업을 수행하면 클라이언트의 IP와 일부 정보가 GSGame.log에 남으므로 서버에서 클라이언트의 활동 상황을 알 수 있습니다~


결론


여기까지 보신 여러분이라면 게임 서버 구축에 관심이 많으시겠죠. 그럼 이제 위에서 소개했던 Photon Server 5 다계층 서버의 응용에 대해 어느 정도 이해가 되셨나요?

윗글에서 언급한 빠른 설치, 프로그램 실행, 적용 가능한 다계층 구조 설정만으로도 사실 수천, 수만 명의 인원이 동시에 접속할 수 있는 멀티플레이 온라인 게임 서비스에 충분히 대처할 수 있죠. 아주 간단하고 강력하지 않나요~

예전처럼 PhotonServer의 예제, 기능, 구조 등을 계속해서 동영상과 블로그 강의 시리즈를 만들어 여러분과 공유하여 참고할 수 있도록 노력하겠습니다. 여러분 모두가 더 나은 온라인 게임 혹은 온라인 애플리케이션을 더 빠르게 개발할 수 있게 되기를 바랍니다. 궁금한 점이 있으시면 SNS에서 메시지를 보내주세요. 함께 의견을 나누어 보아요!!



한국 페이스북 페이지 : https://www.facebook.com/photoncloudkr/
기술관련 문의사항 : developer@photonengine.kr
그 외 문의사항 : info@photonengine.kr


Stay Tuned!





출처 : Hu씨의 Photon 블로그 이야기 (대만)