요약 : 나다 미안하다 기술적한계다 열심히할게 고마워 기다려 뿅

디아블로 2: 부활한 이후, 우리는 여러 서버 문제를 경험해 왔고, 이러한 문제를 일으키는 원인과 그것들을 해결하기 위해 우리가 지금까지 취해온 조치들에 대한 투명성을 제공하고 싶었습니다. 또한 저희가 앞으로 어떻게 나아가고 있는지에 대한 통찰력을 드리고자 합니다.

tl;dr: 서버 중단은 단 하나의 문제로 발생한 것이 아닙니다. 문제 발생 시마다 해결 완화 및 장기적인 아키텍처 변경으로 문제를 해결하고 있습니다. 소수의 플레이어에서 캐릭터 진행 손실이 발생했습니다. 앞으로 이동하면 서버 충돌로 인한 손실은 몇 분으로 제한됩니다. 이것은 우리에게 완전한 해결책은 아니며, 우리는 이 문제를 계속 연구하고 있습니다. 우리 팀은 블리자드의 다른 팀원들의 도움을 받아 모두에게 좋은 경험을 선사하기 위해 노력하고 있습니다.

엔지니어링 세부 사항에 대해 조금 더 자세히 설명하겠습니다. 하지만 전체적으로 이러한 문제가 왜 발생했는지, 그리고 각 인스턴스를 해결하기 위해 무엇을 했는지, 전반적인 근본 원인을 조사하는 방법을 이해하는데 도움이 되기를 바랍니다. 처음부터 시작해보죠.

서버의 문제는 다음과 같습니다.

문제에 대해 얘기하기 전에 서버 데이터베이스의 작동 방식에 대해 몇 가지 상황을 간략히 설명하겠습니다. 첫째, 우리의 글로벌 데이터베이스가 있습니다. 이 데이터베이스는 여러분의 모든 캐릭터 정보와 진보를 위한 하나의 진실의 원천으로 존재합니다. 상상하실 수 있듯이, 이는 하나의 데이터베이스에게는 큰 작업이며, 그 자체로는 대처할 수 없습니다. 따라서 각 지역의 글로벌 데이터베이스에서 로드 및 대기 시간을 줄일 수 있습니다.NA, EU 및 아시아에는 캐릭터의 정보와 진행 상황도 저장하는 개별 데이터베이스가 있으며, 해당 지역의 데이터베이스는 주기적으로 글로벌 데이터베이스에 기록됩니다. 게임 내 액션의 대부분은 속도가 더 빠르고 캐릭터가 개별 캐릭터 레코드의 무결성을 유지하기 위해 해당 지역에서 "잠금"되기 때문에 이 데이터베이스에 대해 수행됩니다. 글로벌 데이터베이스에는 주 오류가 발생할 경우를 대비한 백업도 있습니다.

이 점을 염두에 두고, 무슨 일이 일어나고 있는지 설명하기 위해, 우리는 10월 9일 토요일부터 지금까지의 다운타임에 초점을 맞출 것입니다.

태평양 표준시 토요일 아침, 우리는 갑작스러운, 엄청난 트래픽 급증으로 인해 전 세계적인 정전을 겪었습니다. 이것은 우리 서버들이 전혀 경험하지 못한 새로운 한계점이었고, 심지어 시작 당시에도 경험하지 못했던 것이었습니다. 이러한 상황은 전날 게임 제작과 관련한 성능 향상을 위해 배포한 업데이트로 인해 더욱 악화되었습니다. 이 두 가지 요인이 결합되어 글로벌 데이터베이스가 오버로드되어 시간이 초과되었습니다. 우리는 이전에 배포했던 금요일 업데이트를 철회하기로 결정했습니다. 이렇게 하면 일요일로 이어지는 서버의 작업량이 줄어들면서 근본 원인을 더 자세히 조사할 수 있는 공간이 마련될 것으로 기대했습니다.

하지만 일요일에는 토요일에 한 일이 충분하지 않다는 것이 분명해졌습니다. 교통량이 훨씬 더 증가하여 또 다른 정전이 발생했습니다. 우리의 게임 서버는 데이터베이스와의 연결 단절을 관찰했고 즉시 다시 연결을 반복했습니다. 즉, 데이터베이스는 게임 서버의 지속적인 연결 시도를 처리하느라 너무 바빠서 우리가 완료했던 작업을 따라잡을 시간이 없었습니다. 또한 이 기간 동안 데이터베이스 이벤트 로깅의 구성을 개선할 수 있다는 것을 알게 되어 데이터베이스 장애 시 정상 상태를 복원하는 데 필요한 구성 작업을 완료하고 추가 근본 원인 분석에 착수했습니다.

일요일 정전 사태의 양날의 칼은 토요일에 우리가 대처했던 일들 때문에, 우리는 그것으로부터 어떻게 빨리 회복할 수 있는지에 대한 기본적인 극본을 만들었다는 것입니다. 잘 됐네요.

하지만 우리는 수십만개의 게임을 수십분 안에 플레이어의 활동이 최고조에 달했을 때 다시 온라인에 빠르게 접속했기 때문에, 우리는 다시 넘어졌습니다. 안 좋았어요.

따라서 백업 글로벌 데이터베이스에 구현한 구성 및 코드 개선 사항 등 구현해야 할 많은 수정 사항이 있었습니다. 이것이 10월 11일 월요일로 이어집니다. 그때 우리는 글로벌 데이터베이스를 전환했습니다. 이로 인해 백업 데이터베이스가 백업 프로세스를 잘못 실행하면서 또 다른 운영 중단이 발생했습니다. 즉, 서버의 요청을 처리하는 데 대부분의 시간을 다른 데이터베이스에서 복사하는 데 소비했습니다. 이 기간 동안, 우리는 추가적인 문제를 발견했고, 추가적인 개선을 이루어냈습니다. 데이터베이스에서 완전히 제거할 수 있지만 세금이 부과되지 않는 쿼리를 발견했고, 플레이어가 게임에 참여할 때 적격성 검사를 최적화하여 부하를 더욱 줄여주었으며, 테스트 성능도 더욱 향상되었습니다. 또한 화요일에는 데이터 베이스 재연결 스톰이 발생하지 않았기 때문에 이를 해결했다고 생각합니다.

그 후 화요일, 우리는 한 지역에서만 수십만 명의 플레이어와 동시에 높은 플레이어를 기록했습니다. 이로 인해 데이터베이스 엔지니어가 현재 연구하고 있는 데이터베이스 성능 저하 문제가 또 발생했습니다.또한 저희 팀이 핵심 서버 문제에 집중함에 따라 블리자드 주변의 다른 엔지니어들에게도 연락하여 소규모 수정 작업을 수행했으며, 타사 파트너에게도 도움을 요청했습니다.

왜 이런 일이 일어나는지요?

원본 게임에 충실하기 위해, 우리는 많은 레거시 코드를 보관했습니다. 그러나 특히 한 레거시 서비스는 현대적인 플레이어 행동을 따라잡기 위해 애쓰고 있습니다.

이 서비스는 원본에서 일부 업그레이드된 게임 기능, 즉 게임 생성/조인, 게임 목록 업데이트/읽기/필터링, 게임 서버 상태 확인, 데이터베이스에서 캐릭터 읽기 등의 중요한 기능을 처리하여 캐릭터가 필터링하는 모든 작업에 참여할 수 있도록 보장합니다. 중요한 것은, 이 서비스는 싱글톤이라는 것입니다. 즉, 모든 플레이어가 항상 가장 최신의 올바른 게임 목록을 볼 수 있도록 하기 위해 이 서비스의 인스턴스를 하나만 실행할 수 있다는 것입니다. 우리는 좀 더 현대적인 기술에 맞추기 위해 이 서비스를 여러 가지 방법으로 최적화했습니다. 하지만 앞서 언급했듯이, 우리의 많은 문제들은 게임 제작에서 비롯됩니다.

우리는 "현대 플레이어의 행동"을 언급합니다. 왜냐하면 그것은 생각해 볼 흥미로운 점이기 때문입니다. 2001년 인터넷에는 디아블로 II를 "정확하게" 재생하는 방법에 대한 콘텐츠가 거의 없었습니다(Vaal은 XP용, Pindleskin/Ancient Sewers/등 마법 찾기용으로 실행됨). 하지만, 오늘날, 새로운 플레이어는 게임을 하는 방법을 다양한 방법으로 가르쳐 줄 수 있는 놀라운 콘텐츠 제작자를 얼마든지 찾아볼 수 있습니다. 그들 중 다수는 빠르게 게임을 만들고, 로딩하고, 파괴하는 형태의 많은 데이터베이스 로드를 포함합니다. 플레이어들이 새로운 서버에서 새로운 캐릭터를 만들고 마법의 발견 아이템을 얻기 위해 열심히 노력하는 가운데, 베타 테스트에서 얻을 수 있는 범위를 크게 과소평가했습니다.

또한 전체적으로 글로벌 데이터베이스에 너무 자주 저장했습니다. 우리처럼 자주 이럴 필요는 없어요. 실제로 귀하를 지역 데이터베이스에 저장해야 하며, 글로벌 데이터베이스에 저장해야 합니다. 이는 NAT이 시행한 완화 조치 중 하나입니다. 현재 이 작업을 수행하는 방식을 완전히 바꾸기 위해 코드를 작성하고 있습니다. 따라서 글로벌 데이터베이스에 거의 저장하지 않을 것입니다. 따라서 서버의 작업량이 상당히 줄어들 것입니다. 그러나 이는 구축, 테스트 및 구현에 시간이 걸리는 아키텍처 재설계입니다.

진행률 손실에 대한 참고 사항입니다.

일부 플레이어가 경험한 진행 손실은 지역 및 전역 데이터베이스에서 문자 잠금을 수행하는 방식 때문입니다. 사용자가 특정 지역에 할당될 때 글로벌 데이터베이스에서 사용자의 캐릭터를 잠급니다(예: 미국 지역에서 플레이할 경우 캐릭터가 미국 지역에 잠겨 대부분의 작업이 미국 지역의 da에서 해결됨).타바세(tabase).

문제는 서버가 다운되는 동안 데이터베이스가 다운될 때 수많은 문자가 지역 데이터베이스에 저장되었고, 글로벌 데이터베이스로 이동할 방법이 없었습니다. 그 당시에는 두 가지 옵션이 있다고 믿었습니다. 글로벌 데이터베이스에서 저장되지 않은 변경 사항으로 모든 사용자의 잠금을 해제하여 글로벌 데이터베이스에서 발생하는 덮어쓰기로 인해 일부 진행률이 저하되거나, 게임을 일정 시간 동안 완전히 종료하고 글로벌 데이터베이스에 지역 데이터를 기록하기 위한 스크립트를 실행합니다.

그 당시에 우리는 전자에 따라 행동했습니다. 데이터를 복구하기 위해 오랜 시간 동안 게임을 중단하는 것보다 사람들이 게임을 계속 할 수 있도록 하는 것이 더 중요하다고 느꼈습니다. 중요한 진행 상황이나 귀중한 아이템을 잃어버리신 선수 여러분께 깊이 사과드립니다. 플레이어로서 우리는 롤백의 아픔을 잘 알고 있으며, 깊이 느끼고 있습니다.

앞으로, 우리는 심각한 데이터 손실로 이어지지 않는 문자를 복원할 수 있는 방법이 있다고 믿습니다. 서버 충돌 시 몇 분 정도의 손실로 제한되어야 합니다.

이것은 더 낫지만, 여전히 우리 눈에는 충분하지 않습니다.

어떻게 해야 할까요?

속도 제한: 게임 제작 및 참여와 관련된 작업 수를 데이터베이스로 제한하고 있으며, 많은 분들이 이를 느끼고 있다는 것을 알고 있습니다. 예를 들어, Pindleskin run을 하는 분들을 위해, 게임을 들락날락하고 20초 안에 새로운 게임을 만들 수 있습니다. 이 경우 한 시점에서 요금이 제한됩니다. 이 경우 게임 서버와 통신하는 데 문제가 있다는 오류 메시지가 표시됩니다. 이 오류는 게임 서버가 다운되었다는 표시가 아닙니다. 게임을 계속 실행하기 위해 데이터베이스에 일시적으로 부하를 줄이기 위해 속도가 제한되었다는 의미입니다. 이는 현재로서는 완화일 뿐이며 장기적인 해결책으로 볼 수는 없습니다.

로그인 대기열 생성: 지난 주말은 같은 문제가 아니라 일련의 문제였습니다. 플레이어 기반 활성화, 여러 플랫폼의 추가 및 확장과 관련된 기타 문제로 인해 작은 문제가 계속 발생할 수 있습니다.이러한 문제를 신속하게 진단하고 해결하기 위해서는 다수의 플레이어가 동시에 로그인하도록 해야 합니다. 이 문제를 해결하기 위해, 월드 오브 워크래프트에서 경험했던 것과 같은 로그인 대기열을 작업하는 사람들이 있습니다. 이렇게 하면 인구가 그 당시 우리가 가지고 있는 안전한 수준으로 유지될 수 있기 때문에, 우리는 시스템이 어디에 스트레스를 받고 있는지 감시하고 게임을 완전히 중단시키기 전에 문제를 해결할 수 있습니다. 우리가 변종을 고칠 때마다 인구 한도를 늘릴 수 있을 거예요. 이 로그인 대기열은 이미 백엔드에서 부분적으로 구현되었으며(현재 클라이언트의 인증 실패처럼 보이므로) 향후 며칠 내에 PC에 완전히 배포되어야 하며 이후 콘솔도 함께 배포되어야 합니다.

중요한 기능을 소규모 서비스로 분리: 이 작업은 하루도 안 되어(일부는 이번 주에 이미 완료됨) 해결할 수 있는 문제와 새로운 마이크로 서비스(예: 게임 목록 서비스)와 같은 대규모 프로젝트를 위해 부분적으로 진행 중입니다.중요한 기능이 고장나면 게임 관리 서비스를 확장할 수 있습니다. 그러면 작업량이 줄어듭니다.

우리는 D2R 팀뿐만 아니라 블리자드 전역에서 실시간으로 사고를 관리하고 문제를 진단하고 수정 사항을 구현하기 위해 매우 열심히 일하고 있습니다. 이 게임은 우리 모두에게 큰 의미가 있어요. 이 팀의 많은 사람들은 평생 D2 선수입니다. 우리는 2000년에 처음 출시되었을 때 뛰었고, 일부는 개조 커뮤니티의 일부였습니다. 저희는 개발자로서 뿐만 아니라, 우리 스스로도 커뮤니티의 구성원으로서 게임 경험이 만족스럽게 느껴질 때까지 계속 일할 수 있을 것이라고 장담할 수 있습니다.

계속해서 디아블로 II: 부활된 포럼 274에 피드백을 제출하고 버그 보고서 포럼 83에 버그를 보고하며 문제 해결을 위해 기술 지원 포럼 44를 방문하십시오. 모든 채널에 걸쳐 지속적으로 저희와 소통해 주셔서 감사합니다. 이러한 문제에 대해 노력하는 저희에게는 매우 소중한 자료입니다.

디아블로 커뮤니티 팀이 포럼을 통해 진행 상황을 계속 알려드릴 것입니다.

디아블로 II: 부활한 개발팀입니다