로그인

회원가입 | ID/PW 찾기

취재

[NDC14] “모든 서버는 죽는다” 오픈월드 RPG 듀랑고의 ‘구멍 없는’ 서버 만들기

‘프로젝트K 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버’ 강연 정리

안정빈(한낮) 2014-05-29 17:52:25

모바일로 MMORPG를 즐기는 게 더이상 낯설지 않은 요즘. 한 걸음 더 나아가 ‘오픈월드’와 ‘심리스’를 내세운 신작이 주목받고 있다

 

<마비노기 영웅전>의 이은석 디렉터가 만드는 모바일게임 <야생의 땅: 듀랑고>는 오픈월드에서 벌어지는 ‘높은 자유도’를 추구한다. 이를 위해 기술적으로 중요한 요소가 바로 서버. 창발적 도전을 즐기는 왓 스튜디오의 고민과 선택을 선택을 들어 보자. /디스이즈게임 안정빈 기자


28 NDC 2014에서 ‘프로젝트K 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버’로 강연한 이흥섭 서버 프로그래머(넥슨 왓 스튜디오)

 

 

“모든 서버는 분명히 죽습니다.

 

서버 다운은 게임을 즐기는 유저에게 매우 민감한 문제다. 한창 신났을 때 서버가 죽으면 흥이 깨지고, 만에 하나 잘못돼서 애써 얻은 경험치나 아이템이라도 날아가면(롤백, 또는 백섭) 멘탈이 깨진다<듀랑고> 개발진은 죽지 않는 서버란 없다는 솔직한 가정 아래 서버 구조를 고민했다. 그 결론은 세 가지.

 

- 가정: 모든 서버는 죽는다.

- 단일고장점(SPOF)을 없애자.

- 부분적 장애는 허용하자.

 

이를 통해 유저에게 주고 싶은 게임 경험은 [단일 세계] [끊임없이] [영속성] 있고 [일관성] 있게 전달되는 것이었다. 이흥섭 프로그래머는 단적인 예로 “마음 먹기에 따라서는 공룡 한 종을 멸종시킬 수도 있는” 플레이 경험을 제시했다.

 

<듀랑고> 월드는 단일세계이며, 영속성이 있고, 심리스 방식으로 구현된다.

 

 

<듀랑고> 서버 구축의 목표는 두 가지다. 가능한 다운타임을 짧은 상태로 유지하는 [높은 가용성]이 첫째다. 아무리 정기점검이라도 기다림은 유저를 불편하게 만들뿐이다. 유저가 늘고 주는 것에 따라 탄력적으로 대응되는 [신축성]이 둘째. 이를 위해 개발진은 유저들의 접속량에 따라 서버의 즉각적인 확장과 축소가 가능한 AWS(아마존 웹 서비스)를 서버 아키텍처로 선택했다

 

 

한 방에 무너질 수 있는 ‘구멍’을 없애자!

 

목표를 세웠으니 그 다음은 현실적인 고민이다. () SPOF, 즉 ‘구멍’을 없애는 게 우선이다. 보통 MMORPG의 서비스에서 게임서버나 로그인서버는 이중화해서 구멍을 막지만 나머지 중앙서버나 캐시 스토리지 등은 그렇지 않은 경우가 많다. 이러다 SPOF가 발생해 장애가 캐시 스토리지까지 전파되면 저장되지 않는 데이터가 생기기도 한다. 게이머나 게임사 모두에게 끔찍한 ‘백섭’의 원인이다.

 

단일고장점(SPOF)이란? Single Point Of Failure의 약자시스템 전체를 죽이는(다운하나의 고장(실패요소를 의미한다예를 들어 라우터로 묶여 있는 웹서버들의 경우웹서버는 보통 이중화가 되어 있어 고장나도 괜찮지만 라우터는 그렇지 않아서 라우터가 꺼지면 서비스 전체가 죽어버리는 경우가 많다.

 


이중화가 적용된 웹서버는 한 대가 죽어도 상관없지만, 이를 아우르는 라우터는 터지면 서비스가 다운된다. 대표적인 SPOF의 예.

 

온라인게임의 서버 구성에서, 중앙서버나 캐시, DB 쪽은 구멍(SPOF)으로 작용할 가능성이 있다.

 

 

구멍을 막기 위해 돈을 많이 들여 고사양 서버를 구축하기도 하지만, ‘영원한 안정성’이란 단언하기 힘든 이야기다. 이흥섭 프로그래머는 “지난 2012년 미국 동부에서 AWS로 게임서버를 운용하고 있었는데, 당시 동부에 굉장한 폭풍이 몰아쳤다. 벼락이라도 맞았는지 데이터센터에 있는 서버가 죽어서 한참 고생한 적이 있다”며 자신의 경험을 밝히기도 했다.

 

목표를 클리어하기 위해 개발진 앞에 놓인 미션은 세 가지였다.

 

- 어떤 언어로 서버 프로그래밍을 할 것인가?

- 분산처리를 위한 데이터서버와 게임서버는 어떻게 구축할 것인가?

- 개체(캐릭터, 몬스터 등) 간 상호작용은 어떻게 처리할 것인가?

 

 

(1) 언어참고할 오픈소스 라이브러리가 잘 갖춰진 파이썬


동적 언어인 파이썬은 코드의 양과 생각의 양이 일치하고(직관적), 오랫동안 이어져온 오픈소스 라이브러리가 잘 구축돼 있다는 장점이 있다. 오픈소스 커뮤니티를 잘만 활용하면 사소한 기능의 구현에 걸리는 시간을 단축할 수 있다. 실제로 <듀랑고>의 서버에는 40가지 이상의 파이썬 오픈소스 라이브러리가 활용되고 있는데, 이 중에는 몇 년 동안 다듬어져 안정성이 확보된 것도 있고, 시간이 지남에 따라 흘륭한 것으로 성장한 것도 있다.

 

물론 단점도 있다. 파이썬은 동적 언어다 보니 연산속도가 느리고 멀티스레드(다수의 작업이 동시에 진행되는 것)에 약하다. 이를 해결하기 위해 <듀랑고> 개발진은 프로그래밍의 일부를 C 언어로 대체했다. 그리고 하나의 스레드에서 입출력의 동시성을 확보할 수 있는 ‘지이벤트’라는 기법을 활용했다. 이흥섭 프로그래머는 “지이벤트가 있어서 파이썬을 쓴다. 파이썬3가 지이벤트를 지원하지 않아서 파이썬2를 쓰고 있을 정도다”고 말했다.

 


<듀랑고> 서버 개발진이 선택한 동적언어 파이썬. 이흥섭 프로그래머는 지이벤트를 최고의 이유로 꼽았다.

 

 

(2) 중앙서버는 NO! 분산서버를 효율적으로 연결하라

 

<듀랑고> 개발진은 중앙서버 없이 분산서버가 하나로 동작하게 하기 위해 각 서버가 서로 메시지를 주고받을 수 있도록 했다. 여러 대의 서버는 병목현상이 없도록 서로서로 연결되는데, 보내야 할 메시지가 있을 경우 발신자와 수신자로 구분돼 서버들이 교신하게 된다. 예를 들어, 수신자가 A/B/C만 채널로 선택할 경우 이 구독정보는 발신자에게 실시간으로 연동돼 이에 맞는 것들만 발송된다.

 

이는 곧 불필요한 통신이 줄어든, 꼭 필요한 분산서버 간 통신으로 이어진다. 보낼 필요가 있는지 없는지 미리 파악해서 쓸데없는 통신을 하지 않는 방식은 <듀랑고>의 서버 분산처리에 매우 유용한 기점이 됐다.

 

MMORPG의 서버에는 두 가지 상태 성질이 있다. 하나는 ‘영속성’으로, 캐릭터와 아이템 정보 등 서버가 내려가도 사라지면 안 되는 것들을 데이터베이스 서버에 저장하는 개념이다. ‘휘발성’은 순간적으로 전파돼야 하고 서버에서 영구하게 보존될 필요는 없는 개념으로, 주로 게임 내 이벤트 등이며 게임서버에서 처리된다.

 

먼저 <듀랑고> 개발진은 서비스를 멈추지 않고 확장과 축소가 가능한 커치베이스(Couchbase)를 데이터서버로 선택해 ‘무중단 확장과 축소’를 구현했다.

 



MMO의 서버를 구성하는 두 가지 방식, 지역분할과 채널링.

  

 

(3) ‘시야’와 ‘고스트’ 개념의 도입으로 분산서버 동기화를 이루다


유저들이 피부로 느끼게 될 게임 속 상황과 이벤트를 맡을 게임서버는 오픈월드 MMORPG의 핵심이다. 보통 지역분할이나 채널링 방식을 사용하기도 하지만, <듀랑고>를 위해서는 새로운 고민이 필요했다. 답은 간단했다. 똑똑하고 효율적으로 교신하는 분산서버만으로 서버를 구성하는 것이다.

 

게임 속 상호작용을 하나의 서버에서 처리하는 게 효율적인 것은 맞는데, 여러 서버에서 처리한다고 해서 상호작용이 깨지진 않는다는 발상이다. 게다가 <듀랑고>는 모바일게임. 이흥섭 프로그래머는 “(분산)서버 간 통신이 무선통신보다 빠르다”며 현실적인 환경의 특수성도 고려했다고 말했다

 

한마디로 모바일 플랫폼의 유저보다 분산서버가 더 빠르게 교신함으로써 유저는 심리스 환경에서 계속 게임을 하고 있다고 느끼게 된다는 것이다.

 

<듀랑고>에서 유저는 주변 아홉 칸을 자신의 시야로 사용하게 된다.

 

 

똑똑한 게임서버를 위해 ‘시야’의 개념을 도입한 것도 눈길을 끈다. <듀랑고>에서 유저는 사각형으로 구분된 주변의 아홉 칸을 자신의 시야로 사용하게 된다. 이 유저들의 시야가 모여 해당 게임서버의 시야가 되는데, 각 서버의 시야에서 겹치는 곳이 있다면 동기화가 이루어지고, 없다면 동기화 메시지는 모두 버려진다. 이 ‘시야’의 개념은 분산서버끼리 꼭 필요한 통신만 하도록 유도하는 역할을 한다

 

플레이 중인 각 유저의 시야 정보가 모여 해당 게임서버의 시야가 된다.

 

 

A B 서버의 시야가 겹칠 경우 서로 동기화가 이루어진다. 없다면 동기화도 필요없다.

 

 

이제 각 게임서버는 스스로 감당할 수 있는 개체 정보만 처리하면 되게 됐다. 아무도 없는 지역은 어떤 서버에서도 처리하지 않는다. 물론, 처리할 범위 자체가 넓어지면 서비스 성능이 떨어질 수도 있다. 이를 보완하기 위해 로그인서버를 도입, 유저가 접속할 때 어느 지역으로 갈지 미리 서버에 알려주도록 했다. 게임서버는 늘어나는 즉시 부하가 1/n로 줄어들게 된다.

 

각 분산서버의 처리 범위를 좁히기 위해 <듀랑고>에는 로그인서버가 적용돼 있다.

 

 

또 하나 신경 쓸 부분은 ‘개체 간 상호작용’이다. <듀랑고>에서는 특정 개체들의 시야가 겹칠 때, 이를 서로 다른 서버에서 관리하게 되는 경우가 생긴다. 이 처리를 매끄럽게 하기 위해 ‘고스트’라는 가상 개체를 도입했다. 불필요한 통신을 줄이고 서버 분산처리의 동기화가 잘 이루어지도록 하기 위한 선택이다. 고스트란, 예를 들어 A B를 공격하면 B의 본체와 고스트가 이를 함께 맞는 개념이다.

 

중앙서버 없이 분산서버로만 구성되는 <듀랑고>에서 서버의 추가는 부하의 1/n 감소로 이어진다.

 

 

 

[결론“기틀은 마련죽지 않고 흥하는 서버를 만들어 보겠다”

 

이흥섭 프로그래머는 <듀랑고> 서버 기술의 현주소를 솔직하게 평가하며 강연을 마무리했다. 현재 <듀랑고>의 서버는 모두가 서로서로 긴밀한 동기화가 이루어지고 있다. SPOF, 즉 구멍으로 작용할 수 있는 중앙처리 서버는 따로 없다. 부분적 장애는 허용되며, 서비스를 중단하지 않고 서버의 확장과 축소가 가능하다.

 

다만, 아직 근본적인 목표인 높은 가용성과 신축성 면에서는 보완이 필요한 상황이다. 그는 “기틀은 마련했다고 생각한다. 죽지 않고 흥하는 서버를 만들어 <야생의 땅: 듀랑고>를 쾌적하게 즐기실 수 있도록 노력하겠다”고 말했다.

 


현재 구현돼 있는 <듀랑고>의 서버 구조도. 중앙서버가 없이 로그인서버와 (분산)게임서버로만 작동한다.

 

 

최신목록 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10