커뮤니티 여러분, 안녕하세요. 디아블로 II: 레저렉션이 출시된 이후 여러 서버 문제가 발생했고, 이번 게시물을 통해 서버 문제가 발생하는 원인과 이를 해소하기 위해 현재까지 진행한 개선 작업, 그리고 향후 개선 계획을 투명하게 말씀드리려 합니다.
요약: 서버 문제의 원인은 어느 한 가지 문제에 국한된 것이 아니며, 각 문제가 발생할 때마다 단기적인 완화 조치와 장기적인 설계 변경을 통해 해결하고 있습니다. 몇몇 플레이어 분들이 캐릭터 진척도를 잃는 현상이 발생했고, 향후에는 서버 문제로 인한 손실이 발생하더라도 손실되는 진척도는 수 분 내의 진척도로 한정될 것입니다. 이는 완전한 해결 방안은 아니기에, 해결 및 개선을 위한 작업을 이어 나가고 있습니다. 개발팀에서는 블리자드 내 여러 부서와 함께 모든 플레이어 분들께 좋은 게임플레이 경험을 제공하기 위해 노력하고 있습니다.
이번 게시물에서는 엔지니어링과 관련하여 다소 심도 있는 내용을 소개해 드릴 예정이지만, 이를 통해 서버 문제가 발생하는 원인과 각 원인을 해소하기 위한 방안, 그리고 전반적인 근본 원인을 조사하는 과정을 이해하는 데 도움이 되길 바랍니다. 먼저 첫 번째 주제부터 시작하겠습니다.
서버와 관련된 문제
서버 문제에 대해 말씀드리기에 앞서 저희 서버 데이터베이스의 작동 방식에 대해 짧게 소개해 드리겠습니다. 첫 번째로, 저희 글로벌 데이터베이스는 모든 캐릭터 정보와 진척도에 대한 단일 정보 저장소 (Single Source of Truth, SSOT) 의 역할을 수행합니다. 짐작할 수 있듯, 이는 단일 데이터베이스에게는 큰 작업이기에, 혼자서는 처리할 수 없습니다. 따라서 글로벌 데이터베이스의 부하와 지연 시간을 해소하기 위해 각 지역, 즉 북아메리카, 유럽, 아시아에도 캐릭터의 정보와 진척도를 저장하는 개별 데이터베이스가 존재하며, 해당 지역의 데이터베이스가 일정 주기마다 글로벌 데이터베이스에 해당 정보를 기록합니다. 대부분의 게임 내 캐릭터 행동은 속도가 더 빠른 해당 지역 데이터베이스를 통해 수행되며, 각 캐릭터 기록의 무결성을 확보하기 위해 플레이어의 캐릭터는 지역 데이터베이스에 “잠기게” 됩니다. 주 데이터베이스가 실패했을 경우를 대비하여 글로벌 데이터베이스에는 백업도 존재합니다.
위 내용을 기반으로, 지난 10월 9일 토요일 (태평양 표준시 기준)부터 지금까지 발생했던 서버 문제를 집중적으로 살펴보며 어떤 상황이 발생한 것인지 말씀드리겠습니다.
태평양 표준시 기준 토요일 아침(한국 표준시 기준, 저녁시간)에 예상치 못한 큰 규모의 접속량 증가(특히 한국지역)로 인해 전 지역의 서버 작동 중단이 발생했습니다. 이 증가량은 그간 저희 서버에서 겪지 못했던 수준의 한계치였고, 출시 시점에서조차 발생하지 않았던 수치였습니다. 추가로, 게임 생성 관련 성능을 향상하기 위해 하루 전 적용된 업데이트 또한 악영향을 주었습니다. 이 두 가지 요인이 맞물리며 글로벌 데이터베이스에 과부하가 발생했고, 이는 응답 시간 초과로 이어졌습니다. 저희는 일요일까지 이어지는 기간 동안 서버의 부하를 줄이면서 근본 원인을 더 깊게 파악할 시간을 확보하기 위해 금요일에 적용했던 업데이트를 되돌리기로 결정했습니다.
하지만, 일요일이 되자 토요일에 진행했던 작업만으로는 부족했다는 사실이 드러났습니다. 접속량이 더 크게 증가했고, 또다시 서버 작동 중단이 발생했습니다. 게임 서버는 데이터베이스와의 접속이 끊기자 즉시 재접속을 반복하여 시도했고, 데이터베이스는 이처럼 끊임없이 이어지는 게임 서버의 접속 시도를 처리하는 과정에서 과부하가 발생하며 이전보다 처리량이 낮아지게 되었습니다. 이 기간 중, 저희는 데이터베이스 이벤트 로깅 설정을 개선하는 것이 데이터베이스 오류 발생 시 정상적인 상태로 복구하는 과정에 필수적이라 판단하여 개선 사항을 적용하였고, 이 이벤트 로그를 통해 추가적인 장애 원인 분석을 진행 하게 되었습니다 .
일요일에 발생했던 서버 중단은 양날의 검과 같았습니다. 먼저 좋은 측면은, 토요일에 발생했던 문제 덕분에 향후 이를 복구하는 과정에 핵심적인 역할을 하는 방안을 적용했다는 점이었습니다.
하지만, 수십 분 새에 수십만 개의 게임이 만들어지며 플레이어 활동이 최고치에 달한 상태에서 서버가 빠르게 다시 열리자 또다시 서버 중단 문제가 발생하고 말았습니다.
따라서 설정 및 코드 관련 개선을 포함한 많은 수정 사항을 적용해야 했고, 먼저 백업 글로벌 데이터베이스에 이를 적용했습니다. 10월 11일 월요일에 글로벌 데이터베이스를 스위치 하는 작업을 진행했지만 , 이로 인해 또다시 서버 중단이 발생했습니다. 백업 데이터베이스가 백업 프로세스를 계속 실행하는 오류가 발생하며, 대부분의 시간을 서버로부터 들어온 요청을 처리하는 대신 다른 데이터베이스의 정보를 복사하려 시도하는 데 사용한 것입니다. 이 시간 동안 저희는 추가적인 문제를 발견할 수 있었고, 개선 사항을 적용했습니다. 데이터베이스에서 완전히 삭제할 수 있는 쿼리, 즉 이전에 중단 명령을 내렸지만 계속 작동 중인 쿼리 를 찾아냈고, 플레이어가 게임에 참가할 때의 확인 과정을 최적화하여 부하를 더욱 줄였으며, 그 외에도 테스트 과정에서 추가로 성능 개선 사항을 적용했습니다. 이전에 발생했던 과도한 데이터베이스 재접속 요청 문제 또한 화요일에는 더 이상 발생하지 않은 것으로 보아, 해당 문제는 수정이 완료되었다 판단하고 있습니다.
화요일에는 한국 지역에서의 폭발적인 유저 증가로 동시접속자 수가 또다시 최고치를 기록했습니다. 이 때문에 데이터베이스 성능이 하락하는 문제가 다시 발생했고, 현재 저희 데이터베이스 엔지니어들이 해당 문제의 원인을 파악하고 해결하기 위한 작업을 진행 중입니다. 저희 팀이 핵심적인 서버 문제 해결에 집중하고 있기에, 블리자드 내 다른 엔지니어들의 도움으로 소규모 수정 작업을 진행하고 있으며, 타사 파트너와도 연락을 취해 도움을 요청했습니다.
서버 문제가 발생하는 원인
저희는 원작을 충실히 반영하기 위해 기존 코드의 많은 부분을 그대로 유지했습니다. 하지만, 기존 서비스 중 오늘날의 플레이어 행동에 부합하지 못하는 서비스가 한 가지 존재합니다.
원작에서 일부 업그레이드된 이 서비스는 게임 내 기능의 중추적인 요소를 담당하는데요. 게임 생성/참가, 게임 목록 업데이트/불러오기/분류, 게임 서버 상황 검증, 그리고 캐릭터가 사용 중인 분류에 맞는 게임에 참가할 수 있도록 데이터베이스로부터 캐릭터를 읽어오는 작업 등이 이에 포함됩니다. 무엇보다도 이 서비스는 단일 개체(Singleton)이기에, 모든 플레이어들이 게임 목록을 확인할 때 가장 최신이자 올바른 게임 목록이 표시되도록 처리하는 과정에서 한 번에 하나의 인스턴스로만 구동됩니다. 해당 서비스가 최신 기술에 더 잘 부합하도록 여러 측면에서 최적화를 진행하긴 했지만, 이전에 말씀드린 것처럼 여전히 많은 문제가 게임 생성에서 비롯되고 있습니다.
앞서 "오늘날의 플레이어 행동"을 언급했는데요, 이는 여러 측면에서 흥미로운 주제이기 때문입니다. 2001년 당시에는 인터넷 상에 디아블로 II를 플레이하는 “정석적인” 방식(경험치 획득을 위한 ‘바알런’, 아이템 획득을 위한 핀들스킨/고대 토굴 돌기 등)을 다루는 콘텐츠가 많지 않았습니다. 하지만, 오늘날에는 처음 게임을 플레이하는 플레이어들도 콘텐츠 크리에이터들을 통해 다양한 게임 플레이 방식을 손쉽게 접힐 수 있고, 그중 많은 행동 방식이 빠른 속도로 게임을 생성하고 불러온 뒤 완료하는 형태를 띠고 있기에 데이터베이스에 많은 부하가 발생하게 됩니다. 이처럼 새 서버에서 새 캐릭터를 생성한 후 아이템 확보를 위해 빠르게 사냥하는 플레이 방식을 예상하고는 있었지만, 베타 테스트를 통해 도출한 예상치보다 실제로 훨씬 높았습니다 .
또한, 글로벌 데이터베이스에 저장하는 빈도가 전반적으로 너무 높았고, 현재 수준처럼 글로벌 데이터베이스에 자주 저장해야 할 필요성은 없습니다. 캐릭터를 지역 데이터베이스에 저장해 두었다가 해당 캐릭터를 해제해야 할 때만 글로벌 데이터베이스에 저장하면 되기 때문이며, 이는 저희가 적용한 개선 사항 중 하나입니다. 현재 저희는 이 과정 전체를 변경하는 코드를 준비하고 있으며, 이 변화가 적용되면 글로벌 데이터베이스에 저장되는 상황이 거의 발생하지 않으므로 해당 서버에 가해지는 부하가 크게 감소할 것입니다. 하지만, 이는 설계를 새롭게 변경하는 작업이므로, 빌드를 완성하고, 테스트한 뒤, 실제 적용하는 과정에 충분한 시간이 필요합니다.
진척도 손실에 대해
몇몇 플레이어 분들의 캐릭터 진척도가 손실된 이유는 캐릭터가 지역 및 글로벌 데이터베이스 모두에 잠기는 방식 때문입니다. 특정 캐릭터가 지역에 배정되면 해당 캐릭터는 글로벌 데이터베이스에 잠기게 됩니다. 예를 들어, 미국 지역에서 플레이할 경우 해당 캐릭터는 미국 지역에 잠기게 되며, 대부분의 행동은 미국 지역의 데이터베이스 상에서 처리됩니다.
하지만, 데이터베이스가 과부하 되어 서버가 중단된 동안 몇몇 캐릭터가 지역 데이터베이스에 고정된 채 남아 있었고, 이를 글로벌 데이터베이스로 옮겨올 방법이 없었습니다. 당시 저희가 선택할 수 있었던 선택지는 두 가지가 있었습니다. 첫 번째 선택지는 아직 변경 사항이 저장되지 않은 모든 캐릭터를 해제한 뒤 글로벌 데이터베이스로 가져오는 것이었고, 이 경우 글로벌 데이터베이스 상에서 덮어쓰기가 진행되므로 일부 반영되지 않은 진척도가 손실되는 것이었습니다. 두 번째 선택지는 게임 서버를 완전히 중단시킨 후 지역 데이터를 글로벌 데이터베이스에 덮어쓰는 스크립트를 실행하는 것이었지만, 이 과정에 어느 정도의 시간이 소요될 것인지 가늠할 수 없었습니다.
당시에는 긴 시간 동안 서버를 중단시킨 후 데이터를 복구하는 것보다는 서버를 연 상태로 유지하여 플레이어 분들께서 게임을 플레이하실 수 있도록 하는 것이 더 중요하다 판단했기에, 첫 번째 선택지를 따르게 되었습니다. 플레이어 분들과 마찬가지로, 저희 또한 이러한 서버 롤백이 얼마나 괴롭고 심대한 영향을 초래하는지 잘 알고 있으며, 일련의 과정에서 중요한 진척도나 가치 있는 아이템을 잃어버린 모든 분들께 진심으로 죄송합니다.
나아가서, 저희는 큰 규모의 데이터 손실 없이 캐릭터를 복구할 수 있는 방법을 마련했다고 판단하고 있습니다. 향후에는 서버 문제가 발생하여 데이터 손실이 발생하더라도 최대 수 분 내의 데이터 손실에 그칠 것입니다.
이러한 변화로 그 이전에 비해서는 개선됐지만, 여전히 만족스러운 수준은 아니라고 생각합니다.
향후 계획
빈도 제한: 현재 게임 생성 및 참가와 관련된 데이터베이스의 작업 횟수를 제한하고 있으며, 많은 분들께서 이미 이 변화를 체감하고 있다는 점을 잘 알고 있습니다. 예를 들어, 핀들스킨만 계속 반복하여 사냥할 경우, 게임에 참여해 사냥을 완료한 뒤 게임을 나온 후 새 게임을 생성하기까지 약 20초 내외로 소요되는데요. 이 시점에서 빈도 제한이 발생하게 되며, 게임 서버와 통신하는 도중 문제가 발생했다는 에러 메시지가 출력됩니다. 이 메시지는 해당 인스턴스에서 게임 서버가 중지되었다는 의미가 아니며, 데이터베이스 상에서 일시적으로 부하를 줄여 게임이 원활하게 돌아갈 수 있도록 빈도 제한이 걸렸다는 의미입니다. 이러한 조치는 문제를 완화하기 위한 단기적인 조치일 뿐, 장기적으로 문제를 수정하는 방안은 아니라는 점을 말씀드립니다.
로그인 대기열 생성: 지난 주말에 발생한 상황은 특정 문제가 반복적으로 발생한 것이 아닌, 각기 다른 여러 문제가 연속적으로 발생한 것입니다. 플레이어 수의 증가, 다양한 플랫폼의 추가, 그리고 확장성과 연관된 다른 문제 등으로 인해 앞으로도 작은 문제가 발생할 수도 있습니다. 이러한 문제들을 빠르게 파악하고 해결하기 위해, 저희는 “쏠림 현상 (Herding)”, 즉 수많은 플레이어들이 동시에 로그인을 시도하는 상황을 방지하려 합니다. 이를 위해, 월드 오브 워크래프트를 즐긴 분이라면 익숙하실 로그인 대기열 시스템을 준비하고 있습니다. 이 시스템이 적용되면 특정 시점의 접속자 수를 안전한 수준으로 유지하여, 시스템의 어느 요소에 부하가 가해지는지 확인하고 해당 부하로 인해 서버가 중지되기 전 미리 문제를 해결할 수 있을 것입니다. 문제가 되는 요소를 수정한 후에는 접속자 수 한도를 늘릴 수 있을 것입니다. 이 대기열 시스템은 이미 백엔드 상에서 부분적으로 적용되었으며 (현재 클라이언트 상에서는 인증이 실패한 것처럼 표시됩니다) 곧 PC를 시작으로 다른 콘솔에도 전체 시스템이 적용될 예정입니다.
여러 개의 기능을 담당하는 핵심 요소를 각각의 소규모 서비스로 분리하기: 현재 해당 작업 중 하루 내로 처리할 수 있는 작업은 부분적으로 진행 중이며, 그중 일부는 이번 주에 이미 작업을 완료했습니다. 새 마이크로서비스 등 더 큰 규모의 프로젝트 (예를 들어 GameList 서비스의 경우 플레이어에게 게임 목록을 제공하는 역할만 수행) 또한 진행할 예정입니다. 핵심 기능이 여러 개의 소규모 서비스로 분리하는 작업이 끝나는 시점에는 게임 관리 서비스의 확장성을 향상시켜 부하를 줄이는 방안을 살펴볼 예정입니다.
D2R 팀 뿐만 아니라 블리자드 전체에 걸쳐 많은 인원이 상황을 실시간으로 살펴보고, 문제를 진단하며, 수정 사항을 적용하기 위해 최선을 다하고 있습니다. 디아블로 II: 레저렉션은 저희 모두에게 큰 의미를 가지는 게임이며, 많은 팀원들이 오랫동안 디아블로 II를 즐긴 플레이어이기도 합니다. 2001년 디아블로 II의 출시 시점부터 게임을 즐겼거나, 모딩 커뮤니티에서 활동했던 경험이 있는 팀원도 있습니다. 단순히 개발자의 입장이 아닌, 플레이어와 디아블로 커뮤니티의 일원으로서 디아블로 II: 레저렉션의 경험이 정말 훌륭하게 느껴질 수 있도록 저희 모두 최선을 다해 개선해 나갈 것입니다.
개발팀에 전하고 싶은 피드백이 있다면 디아블로 II: 레저렉션 토론장에 남겨 주시기 바라며, 문제 해결 및 기술 지원이 필요하다면 기술 지원 게시판을 방문해 주세요. 여러 채널을 통해 소중한 의견을 남겨 주신 모든 분들께 진심으로 감사드립니다.
앞으로도 디아블로 커뮤니티 팀에서 진척 상황을 안내해드릴 예정입니다.
디아블로 II: 레저렉션 개발팀 드림