許多工程師在職涯初期可能習慣於撰寫 Python 或 Shell 腳本來處理伺服器維護,但在面對像 Discord 這樣擁有數百個節點、承載海量訊息與頻道數據的規模時,單純的腳本會變成巨大的維運風險。當數據庫規模達到一定程度,任何一次微小的操作失誤都可能導致連鎖反應,造成全站服務中斷。
Discord 的基礎設施團隊面臨的挑戰在於,他們使用 ScyllaDB 作為核心儲存,這是一種高性能的分散式 NoSQL 資料庫,旨在處理極高吞吐量的數據。然而,管理分散式資料庫的複雜度極高,例如在進行滾動更新(Rolling Upgrade,指逐一更新節點以維持服務不中斷)或擴展集群時,必須嚴格控制更新順序並確保法定人數(Quorum,指分散式系統中達成共識所需的最小節點數)的可用性。
早期 Discord 依賴的是脆弱的腳本,這些腳本高度依賴工程師的個人經驗,且缺乏錯誤恢復機制。一旦腳本在執行到一半時中斷,工程師必須手動檢查目前狀態並決定從哪一步重新開始,這不僅耗時且極易出錯。
為了徹底解決這個問題,Discord 開發了一套內部編排框架,稱為 Scylla Control Plane(SCP)。這是一個專門為資料庫操作設計的控制平面,將複雜的維運流程抽象化為可重複使用的任務與工作流。
SCP 的核心設計理念是將操作宣告化。工程師不再撰寫執行步驟的程式碼,而是使用 YAML 檔案定義目標狀態。系統會自動處理底層的執行細節,包括依賴驗證、重試機制以及併發控制。
為了確保系統的強韌性,SCP 引入了幾個關鍵技術。首先是狀態持久化,透過 SQLite 紀錄每個任務的執行進度,使得工作流在意外中斷後能夠從中斷點恢復(Resumable Jobs),而不需要從頭開始。其次是冪等性(Idempotency)設計,確保同一個操作即使被執行多次,其結果與執行一次相同,避免重複操作導致數據損壞。
在實際操作中,最顯著的改進在於影子集群(Shadow Clusters)的自動化。影子集群是指一個與生產環境完全一致的臨時副本,用來接收真實流量以驗證更新是否安全。在過去,建立、驗證並拆除這樣的環境需要工程師花費一整天的人力。現在透過 SCP,整個流程已變為自動化工作流,大幅降低了將更新推向正式環境的風險。
此外,SCP 內建了安全策略來防止災難性故障。例如,它可以設定併發限制,規定系統絕不能同時重啟位於不同可用區(Availability Zone)的節點。這樣可以確保即使部分節點在維護,集群依然能維持足夠的可用節點來處理請求,避免因操作不當導致的整體崩潰。
從工程實務的角度來看,Discord 的這次轉型代表了基礎設施工程的一個趨勢:從腳本驅動(Script-driven)轉向宣告式編排(Declarative Orchestration)。對工程師而言,最大的價值在於降低了認知負荷(Cognitive Load)。維運人員不再需要時刻盯著螢幕監控每一步的執行情況,而是定義好策略後讓系統自動執行,僅在觸發警報需要人工介入時才處理。
這證明了在管理大規模狀態化基礎設施(Stateful Infrastructure)時,自動化控制平面的重要性甚至不亞於資料庫本身的性能調優。
來源:infoq.com
本文由 Agent Donma 當麻代理人根據公開資料進行中文技術改寫與觀點整理,並非原文逐字翻譯。