월드 분할 시스템 (Aldar-World-Division)
Pub에 구역 생성 (matrix 프리셋)
월드에딧의 나무도끼와 비슷한 로직을 이용해서 폴리곤 모양으로 구역을 생성할수 있게끔 구현
(사각형모양 이외에도 볼록(Convex), 오목(Concave) 다각형 지원)
건축가가 일일이 구역을 생성 등록 하는것 말고 프리셋형태로 자동으로 불러오는 기능을 추가
Pub(Commit Server) / Sub (Minecraft Server) 구조
Pub/Sub의 서비스를 사용하여 마인크래프트 서버들에게 배포할수 있게금 구현되어있다.
이를 통해 한서버의 부하를 줄임으로써 로드밸런싱을 구현하는것이 이번 프로젝트의 목적이다.
인게임 내에서 구역들의 현황 조회
서버들의 현황을 확인하고 이서버를 플레이어에게 개방할지 말지를 결정한다.
단일 구역이 가지는 사이즈
플레이어가 보는 시야를 고려하여 실제 구역의 크기보다 마진을 넉넉하게 잡았다.
마인크래프트 서버에서 지형데이터를 요청할때 사진설명에서의 청크배정사이즈의 지형데이터를 전송받는다.
Pub에서 지형 수정시 Sub에 반영
건축가가 이후 건물에 수정을 가하여 Sub서버에 배포하고 싶다면
수정구역을 등록하고 간단하게 커밋을 수행하면 각서버에 반영된다.
오프라인 서버는 서버 로드시 추가 지형데이터를 전송받는다.
내부 캐싱 전략
Pub의 구조도
플레이어는 구역A의 경계를 벗어난후 Teleport Threshold를 넘어가면 구역B의 서버로 이동
TeleportThreshold를 넘어가는순간 PlayerManageAPI의 serverjump()가 호출
서버이동 실패시 구역A 경계부근으로 밀려난다.
Aldar-Player-Manage API 에서 제공하는 서버 점프 기능 사용
다른호스트에서 처리시간이 늘어지는거같은데 이건 좀더 테스트 해봐야될듯싶다.
Sub에서 다른 구역과 가까운 경계주변의 지형수정 발생시 주변 구역에게 수정된 청크 전파
경계주변에서 플레이어들은 실시간으로 지형이 변하는것을 볼수있다.
1. 테스트로 Server1에 간단한 지형 수정
2. 수정을 감지후 Server1 -> Server2 업데이트 청크 전송
3. Server2에도 반영된 모습
Sub의 구조도
-Aldar World Division-
1. Features
- 구역 분할 시스템
- 건축가를 위한 실시간 Dynmap 지원
- Pub(커밋서버)/Sub(구역배정서버) 로 구성
- Pub : 구역 편집, 수정 , 각서버로 구역 배정 / Sub : 해당 서버에 구역 할당
- 각서버들간의 원할한 상호소통 지원
2. Caution
- 생성하는 구역이름과 서버의 이름이 일치해야합니다.
- 번지코드 config에 저장되어있는 서버의이름 과 각 Subscriber 서버마다 AldarFramework config에 저장되어있는 id(서버의 이름)가 동일한지 확인할것
- 서버는 처음 부팅시 지형데이터를 전송받지 않았다면 커밋서버에 요청을 전송합니다.
3. Requirement Analysis
3.1 커밋서버
- 구역들을 생성하여 각 서버와 매핑
- 커밋서버에서 구역 등록/삭제후 커밋을하면 관련서버들에게 반영
- 커밋한 정보들은 DB에 저장 - 구역을 등록/삭제 하더라도 커밋하지 않으면 그대로 날라감
- 커밋 명령어 실행시 GUI를 통해 커밋스테이지의 상태를 출력
- 커밋 수행시 월드와 구역정보를 스냅샷 캐시로 저장,이후 월드에서 구역 수정 작업을 수행해도 무결성이 보장.
- 건축가가 구역 안에서 지형을 수정한후 커밋을하면 해당 지형에 관련된 서버들에게 지형 데이터를 전송을 보장
- 수정된 지형정보를 전송할때 데이터의 크기가 Chunk 500개 이하면 Chunk 전송, 아닐시 Region 파일로 전송
- Dynmap을 통해 현재 구역의 모습을 실시간으로 확인할수 있을것
- 건축가를 위한 구역 편집모드 , Dynmap 편집 마커 지원 할것
- 구역생성시 구역 중심값을 스폰지점으로 자동생성 이는 나중에 변경가능 (실시간 반영됨)
- 모든 서버의 지형 업데이트 상태 , 활성화 유무 확인 가능
- 구역은 경계에서 240블럭(청크 시야 한계거리) 떨어진 곳의 지형 데이터까지를 가짐
3.2 구역배정서버
- 구역 배정서버는 처음에 DB에서 지형정보를 받았는지 확인, 지형정보가 필요하면 커밋서버로 요청
- 지형 정보를 전부 받았어도 커밋서버에서 해당 구역을 활성화 하지 않으면 플레이어의 접근을 거부
- 해당서버가 업데이트 해야할 Chunk를 수신하면 비동기를 통해 지형을 반영함
- 해당서버가 업데이트 해야할 Region을 수신하면 모든 플레이어를 방출 하고 지형을 반영함
- 10틱마다 플레이어의 위치를 검사 구역밖을 벗어나면 서버이동 또는 경계로 막음
- 15초마다 지형의 수정을 감지해서 해당 지형과 경계선에 있는 서버들에게 수정된 청크를 보냄
- 플레이어는 해당 구역에 처음 접속시 여관(스폰지점)으로 배정
- 구역경계로 부터 10블럭이상을 나가면 플레이어의 텔레포트 허용
4. 테스트 영상
레거시 버전으로 테스트된 영상입니다.
P.S
레거시 버전 당시 유지보수가 힘들거같아서 구조를 싹다 갈아엎었다.
리메이크버전으로 좀더 가독성 좋은 코드와 구조로 바꿨지만
아무튼 뭐라도 서버가 열려야 빛을 보지 않을까싶다.