我們如何讓 Roblox 的基礎設施更高效且更具韌性

隨著 Roblox 在過去 16 多年來的成長,支撐數百萬次沉浸式 3D 協同體驗的技術基礎架構,其規模與複雜度也隨之增加。我們所支援的機器數量在過去兩年內已增長超過三倍,從 2021 年 6 月 30 日的約 36,000 台,增加到如今的近 145,000 台。 為了支援全球用戶隨時在線的體驗,我們需要超過 1,000 項內部服務。為了控制成本並降低網路延遲,我們將這些機器部署並管理於一套主要在本地運行的自建混合私有雲基礎架構中。
我們的基礎架構目前支援全球超過 7,000 萬名每日活躍用戶,其中包括依賴 Roblox 經濟體系經營業務的創作者。這數百萬用戶都期待極高的可靠性。鑑於我們體驗的沉浸式特性,對延遲或卡頓的容忍度極低,更遑論服務中斷。 Roblox 是一個促進溝通與連結的平台,人們在此透過沉浸式 3D 體驗匯聚一堂。當人們以虛擬化身在沉浸式空間中互動時,即使微小的延遲或故障,其影響也比在文字聊天或視訊會議中更為明顯。
2021 年 10 月,我們遭遇了一次全系統性的服務中斷。起初只是小規模問題,源於某個資料中心的單一元件故障。但在我們進行調查期間,問題迅速蔓延,最終導致長達 73 小時的服務中斷。當時,我們不僅分享了事件的詳細經過,也闡述了從此次事件中獲得的初步教訓。 自那時起,我們持續研究這些經驗教訓,致力於提升基礎設施的韌性,以應對所有大型系統中可能發生的各類故障——無論是因流量激增、天氣因素、硬體故障、軟體漏洞,抑或是人為失誤所導致。當這些故障發生時,我們該如何確保單一元件或元件群組的問題,不會蔓延至整個系統? 過去兩年來,這個問題一直是我們的核心關注點。雖然相關工作仍在進行中,但我們迄今為止的努力已初見成效。例如,與 2022 年上半年相比,2023 年上半年我們每月節省了 1.25 億小時的使用時間。今天,我們將分享已完成的成果,以及我們對建構更具韌性基礎設施系統的長期願景。

建立後備系統
在大型基礎設施系統中,小規模故障每天都會發生多次。如果某台機器出現問題而必須停機,這尚在可控範圍內,因為大多數公司都會維護多個後端服務實例。因此,當單一實例發生故障時,其他實例會接手其工作負載。為應對這些頻繁的故障,系統通常會設定當請求發生錯誤時自動重試。
然而,當系統或使用者過度頻繁地進行重試時,情況便會變得棘手,這可能導致這些小規模故障在基礎架構中蔓延,波及其他服務與系統。若網路或使用者持續進行重試,最終將使該服務的所有執行個體,甚至全球範圍內的其他系統,陷入過載狀態。 我們在 2021 年遭遇的服務中斷,正是大型系統中相當常見的狀況:故障起初規模微小,隨後在系統中蔓延,並以極快速度擴大,導致在整個系統完全癱瘓前難以解決。
在服務中斷發生時,我們僅有一個運作中的資料中心(其內部元件兼具備援功能)。當問題導致現有資料中心癱瘓時,我們需要能夠手動將服務切換至新的資料中心。 我們的首要任務是確保擁有 Roblox 的備援部署,因此我們在位於不同地理區域的新資料中心建置了該備援系統。這為最壞的情況提供了額外保障:即當故障蔓延至資料中心內足夠多的元件,導致該資料中心完全無法運作時。目前我們有一座資料中心負責處理工作負載(主動),另一座則處於待命狀態,作為備援(被動)。 我們的長期目標是從這種主動-被動配置轉向主動-主動配置,屆時兩個資料中心都將處理工作負載,並由負載平衡器根據延遲、容量和系統健康狀況在兩者之間分配請求。一旦這套機制到位,我們預期整個 Roblox 的可靠性將進一步提升,且能實現近乎即時的故障轉移,而非耗時數小時。

邁向細胞式基礎架構
我們的下一個重點是於每個資料中心內部建立堅固的防爆牆,以降低整個資料中心癱瘓的可能性。細胞(某些公司稱之為叢集)本質上是一組機器,而這正是我們建立這些防爆牆的方式。我們在細胞內部及跨細胞之間進行服務複製,以增加冗餘度。最終,我們希望 Roblox 上的所有服務都能在細胞中運行,使其既能受益於堅固的防爆牆,又能享有冗餘優勢。 若某個細胞群已無法運作,可安全地將其停用。跨細胞群的複製機制能確保在修復該細胞群期間,服務仍能持續運行。在某些情況下,修復細胞群可能意味著需對其進行完整的重新配置。在業界,對單台機器或少量機器進行資料清除與重新配置相當常見,但針對包含約 1,400 台機器的整個細胞群執行此操作則非比尋常。
為使此機制有效運作,這些細胞必須具備高度一致性,以便我們能快速且高效地將工作負載從一個細胞移至另一個細胞。我們已設定服務在細胞中運行前必須滿足的特定要求。例如,服務必須容器化,這不僅大幅提升其可移植性,更能防止任何人於作業系統層級進行配置變更。 我們為細胞採用了「基礎架構即代碼」的理念:在我們的原始碼儲存庫中,我們包含細胞內所有內容的定義,以便我們能利用自動化工具從頭快速重建它。
目前並非所有服務都符合這些要求,因此我們致力協助服務負責人盡可能達成這些標準,並開發了新工具,以便在服務準備就緒時能輕鬆地將其遷移至細胞中。 舉例來說,我們的新部署工具會自動將服務部署「分條」配置於各細胞之間,因此服務負責人無需費心思考複製策略。這種嚴謹的標準雖使遷移過程更加艱鉅且耗時,但長遠來看,將能建立一個具備以下特性的系統:
- 更易於控制故障並防止其擴散至其他細胞;
- 基礎架構工程師能更有效率且行動更迅速;以及
- 負責建置最終部署於各叢集中的產品級服務的工程師,無需知曉或擔憂其服務正在哪些叢集中運行。
解決更大的挑戰
正如防火門用於阻隔火焰,在我們的基礎架構中,細胞(cells)如同堅固的防爆牆,有助於將單一細胞內引發故障的任何問題隔離。 最終,構成 Roblox 的所有服務都將在各細胞內部及跨細胞之間進行冗餘部署。一旦這項工作完成,問題雖然仍可能擴散到足以使整個細胞無法運作的程度,但問題要擴散到該細胞之外將極為困難。而且,如果我們成功讓細胞之間能夠互換,恢復速度將會顯著加快,因為我們能夠切換到另一個細胞,並防止問題影響終端使用者。
棘手之處在於:如何在確保系統效能與功能正常運作的同時,將這些細胞充分隔離以減少錯誤擴散的機會。在複雜的基礎架構系統中,服務需要相互通訊以共享查詢、資訊、工作負載等。當我們將這些服務複製到各細胞時,必須審慎考量如何管理跨細胞通訊。在理想情況下,我們會將來自某個異常細胞的流量重定向至其他正常運作的細胞。 但我們該如何處理「致命查詢」——也就是導致某個單元狀態異常的查詢?若將該查詢重定向至其他單元,可能會導致該單元陷入我們正試圖避免的異常狀態。我們需要建立機制,在偵測並扼殺導致單元異常的流量之同時,將「正常」流量從異常單元中移出。
短期內,我們已在每個運算單元中部署了運算服務的副本,使大多數發送至資料中心的請求都能由單一單元處理。我們同時也在各單元之間進行流量負載平衡。放眼長遠,我們已開始建構下一代服務發現流程,該流程將被服務網格所採用,我們期望能在 2024 年完成此項工作。 這將使我們能實施精密的策略,僅在不會對備援節點造成負面影響時,才允許跨節點通訊。同樣預計於 2024 年推出的,還有一項將依賴性請求導向同節點內服務版本的方法,此舉將能最小化跨節點流量,進而降低故障跨節點傳播的風險。
在流量高峰時,我們超過 70% 的後端服務流量來自跨細胞處理,我們已累積了豐富的細胞建構經驗,但隨著服務持續遷移至 2024 年及以後,我們預期還需進行更多研究與測試。隨著進程推進,這些防護牆將變得越來越堅固。

遷移全天候運作的基礎架構
Roblox 是一個支援全球用戶的國際平台,因此我們無法在非高峰時段或「停機時間」遷移服務,這使得將所有機器遷移至叢集,並讓服務在這些叢集中運行,變得更加複雜。 我們擁有數百萬個必須持續運作的體驗,即使在遷移其運行主機及支援服務的同時,這些體驗仍需持續獲得支援。當我們啟動此流程時,並未擁有數萬台閒置且可供遷移這些工作負載的主機。
不過,我們確實備有少量預先購置、以因應未來成長需求的額外機器。起初,我們利用這些機器建置新的幢群,隨後將工作負載遷移至其中。 我們重視效率與可靠性,因此當「備用」機器用罄時,我們並未外出採購更多機器,而是透過清除並重新配置已遷移工作負載的機器來建立更多叢集。接著,我們將工作負載遷移至這些重新配置的機器上,並重新啟動整個流程。 這個過程相當複雜——隨著機器被替換並釋出以組建為運算單元,它們的釋出並非以理想且有序的方式進行。這些機器在資料中心各機房中物理上呈現分散狀態,迫使我們必須以零散的方式進行配置,這需要進行硬體層級的整合流程,以確保硬體位置與大規模的物理故障域保持一致。
我們基礎架構工程團隊的一部分成員,專注於將現有工作負載從舊有(或稱「細胞前」)環境遷移至細胞中。這項工作將持續進行,直到我們將數千種不同的基礎架構服務和數千種後端服務遷移至新建的細胞中為止。鑑於某些複雜因素,我們預計這將耗費整個明年,甚至可能延續至 2025 年。首先,這項工作需要建立強大的工具。 舉例來說,當我們部署新的 Cell 時,需要工具能自動重新平衡大量服務,同時不影響使用者。此外,我們也發現有些服務是基於對基礎架構的特定假設所建置的。我們必須修改這些服務,使其不再依賴未來在轉向 Cell 架構時可能變更的元素。 此外,我們已實施雙重機制:一方面能篩檢出與細胞架構不相容的已知設計模式,另一方面針對每個遷移的服務建立系統化的測試流程。這些流程有助於我們預先防範因服務與細胞架構不相容而引發的任何用戶端問題。
目前,已有近 30,000 台機器由細胞架構管理。雖然這僅佔我們總機群的一小部分,但到目前為止,過渡過程非常順利,且未對玩家造成任何負面影響。 我們的最終目標是讓系統每月達到 99.99% 的用戶正常運行時間,這意味著我們造成的服務中斷時間將不超過總互動時數的 0.01%。在整個產業中,停機時間雖無法完全消除,但我們的目標是將 Roblox 的停機時間降低到幾乎無法察覺的程度。
在擴展規模的同時確保未來適應性
儘管初期成果令人鼓舞,但我們在「細胞」技術上的工作遠未完成。隨著 Roblox 持續擴展規模,我們將透過此技術及其他技術,持續致力於提升系統的效率與韌性。隨著進程推進,平台將對問題展現出日益增強的韌性,而任何發生的問題對平台使用者而言,其可見度與干擾性也應會逐漸降低。
總而言之,迄今為止,我們已:
- 建置了第二座資料中心,並成功實現主動/被動運作狀態。
- 在主用與備用資料中心內建立 Cell,並成功將超過 70% 的後端服務流量遷移至這些 Cell。
- 制定了在持續遷移剩餘基礎架構時,為確保所有細胞保持一致性所需遵循的規範與最佳實踐。
- 啟動了在各幢之間建立更堅固「隔音牆」的持續流程。
隨著這些服務單元變得更加可互換,單元之間的干擾將隨之減少。這為我們在提升監控、故障排除,甚至自動調度工作負載方面的自動化程度,開闢了極具潛力的發展契機。
九月起,我們亦開始在各資料中心進行主動/主動(active/active)架構的實驗。這是我們正在測試的另一項機制,旨在提升可靠性並將故障轉移時間降至最低。這些實驗協助我們識別出若干系統設計模式(主要圍繞資料存取),隨著我們邁向全面主動/主動架構,這些模式需要進行重新設計。整體而言,實驗成效足夠理想,因此我們決定讓其持續運作,以處理部分用戶的流量。



