Skip to main content

Roblox 인프라의 효율성 및 탄력성 개선 방법

December 7, 2023

by Daniel Sturman, Chief Technology Officer; Max Ross, Vice President, Engineering; and Michael Wolf, Technical Director


테크

지난 16년에 걸친 Roblox의 성장에 따라 수천만 개의 몰입형 3D 공동 체험을 지원하는 기술 인프라의 규모와 복잡성도 증대되었습니다. Roblox가 지원하는 머신의 수는 2021년 6월 30일 기준 약 3만 6000대에서 오늘날 약 14만 5000대로 지난 2년간 3배 이상 증가했습니다. 전 세계 사용자들을 위해 이러한 상시 접속 환경을 지원하려면 1000가지 이상의 내부 서비스가 필요합니다. Roblox는 비용 및 네트워크 대기 시간을 줄이기 위해, 주로 온프레미스에서 실행되는 맞춤형 하이브리드 프라이빗 클라우드 인프라의 일부로서 이러한 머신을 배포하고 관리합니다.

Roblox의 인프라는 현재 Roblox 이코노미 기반 비즈니스를 운영하는 크리에이터를 포함해 전 세계 일일 활성 사용자 7000만 명 이상을 지원하고 있으며, 이들은 모두 매우 높은 수준의 안정성을 기대하고 있습니다. Roblox 체험의 몰입형 특성을 고려하면, 서비스 중단은 물론 지연이나 대기 시간에 대한 수용도는 극히 낮은 편이라 할 수 있습니다. Roblox는 사람들이 몰입형 3D 체험을 통해 연결되어 함께 모여 소통하는 플랫폼입니다. 몰입형 공간에서 아바타로 소통할 때면, 텍스트 소통이나 전화 회의 등에 비해 사소한 지연이나 결함이 더욱 크게 다가옵니다.

지난 2021년 10월, Roblox에서는 시스템 전반에 걸친 서비스 중단이 발생한 바 있습니다. 이는 한 데이터 센터의 컴포넌트 문제로 인해 작은 규모로 시작되었으나, 관련 조사 진행 중 문제가 급속히 확산되어 결국 73시간의 서비스 중단을 초래하게 되었습니다. 당시 Roblox는 문제에 대한 세부 사항 및 당시 문제를 통해 몇 가지 배운 점을 공유하기도 했습니다. 사건이 발생한 이후로, Roblox는 이러한 사항에 대해 연구하며 대규모 시스템에서 극심한 트래픽 급증, 날씨, 하드웨어 오류, 소프트웨어 버그, 심지어 인간 오류 등으로 인해 발생하는 오류에 대한 인프라의 탄력성을 높이기 위해 노력해 왔습니다. 그렇다면 오류 발생 시, 단일 컴포넌트 또는 컴포넌트 그룹의 문제가 전체 시스템으로 확산되지 않도록 하려면 어떻게 해야 할까요? 이 질문은 지난 2년 동안 Roblox의 주요 관심사였으며, 관련 진행 작업은 이미 성과를 보이고 있습니다. 예를 들어, 2023년 상반기에는 2022년 상반기에 비해 월간 1억 2500만 참여 시간을 절감했습니다. 이제 본 게시글을 통해 그간의 성과 및 보다 탄력적인 인프라 시스템을 구축하기 위한 장기적인 비전을 공유하고자 합니다.

안전장치 구축

대규모 인프라 시스템 내에서는 소규모의 오류가 하루에도 여러 번 발생합니다. 만약 한 기계에 문제가 있어 서비스를 중단해야 하는 경우 대부분의 회사는 백엔드 서비스의 여러 인스턴스를 유지 관리하므로 이에 대한 대처가 가능합니다. 따라서 단일 인스턴스가 실패하면 다른 인스턴스가 작업 부하를 떠맡게 됩니다. 이러한 빈번한 실패를 해결하기 위해 일반적으로 각 요청은 오류 발생 시 자동으로 재시도하도록 설정됩니다.

이는 시스템이나 사람들이 너무 공격적으로 재시도할 경우 성공하기가 어려워지며, 소규모 오류가 인프라 전반에 걸쳐 다른 서비스 및 시스템으로 전파되는 결과를 초래할 수 있습니다. 네트워크 또는 사용자가 지속적인 재시도를 감행할 경우, 결국 해당 서비스의 모든 인스턴스 및 기타 시스템이 전체적으로 오버로드될 수 있습니다. 2021년에 발생한 서비스 중단은 대규모 시스템에서 상당히 흔한 프로세스가 낳은 결과입니다. 작은 오류가 이내 시스템 전체에 전파되어 급속히 확산되므로 모든 것을 중단하기 전에는 해결이 어려운 것입니다.

서비스 중단 당시 Roblox는 하나의 활성 데이터 센터(그 내부 컴포넌트가 백업 역할을 하는)를 보유하고 있었습니다. 오류로 인해 기존의 데이터 센터 작동 중단 시, 수동으로 새 데이터 센터로 시스템을 대체 작동시킬 수 있는 능력이 필요했습니다. 이에 Roblox는 백업 배포를 보장하는 것을 최우선 목표로 삼고, 다른 지역에 위치한 새로운 데이터 센터에 백업을 구축했습니다. 이는 최악의 시나리오(서비스 중단이 데이터 센터 내의 컴포넌트로 충분히 확산되어 완전히 작동할 수 없게 되는 것)에 대한 보호 장치를 의미합니다. 이제 Roblox는 워크로드를 처리하는 하나의 데이터 센터(액티브)와 백업 역할을 하는 하나의 대기(패시브) 데이터 센터를 보유하게 되었습니다. 그리고 장기적으로 이러한 액티브·패시브 구성을 액티브·액티브 구성으로 전환하고자 합니다. 두 데이터 센터는 모두 워크로드를 처리하고 로드 밸런서는 대기 시간, 용량, 상태를 기준으로 두 데이터 센터 간에 요청을 분산합니다. 이것이 구현되면 Roblox의 전체적인 안정성이 더욱 개선될 것으로 예상되며, 장애 발생 시 몇 시간 후가 아닌 거의 즉시 대체 작동이 가능해집니다.

셀룰러 인프라로의 전환

다음 우선순위는 각 데이터 센터 내부에 강력한 방폭벽을 설치해 전체 데이터 센터의 고장 확률을 낮추는 것이었습니다. 셀(일부 회사에서는 클러스터라고 부름)은 본질적으로 일련의 머신이며 이를 이용하면 벽을 만들 수 있습니다. 중복성 추가를 위해 셀 내외에서 서비스를 복제하며, 궁극적으로 Roblox의 모든 서비스가 셀에서 실행되어 강력한 방폭벽과 중복성의 이점을 모두 누릴 수 있기를 바라고 있습니다. 셀이 더 이상 작동하지 않을 경우 안전하게 비활성화할 수 있으며, 셀 간 복제를 통해 셀이 복구되는 동안 서비스를 계속 실행할 수 있습니다. 어떤 경우에는 셀 복구가 셀의 완전한 재프로비저닝을 의미할 수도 있습니다. 업계 전반에서 개별 머신 또는 소규모 머신 세트를 지우고 다시 프로비저닝하는 것은 매우 일반적이지만, 최대 1400개의 머신을 아우르는 전체 셀에 대해 이 작업을 수행하는 것은 일반적이지 않은 일입니다.

이를 구현하기 위해서는 셀이 대체로 균일해야 하며, 워크로드를 한 셀에서 다른 셀로 빠르고 효율적으로 이동시키기 위함입니다. 또한 서비스가 셀에서 실행되기 전에 충족해야 하는 특정 요구 사항을 설정했습니다. 예를 들어 서비스는 컨테이너화되어야 하며, 이를 통해 이식성을 훌쩍 높이며 누구도 OS 수준에서 구성을 변경할 수 없도록 하고자 했습니다. 셀에 대해 코드형 인프라 철학을 채택하기도 했습니다. 소스 코드 저장소에 셀에 있는 모든 것에 대한 정의를 포함시켜, 자동화된 툴을 사용해 처음부터 신속하게 다시 구축할 수 있도록 했습니다.

현재 모든 서비스가 이러한 요구 사항을 충족하는 것은 아닙니다. 따라서 가능한 경우 서비스 소유자가 요구 사항을 충족할 수 있도록 노력하며, 준비가 되면 서비스를 셀로 쉽게 마이그레이션할 수 있는 새로운 툴을 구축했습니다. 예를 들어 새로운 배포 툴은 셀 전체에 걸쳐 서비스 배포를 자동으로 ‘스트라이핑’하므로 서비스 소유자는 복제 전략에 대해 생각할 필요가 없습니다. 이러한 높은 수준의 엄격함은 마이그레이션 프로세스를 훨씬 더 까다롭고 시간이 걸리게 만들지만 장기적인 보상으로 다음과 같은 결과를 얻게 됩니다.

  • 오류를 방지하고 다른 셀로의 확산을 막는 것이 훨씬 쉬워집니다.
  • 인프라 엔지니어가 더욱 효율적이며 빠르게 작업할 수 있습니다.
  • 궁극적으로 셀에 배포되는 제품 수준의 서비스 구축 엔지니어의 경우, 서비스가 어떤 셀에서 실행되는지 알아야 하거나 걱정할 필요가 없습니다.

더욱 큰 규모의 과제 해결

방화문이 불길을 막는 데 사용되는 방식과 유사하게, 셀은 인프라 내에서 강력한 방폭벽 역할을 하여 단일 셀 내에서 장애를 유발하는 모든 문제를 방지하는 데 도움을 줍니다. 결국 Roblox를 구성하는 모든 서비스는 셀 내부와 셀 간에 중복 배포될 예정입니다. 이 작업이 완료되면 오류 발생 시 해당 오류가 전체 셀의 작동을 멈추게끔 광범위하게 전파될 수는 있지만, 오류가 해당 셀 너머로 전파되는 것은 극히 어려워집니다. 또한 셀을 상호 교환 가능하게 만드는 데 성공할 경우, 다른 셀로 대체 작동을 진행하고 오류가 최종 사용자에게 영향을 미치지 않도록 할 수 있으므로 복구 속도가 훨씬 빨라질 것입니다.

이를 위해 극복해야 할 부분은 오류의 전파를 줄이기에 충분할 만큼 셀을 분리하는 동시에 성능 및 기능을 유지하는 것입니다. 복잡한 인프라 시스템에서 각 서비스는 쿼리, 정보, 작업 부하 등을 공유하기 위해 서로 통신해야 합니다. 서비스를 셀에 복제할 때는 교차 통신을 관리하는 방법에 대해 신중하게 고려해야 합니다. 이상적인 상황에서 우리는 트래픽을 하나의 비정상 셀에서 다른 건강한 셀로 리디렉션합니다. 하지만 셀을 건강하지 못하게 만드는 ‘죽음의 쿼리’는 어떻게 관리해야 할까요? 해당 쿼리를 다른 셀로 리디렉션할 경우, 원치 않는 방식으로 해당 셀이 비정상 상태가 될 수 있습니다. 우리는 셀을 건강하지 않게 만드는 트래픽을 감지하고 진압하는 동시에 건강하지 못한 셀에서 ‘양호한’ 트래픽을 전환하는 메커니즘을 찾아야 합니다.

단기적으로는 데이터 센터에 대한 대부분의 요청을 단일 셀에서 처리할 수 있도록 컴퓨팅 서비스의 복사본을 각 컴퓨팅 셀에 배포하는 작업을 진행했습니다. 또한 셀 전체에 걸쳐 트래픽을 로드 밸런싱하고 있습니다. 더 나아가서는 서비스 메시에서 활용할 차세대 서비스 검색 프로세스를 구축하기 시작했으며 이를 2024년에 완료할 예정입니다. 그 과정에서 대체 작동 셀에 부정적인 영향을 미치지 않는 경우에만 셀 간 통신을 허용하는 정교한 정책을 구현하게 됩니다. 또한 2024년에는 종속 요청을 동일한 셀의 서비스 버전으로 전달하는 방식을 구현할 예정입니다. 이를 통해 셀 간 트래픽을 최소화하고 셀 간 오류 전파 위험을 낮출 수 있습니다.

최고조에 달할 때 Roblox 백엔드 서비스 트래픽의 70% 이상은 셀 외부에서 제공되고 있으며, 셀 생성 방법에 대해서도 많은 성과가 있었습니다. 그러나 2024년 이후까지 서비스를 계속 마이그레이션하면서 더 많은 연구와 테스트가 진행될 것으로 예상됩니다. 상황이 진전됨에 따라 방폭벽은 점점 더 강력해질 것입니다.

상시 가동 인프라 마이그레이션

Roblox는 전 세계 사용자를 지원하는 글로벌 플랫폼이므로, 사용량이 많지 않은 시간이나 비가동 시간을 이용한 서비스 전환이 불가능합니다. 따라서 모든 머신을 셀로 마이그레이션하는 프로세스 및 해당 셀에서의 서비스 실행 작업은 결코 쉽지 않은 일입니다. Roblox는 각 머신 및 이를 지원하는 서비스를 전환하는 중에도 계속 지원해야 하는 수천만 개의 상시 구동 체험을 보유하고 있습니다. 본 프로세스를 시작했을 때는 미사용 중인 머신이나 이러한 워크로드를 마이그레이션할 수 있는 수천 대의 머신을 보유하고 있지 않았습니다.

그러나 향후 성장에 대한 예상에 따라 소수의 추가 머신 구매가 진행되었습니다. 그리고 해당 기계를 사용해 새 셀을 구축한 다음 워크로드를 해당 머신으로 마이그레이션했습니다. 효율성과 안정성을 최우선으로 고려해, ‘예비’ 머신이 부족할 때면 외부에서 더 많은 머신을 구입하는 대신 마이그레이션한 머신을 지우고 다시 프로비저닝해 더 많은 셀을 구축했습니다. 그런 다음 워크로드를 다시 프로비저닝된 머신으로 마이그레이션하고 프로세스를 처음부터 다시 시작했습니다. 본 프로세스는 꽤 복잡합니다. 머신이 교체되고 셀에 내장되기 때문에 이상적이고 질서정연한 방식으로 정리되지 않습니다. 또한 데이터 홀 전체에 걸쳐 물리적으로 단편화되어 있으므로 단편적인 방식의 프로비저닝이 필요합니다. 이를 위해서는 하드웨어 위치를 대규모의 물리적 장애 도메인에 맞춰 유지하기 위한 하드웨어 수준의 조각 모음 프로세스가 요구됩니다.

Roblox 인프라 엔지니어링의 특정 팀은 레거시 또는 ‘프리 셀’ 환경의 기존 워크로드를 셀로 마이그레이션하는 데 집중하고 있습니다. 이 작업은 수천 가지의 다양한 인프라 서비스와 수천 개의 백엔드 서비스를 새로 구축된 셀로 마이그레이션할 때까지 계속될 것입니다. 몇 가지 복잡한 요인으로 인해 이 작업은 내년 내내, 어쩌면 2025년까지도 계속해서 진행될 것으로 예상됩니다. 먼저, 이 작업을 수행하기 위해서는 뛰어난 툴이 필요합니다. 예를 들어 새로운 셀을 배포할 때 사용자에게 영향을 주지 않고 많은 서비스의 밸런스를 자동으로 재조정하는 도구가 필요합니다. 우리 인프라에 대한 가정을 바탕으로 구축된 서비스도 고려하고 있습니다. 셀로 전환하며 앞으로 바뀔 수 있는 것들에 의존하지 않도록 서비스의 수정도 이루어져야 합니다. 또한 셀룰러 아키텍처와 잘 작동하지 않는, 기존에 알려진 디자인 패턴을 검색하는 방법과 마이그레이션된 각 서비스에 대한 체계적인 테스트 프로세스를 모두 구현했습니다. 이러한 프로세스는 서비스가 셀과 호환되지 않아 발생하는 사용자 문제를 방지하는 데 도움이 됩니다.

현재 3만대에 가까운 머신이 셀에서 관리되고 있습니다. 이는 전체 시스템의 일부에 불과하지만, 지금까지는 플레이어에게 부정적인 영향을 주지 않고 매우 원활하게 전환되었습니다. 궁극적인 목표는 우리 시스템이 매월 99.99%의 사용자 가동 시간을 달성하는 것입니다. 이는 참여 시간의 0.01% 이상을 방해하지 않는다는 의미입니다. 업계 전반에 걸쳐 일어나는 가동 중지 시간을 완전히 없앨 수는 없겠지만, Roblox의 가동 중지 시간이 사용자에게 크게 다가오지 않을 정도로 줄이는 것이 최종 목표입니다.

확장에 따른 미래 보장

초기에 진행한 Roblox의 작업은 성공적인 것으로 입증되었지만 셀에 대한 작업은 아직 끝나지 않았습니다. 지속적인 서비스 확장에 따라 Roblox는 본 기술 및 기타 기술을 통해 시스템의 효율성과 탄력성을 개선하기 위해 계속 노력할 것입니다. 작업이 진행됨에 따라 플랫폼의 탄력성은 점점 더 개선될 것이며, 발생하는 모든 문제가 주는 영향력도 차차 줄어들 것입니다.

현재까지 이룬 것들을 간략히 정리하면 다음과 같습니다.

  • 두 번째 데이터 센터를 구축하고 성공적으로 액티브·패시브 상태를 달성했습니다.
  • 액티브 및 패시브 데이터 센터에 셀을 생성하고 백엔드 서비스 트래픽의 70% 이상을 셀로 성공적으로 마이그레이션했습니다.
  • 인프라의 나머지 부분을 계속 마이그레이션하며 모든 셀을 균일하게 유지하기 위해 따라야 할 요구 사항과 모범 사례를 설정했습니다.
  • 셀 사이에 더욱 강력한 ‘방폭벽’을 구축하는 지속적인 프로세스가 시작되었습니다.

셀의 상호 교환이 가능해지면 셀 간의 혼선이 줄어듭니다. 이는 모니터링, 문제 해결, 워크로드 자동 전환과 관련한 자동화 증대 측면에서 매우 흥미로운 기회를 열어 줍니다.

9월에는 데이터 센터 전반에 걸친 액티브·액티브 실험도 시작되었습니다. 이는 안정성을 높이고 대체 작동 시간을 최소화하기 위해 테스트 중인 또 다른 메커니즘입니다. 본 실험은 주로 데이터 액세스와 관련된 여러 시스템 설계 패턴을 식별하는 데 도움이 되었으며, 완전한 액티브·액티브를 향해 나아가기 위해서는 재작업이 필요합니다. 전반적으로 해당 실험은 제한된 수의 사용자로부터 발생하는 트래픽에 대해 실행할 만큼 충분히 성공적이었습니다.

Roblox는 플랫폼의 효율성과 탄력성을 높이기 위한 관련 작업을 계속해서 추진해 나갈 것입니다. 셀 및 액티브·액티브 인프라에 대한 본 작업은 Roblox에서 진행 중인 다른 작업과 함께, 수천만의 사람들을 위한 안정성 있는 고성능 필수 서비스로 성장하며 수십억의 사람들을 실시간으로 연결하기 위한 지속적인 확장을 가능하게 해 줄 것입니다.