한국 시각 10월 15일(금) 디아블로2: 레저렉션에서 일어난 서버 중단 및 롤백의 이유와 대처 방법에 대한 내용이 담긴 개발팀의 노트가 북미 공식 홈페이지의 토론장을 통해 공개됐다.

우선 서버가 중단된 이유에 대해 출시 직후보다 훨씬 많은 트래픽이 몰려들며 글로벌 데이터베이스의 처리가 과부하되었고, 퍼포먼스 개선을 배포한 업데이트가 이를 악화 시켜 타임아웃 현상이 생겼다고 설명했다.

이후 여러 가지 시도를 했으나 글로벌 데이터베이스가 지속적인 오류를 일으켰고 문제가 되는 코드 등을 제거하는 등 조치를 했으며, 추가적인 해결을 위해 디아블로2: 레저렉션 팀 뿐 아니라 블리자드의 다른 팀, 서드 파티 파트너에도 도움을 요청해 개선 작업이 진행 중이라 밝혔다.

또한 문제가 되었던 진행도 손실, 즉 아이템 롤백 문제에 관해서는 "중요한 진행도나 귀중한 아이템을 잃어버린 플레이어분들께 깊이 사과드린다"고 전했고, 향후 서버 크래시가 일어나더라도 손실이 몇 분 분량 이내로 줄어들 예정이라 언급했다.

개발팀은 게임 생성 및 참가에 대한 제한, 로그인 대기열 추가, 게임의 중요한 기능을 작은 서비스로 세분화하는 등 근본적인 해결책을 찾기 위해 디아블로2: 레저렉션 팀뿐 아니라 블리자드 전체에 걸쳐서 노력 중이라 밝혔다.


※ 원문 : https://us.forums.blizzard.com/en/d2r/t/28164
※ 번역 과정에서 의역이나 오역이 있을 수 있습니다.

안녕하세요 여러분

디아블로2 레저렉션이 런칭된 후 여러 가지 서버 문제를 겪고 있고, 무엇 때문에 이런 문제가 일어나는지, 그리고 해결하기 위해 저희가 지금까지 조치한 내용을 투명하게 제공하려 합니다. 또한 저희가 어떻게 진행할 것인지에 대한 말씀을 드리려 합니다.


※ 요약

서버 중단은 한 가지 문제로 일어난 것이 아닙니다. 문제가 발생할 때마다 각 문제를 해결하고 있으며, 완화 및 장기적 아키텍처 변경을 하고 있습니다.

일부 플레이는 캐릭터 진행 손실을 경험하는데, 서버 크래시로 인한 손실은 몇 분 어치 내로 제한될 것입니다. 이는 완벽한 해답은 아니며, 지속해서 이 문제에 대해 작업하고 있습니다.

저희 팀과 저희를 돕는 블리자드의 다른 팀원들까지 도움을 받아 모두에게 좋은 경험을 드리기 위해 노력하고 있습니다.



여기서 공학적인 세부 사항에 대해 조금 더 자세히 소개하려 합니다. 전반적으로 이러한 중단이 왜 발생했는지, 그리고 각 인스턴스를 해결하기 위해 무엇을 조치했는지, 그리고 근본적인 문제에 대해 어떻게 조사하는지를 이해하는 데 도움이 되기를 바랍니다.


■ 서버에서 발생한 문제

이 문제에 말씀드리기 전에, 저희 서버 데이터베이스가 어떻게 작동하는 지에 대해 언급해야 할 듯합니다.

먼저, 모든 캐릭터 정보와 진행 상황을 위한 단일 소스를 가진 글로벌 데이터 베이스가 있습니다. 상상할 수 있듯이 하나의 데이터베이스로는 큰 태스크이며 스스로 다 처리하지는 못합니다.

따라서 글로벌 데이터베이스의 부하와 지연을 완화하기 위해 북미, 유럽, 아시아 지역 개개의 데이터베이스 또한 캐릭터의 정보와 진행도를 저장하고 있습니다.

대부분의 인게임 활동은 속도를 위해 지역 데이터베이스에 기록되며, 캐릭터의 무결성을 유지하기 위해 캐릭터가 "잠금"됩니다. 글로벌 데이터 베이스트는 주요 오류에 대처하기 위해 백업을 가지고 있습니다.

이 점을 바탕으로, 무슨 일이 일어나고 있는지 설명해 드리기 위해 저희는 10월 9일(북미) 토요일부터 지금까지의 서버 다운 시간을 집중적으로 설명할 것입니다.

태평양 표준시 기준 토요일 아침, 트래픽이 급격한 증가로 인해 갑작스러운 글로벌 서버 중단이 일어났습니다. 이는 저희 서버가 경험해보지 못한 임계값이었으며 출시 당시때보다 더 높았습니다.

이러한 상황은 전날 배포한 게임 게임 생성 관련 퍼포먼스 향상 업데이트로 인해 더욱 악화되었습니다. 이 2가지 요소가 결합하여 글로벌 데이터베이스를 과부하시켰고, 타임아웃 현상을 일으켰습니다.

저희는 서버의 부하를 줄인 후 일요일에 근본적인 원인을 깊게 조사할 시간을 마련할 수 있길 바라며 전날 배포한 업데이트를 롤백하기로 결정했습니다.

그러나 일요일이 되자 토요일에 한 일이 충분하지 않다는 것이 밝혀졌습니다. 저희는 더욱더 많은 트래픽 증가를 볼 수 있었고, 또 다른 중단을 일으켰습니다.

게임 서버들은 데이터베이스와의 연결 중단을 관찰하고 있었으며 즉시 재연결을 반복적으로 시도했습니다. 이는 데이터베이스가 게임 서버들에 의한 지속적 연결 시도 스트림을 다루느라 너무 바빠 저희가 작업한 것을 따라잡을 시간이 없었다는 걸 의미합니다.

이 시간 동안 저희는 데이터베이스 오류 상황에서 정상적인 상태로 회복하는 데 필수적인 데이터베이스 이벤트 로그의 설정 개선을 할 수 있을것이라 라 봤으며, 이를 완료한 후 더 근본적인 원인 분석에 착수했습니다.

일요일 중단 사태는 양날의 검이었는데, 토요일에 대처한 것들로 인해 문제에서 빠르게 복구할 방법을 위한 기본적인 각본을 만들 수 있었다는 점이 있었고 그건 좋았습니다.

그러나 온라인으로 돌아오자 빠르게 플레이어 활동이 최고조를 달성했으며, 어마어마한 양의 게임이 10분 안에 생성되었고 다시 오류가 발생했습니다. 이는 좋지 않았습니다.

따라서 저희는 설정과 코드 개선을 포함한 많은 수정을 백업 글로벌 데이터베이스에 배포해야 했습니다. 이는 태평양 표준시 10월 11일 월요일까지 이어졌습니다.

글로벌 데이터베이스와 전환했을 때 백업 데이터베이스가 백업 프로세스를 지속해서 잘못 실행하면서 다시 중단 상황이 일어났습니다. 이는 서버의 서비스 요청을 받아야 하는 데이터베이스가 다른 데이터베이스에서 복사를 시도하느라 대부분의 시간을 쓰고 있다는 것을 의미했습니다.

이 시간 동안 저희는 다른 문제를 발견했고, 추가 개선점을 찾았습니다.

저희는 사용되지 않지만 부하를 주는 쿼리를 찾았고 이를 데이터베이스에서 완전히 제거할 수 있었습니다. 또한 플레이어가 게임에 참가할 때 적격성 확인을 최적화해 부하를 줄일 수 있었습니다.

그리고 추가 퍼포먼스 개선도 되었습니다. 또한 데이터베이스 재연결 폭풍이 고쳐졌다고 생각되는데, 이 문제가 화요일에 발생하지 않았기 때문입니다.

이후 화요일, 어마어마한 양의 플레이어가 한 서버 단독으로 밀려들며 플레이어 최고점이 다시 발생했고, 이로 인해 현재 저희의 데이터베이스 엔지니어들이 작업하고 있는 데이터베이스 퍼포먼스 저하 문제를 일으켰습니다.

저희 팀이 서버 문제의 중요한 부분에 집중하는 동안 블리자드의 다른 엔지니어들이 작은 수정을 하도록 연락을 보냈고 서드 파티 파트너에게 또한 도움을 요청했습니다.


■ 이런 일이 발생한 이유

오리지널 게임에 충실하기 위해 많은 레거시 코드를 남겨뒀습니다. 그 중 특히 한 레거시 서비스는 현대의 플레이어 행동을 따라잡기 위해 분투하고 있습니다.

이 서비스는 오리지널에서 업그레이드된 것으로 게임 기능의 중요한 부분을 다룹니다. 게임 생성/참가, 게임 리스트 업데이트/읽기/필터, 게임 서버 상태 확인, 데이터베이스에서 캐릭터 읽어오기 등을 처리하여 여러분이 필터링한 것에 캐릭터가 참가할 수 있도록 하는 것입니다.

중요한 것은 이 서비스가 싱글톤이라는 것인데, 이는 저희가 모든 플레이어가 최신의 올바른 게임 목록을 항상 볼 수 있도록 하는 인스턴스를 단 하나 실행할 수 있다는 뜻입니다.

저희는 이 서비스에 현대적 기술을 적용하며 다양한 방법으로 최적화했는데, 그러나 앞서 말씀드렸듯 많은 문제는 게임 생성에 원인을 두고 있습니다.

"현대의 플레이어 행동"을 앞서 말씀드린 이유는, 이것이 생각해 볼 만한 흥미로운 주제이기 때문입니다.

2001년에는, 디아블로2를 "올바르게"(경험치를 위한 바알런, 아이템을 위한 핀들스킨/고대 하수도/기타 등등) 플레이하는 방법에 대한 콘텐츠가 인터넷상에 그렇게 많지 않았습니다.

그러나 신규 플레이어는 게임을 다른 방법으로 플레이할 수 있는 법을 알려주는 놀라운 콘텐츠 제작자들을 찾아볼 수 있으며, 이런 콘텐츠의 대부분은 빠르게 게임을 만들고, 로딩하고, 파괴하는 것을 반복해 많은 데이터베이스 부하를 유발합니다.

물론 저희는 플레이어가 새 서버에 새 캐릭터를 만들고 아이템을 얻기 위해 열심히 활동할 것을 예측했으나, 저희는 베타 테스트에서 얻은 결과를 과소평가했습니다.

또한, 전체적으로 저희는 글로벌 데이터베이스에 너무 자주 저장했습니다. 저희가 그랬던 것처럼 이렇게 자주 할 필요는 없습니다.

캐릭터는 지역 데이터베이스에 저장하고, 캐릭터를 잠금해야 할 때만 글로벌 데이터베이스에 저장해야 합니다. 이것이 저희가 시행 중인 조치 중 하나입니다.

지금 저희는 이 작업을 수행하는 방식을 완전히 바꾸기 위해 코드를 작성하고 있습니다. 따라서 글로벌 데이터베이스에는 거의 저장하지 않을 것이며 서버의 부하를 크게 줄일 수 있을 것입니다. 그러나 이는 아키텍처 재디자인인 만큼 빌드, 테스트, 구현까지 시간이 필요합니다.


■ 진행도 손실에 대한 노트

일부 플레이어들이 경험한 진행도 손실은 캐릭터가 지역과 글로벌 데이터베이스에서 잠금 될 때 생기는 문제입니다. 여러분이 특정 지역에 할당되면 글로벌 데이터베이스에서 캐릭터를 잠금 처리합니다. (예를 들어, US 지역에서 플레이한다면, 캐릭터는 US 지역에 잠금되고 대부분의 행동은 US 지역의 데이터베이스에서 이뤄집니다.)

문제는 데이터베이스에 오류가 일어나 서버가 중단되었을 때인데, 수많은 캐릭터가 지역 데이터베이스에 갇히고 이를 글로벌 데이터베이스로 가져올 방법이 없어집니다.

당시에는 2가지 선택이 있다고 생각했습니다. 변경점이 저장되지 않은 글로벌 테이터베이스에서 잠금을 해제하는 것으로, 글로벌 데이터베이스에서 덮어쓰며 진행이 일부 손실되는 방식입니다.

또는 게임을 완전히 다운시키고 예측하기 어려운 시간 동안 스크립트를 실행해 지역 데이터를 글로벌 데이터베이스로 작성하는 것입니다.

당시 저희는 전자를 선택했습니다. 데이터를 복구하기 위해 오랜 시간 동안 게임을 다운시키는 것 보다 사람들이 계속 게임을 할 수 있도록 하는 것이 중요하다고 생각했습니다.

저희는 중요한 진행도나 귀중한 아이템을 잃어버린 플레이어분들께 깊이 사과드립니다. 저희 또한 플레이어로서 롤백의 아픔을 잘 알고 있으며, 깊이 느끼고 있습니다.

앞으로, 저희는 중요한 데이터 손실로 이어지지 않는 캐릭터 복구 방법을 찾고 있습니다. 즉 서버 크래시가 일어나면 이로 인한 손실이 몇 분 어치 가량으로 제한될 것입니다.

이는 전보다 낫지만, 저희가 보기엔 아직 충분하지 않습니다.


■ 대처 방법에 대해

- 레이트 제한

게임 생성 및 참가에 대한 작업 수를 제한하고 있으며, 많은 분들이 이를 느끼셨을 것입니다.

예를 들어, 핀들스킨 런을 하면 게임에 입장하고 나간 후 새로운 방을 20초 안에 만들 수 있습니다. 이러한 상황에서 레이트 제한이 생기며, 서버와 통신에 문제가 있다는 에러 메시지가 출력됩니다.

여기서는 이 메시지가 서버가 닫혔다는 뜻이 아니며 다만 게임을 계속 진행시키기 위헤 데이터베이스의 부하를 일시적으로 줄이기 위해 레이트 제한에 걸렸다는 의미입니다.

이는 지금으로서는 완화일 뿐이며, 장기적인 해결책은 되지 않습니다.


- 로그인 대기열 생성

지난 주말은 여러 문제가 일어났으며 같은 문제가 반복되는 것이 아니었습니다. 플레이어 베이스 재활성화, 여러 플랫폼 추가, 스케일링과 관련된 기타 문제로 인해 작은 문제가 계속 일어났습니다.

이러한 문제를 신속하게 진단하고 해결하려면 많은 수의 플레이어가 동시에 멈춰 로그인하는 "Herding"을 하도록 해야 합니다. 이를 다루기 위해 여러분이 월드 오브 워크래프트에서 겪었던 것과 비슷한 로그인 대기열 현상을 겪을 것입니다.

이렇게 하면 인구가 당시 확보하고 있는 안전한 수준으로 유지되며, 따라서 저희는 시스템이 어디서 부담을 겪는지 모니터링할 수 있고 게임이 완전히 다운되기 전에 문제를 해결할 수 있습니다.

이러한 부담을 고칠 때마다, 인구 캡을 늘릴 수 있을 것입니다. 로그인 대기열은 백엔드에 부분적으로 구현되었으며 (지금은 클라이언트 인증 실패처럼 보입니다) 향후 며칠 내에 PC에 완전히 배포되도록 할 것이며 콘솔도 이후 적용됩니다.


- 중요한 기능을 작은 서비스로 세분화

이 작업은 한나절 동안에 다룰 수 있는 문제들(일부는 이미 이번 주에 완료)에 대해 부분적으로 진행 중입니다. 그리고 신규 마이크로 서비스(예를 들면 플레이어에게 게임 리스트를 제공하는 역할만 하는 GameList 서비스)와 같은 더 큰 프로젝트가 계획 중에 있습니다. 중요한 기능이 고장 나면, 저희는 게임 관리 서비스를 확장하여 부하의 양을 줄일 수 있습니다.

저희는 실시간으로 사고를 관리하고 문제를 진단하고 수정을 배포하기 위해 최선을 다하고 있으며, 이는 디아블로2: 레저렉션 팀 뿐 아니라, 블리자드에 걸쳐서 노력하고 있습니다.

이 게임은 저희에게 큰 의미가 있습니다. 팀에 있는 많은 사람들은 디아블로2의 평생 플레이어입니다. 2000년 출시 초기부터 플레이해왔고, 일부는 모드 커뮤니티의 일원이기도 했습니다.

저희는 개발자로서뿐 아니라 플레이어이자 커뮤니티 일원으로서 게임 경험이 좋게 느껴질 때까지 계속 작업할 것이라고 보장드립니다.