2009년 10월 24일 토요일

기존의 MMORPG의 서버 구성도

- MMORPG 게임 서버 : 인증서버, 게임서버, NPC서버, DBCache서버, DB서버
- 프론트앤드 서버 : 클라이언트가 직접붙는 서버를 프론트앤드
- 백앤드 서버 : 뒤에서 내부아이피로 물리는 서버를 백앤드서버
- 프론트앤드계열 : 로긴서버, 게임서버
- 백앤드계열 : 디비캐쉬, NPC, DB서버

 

 MMORPG는 대규모 멀티플레이어 온라인 롤플레잉 게임(Massively Multiplayer Online Role-playing Game)을 말합니다.

MMORPG에서는 수 천명의 플레이어가 같은 시간에 같은 세계 안에 존재하게 됩니다. 이 것은 항상 흥미로운 것들로 가득 찬 엄청나게 풍부하고 활동적인 요소들을 창출해냅니다.

MMORPG는 광활한 대지와 바다를 둘러싼 거의 무한한 퀘스트를 포함한 수천 시간의 게임플레이를 제공합니다.

월드 오브 워크래프트는 플레이어가 항상 새로운 모험과 장소, 몬스터, 아이템 등을 접할 수 있도록 지속적으로 새로운 컨텐츠를 추가하고 있습니다

 

게임 실행하면 로그인과정이 필요하니까 로그인서버(혹은 인증서버)로 붙어야 겠죠. 인증이 되면 게임서버에 붙을테고 게임서버에 부하를 줄이기 위해서 메신저서버를 따로 떼어서 채팅이나 잡다구리를 떼어내는 경우가 있습니다. 그리고 게임에 필요한 모든 db데이터에 중간 다리 역할을 하는 DB Cache Server가 필요할테고, mmo라면 게임서버에 붙는 NPC서버가 존재하여 게임서버에 몬스터를 Spawn해주겠죠.

크게는 이렇게 인증서버, 게임서버, NPC서버, DBCache서버로 구성되는것이 일반적입니다. DB는 따로 있구요. 부하에 따라서 혹은 효율에 따라서 세분화되어 따로 떼어내거나 동접늘어났을때 서버를 나누는것도 생각해야 하는데.. 처음부터 그수준까지 생각할 필요는 없구요. 위에 4가지 서버가 안죽고 효율적으로 탄탄하게 버티도록 만드는 것이 중요한것 같네요. NPC서버는 성격이 좀 다르니 빼고 나머지 세가지 서버는 각각 더미클라이언트 만개정도 띄워서 스트레스테스트를 통과하면.. 그다음 NPC서버 만들어 붙여보믄 되겠습니다.

처음부터 다만들고 다돌려보긴 빡쎄구요.


여기서 클라이언트가 직접붙는 서버를 프론트앤드, 뒤에서 내부아이피로 물리는 서버를 백앤드서버라 하는데 로긴서버, 게임서버는 프론트앤드계열이고, 디비캐쉬, NPC, DB서버는 백앤드가 되겠네요.


구조는 그리 중요하지 않으니 자신이 할수 있는 간단한거부터 하나씩 구현해보시구 스트레스 테스트 확실하게 해보는 게 좋을거 같네요.


제일 간단한 로긴서버라도 상용서버에서는 최대한 많은 클라이언트를 받아서 로긴을 빨리 처리해줘야하므로 DB에서 매번 아이디, 패스워드 읽어서 비교하고 응답 패킷보내지 않고 내부적으로 Cache를 두고 한번 로그인하면 메모리에 올렸다가 그다음부터는 메모리 검색해서 결과 돌려줍니다. 그러면 패스워드 변경이나 유저 탈퇴등등 캐쉬에서 삭제해야 하는 경우는 삭제도 해야하구요.. 변경된경우는 다시 DB로 Flush를 해줘야 합니다.

복잡하죠. 많은 사용자 받기위해서 제대로 만들라면 끝도 없습니다. DB에서 매번 읽어서 결과 보내주는 것부터 확실하게 만들고 그다음 최적화를 해야겠죠.


제일 복잡한 게임서버나 NPC서버는 게임로직이나 엄청난 규모의 몬스터테이블, 아이템테이블, 스킬테이블 등등..이 들어가므로 유지보수가 쉬워야 하는 효율을 지니고 있어야 하고 (하드코딩보다 스크립트로 서버구조를 변경가능하도록..) 또한 클라이언트가 행동한 어떤 한 패킷의 결과를 계산해서 유효한 반경에 있는 모든 다른 클라이언트에 브로드캐스팅하는 것이 중요한 네트워크 성능 이슈인데, 그래서 보통은 Zone이라고 해서 브로드캐스팅할 영역을 나누거나 기타 다른 여러가지 효율을 위한 기법이 내부적으로 설계가 되어 있어야 합니다.

그리고 프로그래머들이 (저도 포함) 간과하는 문제중에 DB에 스키마 설정이나 테이블, 필드 만들고 최적화 하는일입니다. 이것은 자기가 경력이 안되면 잘하는 사람 하루혹은 며칠을 데려다가라도 제대로 만들어 놔야 합니다. 저장프로시저같은것도 만들어달라고 하구요. 대게 SQL 책보고 대충 만들어 놓고 나서 나중에 MSSQL이 후지다느니 오라클도 돈값을 못한다느니 그럽니다. MSSQL, Oracle, MySQL모두 훌륭합니다. 제대로만 쓴다면...


마지막으로 서버를 MS기반으로 구성할것인지 Unix(Linux)계열로 구성할것인지에서 만드는 사람이 우선 자신있는것으로 해야겠지요. 다 장단점이 있습니다. 제경우는 linux는 많이 못해보고 MS로 주로 작업했구요. linux는 서버 소켓 프로그래밍으로 최근에는 epoll, kqueue, RTS등을 사용하려고 한다던데.. 상용 리눅스 서버는 대부분 아직까지도 select, poll 방식입니다. (제작년기준 -_-) MS는 정보공유가 아무래도 Linux보다는 잘되다 보니 대부분 상용서버도 iocp로 만들죠. 굳이 최신의 기술을 쓰는것은 제 경험상 그다지 중요하지 않더군요.. 가장 정보공유가 잘되는 기술을 선택하는게 좋은것 같습니다. iocp로 한대로 돌려서 처리되는걸 select방식으로 10대 돌리면 된다는 거죠. iocp코딩을 해도 제대로 만들지 않으면 한대로 돌릴수 있는걸 10대이상 돌려야 하는 경우가 나오는걸 많이 봤습니다.

두서없이 쭈욱 덧붙였습니다. 참고가 되시길..

 

출처 : 게임 개발자 네트워크 카페

댓글 없음:

댓글 쓰기