Roblox의 인프라를 더욱 효율적이고 탄력적으로 만드는 방법 - Roblox Blog

Roblox의 인프라를 더욱 효율적이고 탄력적으로 만드는 방법 – Roblox 블로그

소스 노드 : 2998456

Roblox가 지난 16년 이상 성장함에 따라 수백만 건의 몰입형 3D 공동 경험을 지원하는 기술 인프라의 규모와 복잡성도 커졌습니다. 우리가 지원하는 컴퓨터의 수는 36,000년 30월 2021일 현재 약 145,000대에서 현재 약 1,000대로 지난 XNUMX년 동안 XNUMX배 이상 증가했습니다. 전 세계 사람들을 위해 이러한 상시 접속 환경을 지원하려면 XNUMX개 이상의 내부 서비스가 필요합니다. 비용과 네트워크 대기 시간을 제어하는 ​​데 도움이 되도록 우리는 주로 온프레미스에서 실행되는 맞춤형 하이브리드 프라이빗 클라우드 인프라의 일부로 이러한 머신을 배포하고 관리합니다.  

우리 인프라는 현재 Roblox의 서비스에 의존하는 제작자를 포함하여 전 세계 70천만 명 이상의 일일 활성 사용자를 지원합니다. 경제 그들의 사업을 위해. 이 수백만 명의 사람들은 모두 매우 높은 수준의 신뢰성을 기대합니다. 우리 경험의 몰입형 특성을 고려할 때 중단은 물론 지연이나 대기 시간에 대한 허용 오차가 극히 낮습니다. Roblox는 사람들이 몰입형 3D 경험을 통해 함께 모이는 커뮤니케이션과 연결을 위한 플랫폼입니다. 사람들이 몰입형 공간에서 자신의 아바타로 소통할 때, 사소한 지연이나 결함도 텍스트 스레드나 전화 회의에서보다 더 눈에 띕니다.

2021년 73월에 시스템 전반에 걸쳐 중단이 발생했습니다. 한 데이터 센터의 한 구성 요소에 문제가 있는 작은 규모로 시작되었습니다. 하지만 조사를 진행하는 동안 빠르게 확산되어 결국 XNUMX시간 동안의 서비스 중단을 초래했습니다. 당시 우리는 둘 다 공유했습니다. 무슨 일이 일어났는지에 대한 자세한 내용 그리고 이 문제로부터 우리가 얻은 초기 교훈 중 일부입니다. 그 이후로 우리는 이러한 학습 내용을 연구하고 극심한 트래픽 급증, 날씨, 하드웨어 오류, 소프트웨어 버그 등의 요인으로 인해 모든 대규모 시스템에서 발생하는 오류 유형에 대한 인프라의 복원력을 높이기 위해 노력해 왔습니다. 실수를 저지르는 인간. 이러한 오류가 발생할 때 단일 구성 요소 또는 구성 요소 그룹의 문제가 전체 시스템으로 확산되지 않도록 하려면 어떻게 해야 합니까? 이 질문은 지난 2023년 동안 우리의 초점이었으며 작업이 진행되는 동안 지금까지 우리가 해온 일은 이미 성과를 거두고 있습니다. 예를 들어, 125년 상반기에 우리는 2022년 상반기에 비해 월간 XNUMX억 XNUMX만 참여 시간을 절약했습니다. 오늘 우리는 이미 수행한 작업과 구축을 위한 장기적인 비전을 공유하고 있습니다. 보다 탄력적인 인프라 시스템.

백스톱 구축

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

시스템이나 사람이 너무 공격적으로 재시도하면 이는 어려워지며, 이는 소규모 오류가 인프라 전반에 걸쳐 다른 서비스 및 시스템으로 전파되는 방법이 될 수 있습니다. 네트워크 또는 사용자가 지속적으로 재시도하면 결국 해당 서비스의 모든 인스턴스와 잠재적으로 다른 시스템이 전체적으로 오버로드됩니다. 2021년 중단은 대규모 시스템에서 상당히 흔한 일의 결과입니다. 오류는 작게 시작하여 시스템 전체에 전파되고, 너무 빨리 커지면 모든 것이 중단되기 전에 해결하기가 어렵습니다. 

가동 중단 당시 우리는 하나의 활성 데이터 센터(그 내부 구성 요소가 백업 역할을 함)를 갖고 있었습니다. 문제로 인해 기존 데이터 센터가 중단되었을 때 새 데이터 센터로 수동으로 장애 조치할 수 있는 기능이 필요했습니다. 우리의 최우선 순위는 Roblox의 백업 배포를 보장하는 것이었기 때문에 다른 지역에 위치한 새로운 데이터 센터에 해당 백업을 구축했습니다. 이는 최악의 시나리오에 대한 보호를 추가했습니다. 즉, 가동 중단이 데이터 센터 내의 충분한 구성 요소로 확산되어 완전히 작동할 수 없게 되는 것입니다. 이제 워크로드를 처리하는 하나의 데이터 센터(활성)와 백업 역할을 하는 하나의 대기(수동) 데이터 센터가 있습니다. 우리의 장기 목표는 이러한 활성-수동 구성을 활성-활성 구성으로 전환하는 것입니다. 두 데이터 센터 모두 워크로드를 처리하고 로드 밸런서는 대기 시간, 용량 및 상태를 기준으로 두 데이터 센터 간에 요청을 분산시킵니다. 이것이 구현되면 Roblox 전체에 대한 신뢰성이 더욱 높아질 것으로 예상되며 몇 시간이 아니라 거의 즉시 장애 조치가 가능해질 수 있습니다.

셀룰러 인프라로 이동

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

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

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

  • 오류를 억제하고 다른 셀로 확산되는 것을 방지하는 것이 훨씬 쉽습니다. 
  • 우리의 인프라 엔지니어는 더욱 효율적이고 빠르게 움직일 수 있습니다. 그리고 
  • 궁극적으로 셀에 배포되는 제품 수준 서비스를 구축하는 엔지니어는 서비스가 실행되는 셀을 알거나 걱정할 필요가 없습니다.

더 큰 과제 해결

방화문이 화염을 억제하는 데 사용되는 방식과 유사하게 셀은 인프라 내에서 강력한 폭발벽 역할을 하여 단일 셀 내에서 장애를 유발하는 모든 문제를 억제하는 데 도움을 줍니다. 결국 Roblox를 구성하는 모든 서비스는 셀 내부와 셀 간에 중복 배포됩니다. 이 작업이 완료되면 문제가 전체 셀을 작동할 수 없을 만큼 광범위하게 전파될 수 있지만 문제가 해당 셀 너머로 전파되는 것은 극히 어렵습니다. 그리고 셀을 교환 가능하게 만드는 데 성공하면 복구 속도가 훨씬 빨라질 것입니다. 다른 셀로 장애 조치를 수행하고 문제가 최종 사용자에게 영향을 미치지 않도록 할 수 있기 때문입니다. 

이것이 까다로워지는 부분은 오류가 전파될 기회를 줄일 만큼 충분히 이러한 셀을 분리하는 동시에 성능과 기능을 유지하는 것입니다. 복잡한 인프라 시스템에서 서비스는 쿼리, 정보, 작업 부하 등을 공유하기 위해 서로 통신해야 합니다. 이러한 서비스를 셀에 복제할 때 교차 통신을 관리하는 방법에 대해 신중하게 생각해야 합니다. 이상적인 세계에서는 하나의 비정상 셀에서 다른 건강한 셀로 트래픽을 리디렉션합니다. 하지만 우리는 "죽음에 대한 질문"을 어떻게 관리합니까? 일으키는 세포가 건강하지 못하다? 해당 쿼리를 다른 셀로 리디렉션하면 우리가 피하려고 하는 방식으로 해당 셀이 비정상 상태가 될 수 있습니다. 우리는 세포를 건강하지 않게 만드는 트래픽을 감지하고 억제하는 동시에 건강하지 못한 세포에서 "양호한" 트래픽을 이동시키는 메커니즘을 찾아야 합니다. 

단기적으로 우리는 데이터 센터에 대한 대부분의 요청을 단일 셀에서 처리할 수 있도록 컴퓨팅 서비스의 복사본을 각 컴퓨팅 셀에 배포했습니다. 또한 셀 간 트래픽 로드 밸런싱도 수행하고 있습니다. 좀 더 자세히 살펴보면, 우리는 서비스 메시가 활용할 차세대 서비스 검색 프로세스를 구축하기 시작했으며 2024년에 완료할 예정입니다. 이를 통해 우리는 다음과 같은 경우에만 셀 간 통신을 허용하는 정교한 정책을 구현할 수 있습니다. 장애 조치(failover) 셀에 부정적인 영향을 미치지 않습니다. 또한 2024년에는 종속 요청을 동일한 셀의 서비스 버전으로 전달하는 방법이 제공될 예정입니다. 이를 통해 셀 간 트래픽을 최소화하고 셀 간 오류 전파 위험을 줄일 수 있습니다.

최고조에 달할 때 백엔드 서비스 트래픽의 70% 이상이 셀 외부에서 제공되고 있으며 셀 생성 방법에 대해 많은 것을 배웠습니다. 하지만 2024년까지 서비스를 계속 마이그레이션하면서 더 많은 연구와 테스트가 예상됩니다. 그 너머에. 진행하면서 이러한 폭발벽은 점점 더 강해질 것입니다.

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

Roblox는 전 세계 사용자를 지원하는 글로벌 플랫폼이므로 사용량이 많지 않거나 "다운 타임" 동안 서비스를 이동할 수 없습니다. 이로 인해 모든 시스템을 셀로 마이그레이션하고 해당 셀에서 서비스를 실행하는 프로세스가 더욱 복잡해집니다. . 우리는 실행되는 컴퓨터와 이를 지원하는 서비스를 이동하는 동안에도 계속 지원되어야 하는 수백만 개의 상시 사용 환경을 보유하고 있습니다. 이 프로세스를 시작했을 때 사용되지 않고 이러한 워크로드를 마이그레이션할 수 있는 수만 대의 머신이 없었습니다. 

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

인프라 엔지니어링 팀의 일부는 레거시 또는 "프리 셀" 환경의 기존 워크로드를 셀로 마이그레이션하는 데 중점을 두고 있습니다. 이 작업은 수천 개의 다양한 인프라 서비스와 수천 개의 백엔드 서비스를 새로 구축된 셀로 마이그레이션할 때까지 계속됩니다. 몇 가지 복잡한 요인으로 인해 이 작업은 내년 내내, 어쩌면 2025년까지 걸릴 것으로 예상됩니다. 첫째, 이 작업을 수행하려면 강력한 도구가 필요합니다. 예를 들어, 새로운 셀을 배포할 때 사용자에게 영향을 주지 않고 많은 서비스의 균형을 자동으로 재조정하는 도구가 필요합니다. 우리는 인프라에 대한 가정을 바탕으로 구축된 서비스도 보았습니다. 우리가 셀로 이동하면서 미래에 바뀔 수 있는 것들에 의존하지 않도록 이러한 서비스를 수정해야 합니다. 또한 우리는 셀룰러 아키텍처와 잘 작동하지 않는 알려진 디자인 패턴을 검색하는 방법과 마이그레이션되는 각 서비스에 대한 체계적인 테스트 프로세스를 모두 구현했습니다. 이러한 프로세스는 서비스가 셀과 호환되지 않아 발생하는 사용자 직면 문제를 방지하는 데 도움이 됩니다.

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

확장에 따른 미래 보장

우리의 초기 노력은 성공적인 것으로 입증되었지만 세포에 대한 연구는 아직 끝나지 않았습니다. Roblox가 지속적으로 확장됨에 따라 우리는 이 기술과 기타 기술을 통해 시스템의 효율성과 탄력성을 개선하기 위해 계속 노력할 것입니다. 우리가 진행함에 따라 플랫폼은 문제에 대한 탄력성이 점점 더 높아질 것이며 발생하는 모든 문제는 점차적으로 우리 플랫폼의 사람들에게 눈에 띄지 않고 방해가 될 것입니다.

요약하면 현재까지 다음과 같습니다. 

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

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

XNUMX월에는 데이터 센터 전반에 걸쳐 활성/활성 실험도 시작했습니다. 이는 안정성을 향상하고 장애 조치 시간을 최소화하기 위해 테스트 중인 또 다른 메커니즘입니다. 이러한 실험은 주로 데이터 액세스와 관련된 여러 시스템 설계 패턴을 식별하는 데 도움이 되었으며, 완전한 활성-활성화를 향해 나아가기 위해 재작업해야 합니다. 전반적으로 실험은 제한된 수의 사용자로부터 발생하는 트래픽에 대해 실행될 만큼 충분히 성공적이었습니다. 

우리는 플랫폼에 더 큰 효율성과 탄력성을 제공하기 위해 이 작업을 계속 추진하게 되어 기쁘게 생각합니다. 셀 및 Active-Active 인프라에 대한 이러한 작업은 다른 노력과 함께 수백만 명의 사람들을 위한 신뢰할 수 있는 고성능 유틸리티로 성장하고 실제로 XNUMX억 명의 사람들을 연결하기 위해 노력하면서 계속 확장할 수 있게 해줄 것입니다. 시간.

타임 스탬프 :

더보기 Roblox