Blog/

Walkaway DR — 一支手機如何重建一台壞掉的伺服器

手術進行中,伺服器壞了。所有病患紀錄、血品、藥品記錄全在那台裝置上。護理師插上一台全新的備用機,用手機在三分鐘內還原一切。Walkaway 災難復原的運作原理。

沒人計劃過的情境

企業軟體的災難復原靠的是容錯叢集、資料庫複製和全天候維運團隊。假設你有資料中心、網路工程師和預算。

現在把這些全部拿掉。你在災區用一台小型裝置跑醫療站。電源線被踢掉了。儲存卡損壞了。餘震中裝置從折疊桌上掉下來。機器壞了。

過去 72 小時的所有病患紀錄都在那台裝置上。檢傷分類。配藥紀錄。血品保管鏈。進行中的手術案例。全部。

傳統災難復原說:從備份還原。但備份伺服器就是剛壞掉的那台。沒有雲端。沒有第二個資料中心。沒有 IT 團隊。

有的是:一名護理師的手機,過去一直在背景每五分鐘同步資料。

救生艇協議

我們稱之為「救生艇協議」(Lifeboat Protocol),因為這個比喻很精確。船沉了,救生艇載著乘客。伺服器壞了,手機載著資料。

xGrid 裡的每個應用程式都在背景執行「救生艇用戶端」。每五分鐘,它無聲地從伺服器拉取新資料,存放在手機瀏覽器的本地資料庫中——這個資料庫在應用程式重啟、手機重開甚至飛航模式下都能保存。

備份不是一個檔案。它是一個結構化的事件儲存庫,包含伺服器上發生的每一個變更,加上所有關鍵資料表的定期快照——病患紀錄、血品、手術案例、藥品排程、照護計畫。

伺服器壞了,手機不會立刻知道。下次嘗試同步時,它發現伺服器不在了。當一台全新的備用裝置出現在網路上,手機自動偵測到:伺服器身份改變了,資料庫是空的。

這就觸發了還原。

三分鐘完全復原

復原流程是為護理師設計的,不是工程師:

步驟一

偵測

手機看到新伺服器,資料庫是空的。橫幅出現:「偵測到新伺服器,要還原資料嗎?」

步驟二

驗證

護理師輸入管理員密碼。這防止未授權的還原——沒有密碼,你無法覆寫伺服器的資料。

步驟三

還原

手機分批送出所有快取的事件和快照。伺服器以交易方式處理。典型還原:三分鐘以內。

快照立即恢復當前狀態——儀表板幾秒內就能使用。事件重播完整歷史,確保每一條稽核軌跡完好無損。

為什麼需要事件,不只是快照

快照告訴你現在的狀態。事件告訴你怎麼到這個狀態的。

如果只還原快照,你知道病患 A 被配了兩袋血。但你不知道誰配的、什麼時候、為什麼。你不知道這是凌晨兩點的緊急調用,因為病患大量出血,而醫師正在另一台手術。

xGrid 將每個狀態變更記錄為不可變的事件:誰做的、什麼時候、在哪台裝置、基於什麼理由。事件儲存只能新增——事件永遠不會被刪除或修改。每個事件都帶有內容的密碼學雜湊值。

手機還原到新伺服器時,它傳送完整的事件鏈。伺服器可以重建的不只是當前狀態,而是每一個決策、每一個覆寫、每一次交班的完整歷史。

鏈式雜湊驗證

怎麼知道還原的資料是完整且未被篡改的?

每種實體類型(血品、手術案例、病患紀錄)維護一個滾動鏈式雜湊:

chain[i] = SHA-256(chain[i-1] + event_id + payload_hash)

概念類似區塊鏈,但沒有那些額外負擔。如果原始伺服器有 500 個血品事件產生鏈式雜湊 a3f2...,還原伺服器處理同樣的 500 個事件,也必須產生相同的 a3f2...

如果任何事件遺失、被修改或順序錯亂,鏈式雜湊就會分歧。系統會標記。在任何人開始使用資料之前,你就知道出了問題。

在我們的端對端測試中,我們在伺服器上建立病患資料、血品和手術案例,匯出所有東西,啟動一台全新伺服器,還原,然後比對鏈式雜湊。每次都完全吻合。

冪等性:不穩定網路的安全網

如果護理師的手機在還原中途斷線了怎麼辦?她重新連線,再按一次「還原」。會不會產生重複資料?

不會。每個事件都有唯一識別碼和內容雜湊。伺服器收到已處理過的事件時,它會檢查:

  • 相同 ID、相同雜湊:已存在。跳過。不會重複。
  • 相同 ID、不同雜湊:衝突。拒絕並記錄待調查。
  • 新 ID:正常寫入。

護理師可以按十次「還原」。結果跟按一次一模一樣。這不是便利功能——這是關鍵的安全特性。在壓力大、連線不穩定的環境中,人們會重試。系統必須優雅地處理重試。

還原的內容

救生艇快照涵蓋 20 張關鍵資料表:

核心醫療

麻醉案例、設備狀態、血品及保管鏈

戰場醫療模組

延長照護計畫、生命徵象、醫療介入、藥品排程、臨床警示

野戰作業

戰傷卡、後送請求、損害控制手術階段紀錄、延後手術追蹤

治理

簽核請求、投票紀錄、升級日誌、權限模式、預授權

每一張影響病患安全的資料表都包含在內。如果它會影響臨床決策,它就能在還原中存活。

儲存卡的現實

這類小型裝置使用儲存卡。儲存卡會磨損。它們不是為資料庫伺服器的寫入模式設計的。在 24 小時不間斷的野戰部署中,儲存卡故障不是會不會的問題,而是什麼時候的問題。

這就是救生艇協議存在的原因。不是作為罕見事件的保險,而是系統運作假設的常規部分。系統本來就預期硬體會壞。

還原流程也保護新的儲存卡。不是寫入數千個獨立的資料庫操作,而是每批事件在單一交易中處理。更少的寫入操作意味著更少的儲存卡磨損,延長替換裝置的壽命。

12 步驗證

我們的端對端災難復原測試執行 12 個步驟:

  1. 在原始伺服器上建立病患、血品、手術案例和戰場醫療資料
  2. 建立延長照護計畫及生命徵象、戰傷卡、後送請求
  3. 匯出所有事件和快照(分頁、游標式)
  4. 記錄原始伺服器的鏈式雜湊指紋
  5. 啟動一台全新伺服器,資料庫為空
  6. 還原第一批:快照 + 第一批事件
  7. 還原剩餘批次
  8. 比對原始和還原伺服器的鏈式雜湊
  9. 重新送出所有事件(冪等測試)——驗證零重複
  10. 驗證所有戰場醫療資料存活:照護計畫、戰傷卡、後送請求
  11. 檢查還原歷史:零拒絕事件
  12. 確認完整稽核軌跡完整性

12 個步驟全部通過。還原後的伺服器與原始伺服器無法區分——相同的資料、相同的歷史、相同的鏈式雜湊。

實際意義

野戰醫院團隊帶著兩台裝置和一盒備品部署。當裝置故障——這是必然的——替換流程只需幾分鐘,不是幾小時。不需要工程師。不需要命令列。不需要特殊訓練,只需要「手機問你密碼時輸入密碼」。

資料不住在伺服器上。它住在每一支曾經連接過伺服器的手機和平板上。伺服器不是唯一真相來源。它是一個方便的彙整點。手機才是救生艇,而且它們隨時待命。

這就是 Walkaway 在實踐中的意義。不只是開發團隊可以離開(他們可以——見閃人測試)。硬體也可以「離開」。從桌上掉下去。被踩到。在餘震中起火。資料存活,因為資料從來不只在一個地方。


延伸閱讀:閃人測試 · 戰場上的 SQLite · 中心-衛星架構:斷線環境的網路拓撲