主控臺右下角的提示框還未消失,陳帆的手指已經懸停在鍵盤上方。緩存讀取阻塞的時間持續超過兩秒,這不正常。
他迅速切到系統底層監控界面,心跳比平時快了半拍。硬盤陣列的狀態欄原本是綠色的,此刻卻變成一片暗紅。三塊主存儲盤的指示燈同時熄滅,RAID控制器無響應,邏輯卷無法掛載。
“斷電?”張遠從座位上站起身,聲音繃緊。
“不是。”陳帆盯著日志流,“最后寫入是在情緒因子模塊運行結束后0.8秒,之后所有IO請求全部超時。這不是軟件卡頓,是物理中斷。”
李陽快步走來,看了一眼主屏:“主數據庫沒同步?”
“昨晚十點的備份完成了,但過去三小時的數據——包括‘深萬科’的完整操作記錄、新模型權重調整日志、還有今天凌晨抓取的國債行情——都沒進保險柜硬盤。”陳帆語速平穩,但手指已在鍵盤上敲出殘影,“移動硬盤每天只同步一次,現在差的就是這幾小時。”
張遠倒吸一口冷氣:“三年積累的核心數據,要是丟了……”
沒人接話。實驗室里只剩下風扇低沉的嗡鳴。
陳帆猛地站起,幾步沖到機柜前,拔掉故障陣列的電源線。“暫停所有寫入任務,關閉自動備份進程。”他回頭下令,“張遠,去設備庫翻找舊SCSI轉接盒,要能兼容IDE接口的。李陽,準備十六進制編輯器和鏡像腳本,我們得手動重建。”
“你確定要現在動手?”李陽皺眉,“萬一錯誤操作導致剩余數據也被覆蓋——”
“等不起。”陳帆打斷,“常規備份機制失效了。單點備份抗不了多盤并發故障。我們現在只能靠自己拼回來。”
張遠轉身就跑向后間倉庫。李陽打開筆記本,調出WinHex工具界面,同時啟動SGI工作站上的磁盤健康檢測程序。
陳帆重新坐回主控臺,接入備用主機,嘗試識別每一塊硬盤的狀態。
第一塊:**ART信息顯示大量壞道,讀取延遲極高,但還能訪問部分扇區。
第二塊:情況類似,關鍵元數據區域已損壞。
第三塊:完全無響應,像是電路板燒毀。
“雙盤受損,一盤報廢。”他低聲說,“原始陣列是RAID0,條帶化分布沒有記錄,重建必須靠推演。”
李陽抬頭:“你是想手工還原分布規律?”
“只能這樣。”陳帆點頭,“用幸存的兩塊盤做基準,反推原始條帶大小和起始偏移。然后在新硬盤上重建RAID5結構,加入奇偶校驗冗余,防止再出問題。”
“可市面上的SATA硬盤沒法直接接這臺老服務器。”李陽提醒。
“所以要用SCSI轉接。”陳帆目光掃過機柜角落,“我記得去年淘汰的那批設備里有臺Sun的工作站,拆下來還能用。”
正說著,張遠抱著一個鐵盒沖進來,臉上全是汗:“找到了!轉接盒,還有一塊同型號的二手硬盤,是從報廢機拆的。”
“三塊都拿來。”陳帆說,“不夠的話,把測試用的IDE盤也清空騰出來。”
十分鐘后,新的存儲鏈路搭好。三塊替換硬盤接入系統,陳帆開始逐一對比原始盤的扇區分布。
時間一分一秒過去。
凌晨一點十七分,第一輪條帶化模擬完成。他反復校驗扇區對齊與奇偶位一致性,發現初始設定的64KB條帶大小會導致數據錯位。改用32KB后,讀取匹配度提升到71%。
“繼續調。”他說,“必須讓所有數據塊能正確重組。”
李陽在一旁用腳本將可讀扇區逐個鏡像復制到新陣列,同時標記損壞區域。張遠則守著溫度監測表,每隔十分鐘檢查一次硬盤工作溫度。
兩點四十三分,RAID5邏輯結構終于重建完畢。系統短暫識別到了一個新卷,但隨即報錯:文件系統頭部損壞,分區無法加載。
“主數據庫打不開。”李陽試了三次Access連接,均失敗,“MDB文件頭應該是壞了。”
陳帆閉眼幾秒,睜開時眼神更沉:“那就手動修。”
李陽立刻打開十六進制編輯器,導入鏡像文件。屏幕滿是亂碼般的字符與數字組合。
“標準Access數據庫頭在偏移0x400位置有個固定簽名,通常是‘Standard Jet DB’對應的十六進制值。”他說著,快速定位到對應地址。
屏幕上,那一段本該清晰的標識字段被幾個異常字節截斷。
“就是這兒。”李陽放大視圖,“簽名被改成了亂碼,操作系統認不出來。”
“你能恢復嗎?”
“得一個個字節比對。”李陽調出一個完好的數據庫樣本,“只要沒被徹底覆蓋,理論上可以復原。”
接下來的四十分鐘,他像在修復一件精密文物,逐字替換損壞的頭部信息。每改一個字節,就保存一次副本,再嘗試掛載。
第五次嘗試,系統彈出提示:【發現未知格式卷,是否嘗試修復?】
“有反應了!”張遠湊上前。
李陽沒說話,繼續向下修補后續的頁表指針和根目錄偏移量。他的手很穩,但額頭已經滲出汗珠。
三點二十九分,主數據庫終于成功掛載。陳帆立即運行完整性檢查工具,結果顯示:87%的數據頁可讀,關鍵表結構完整,僅有少量臨時緩存丟失。
“優先導出哪些?”李陽問。
“國債歷史行情、爬蟲日志、模型參數表。”陳帆快速列出,“特別是昨天更新的波動率因子權重,不能丟。”
數據遷移開始。綠色進度條緩慢爬升,每前進一格都像是從深淵里撈起一塊碎片。
四點十五分,最后一包K線數據導入成功。主屏的基礎監控界面重新點亮,實時行情流恢復接收。
陳帆長出一口氣,靠在椅背上。他的眼睛布滿血絲,指尖微微發顫。
“數據保住了多少?”張遠問。
“核心部分都在。”陳帆看著校驗碼對比結果,“丟失的主要是中間緩存和未提交的日志,不影響主體架構。”
“以后不能再這么冒險。”李陽合上筆記本,聲音低沉,“一套系統跑三年,只靠每日一次的單點備份?這次是運氣好,下次可能連搶救的機會都沒有。”
“我知道。”陳帆點頭,“從今天起,所有核心數據改為雙通道實時鏡像。本地一份,遠程一份。另外,我打算設計分布式容災方案,把關鍵模塊分散部署。”
張遠捏著手里的空紅牛瓶,喃喃道:“剛才那二十分鐘,我以為全完了。比高考查分那天還怕。”
沒人笑。那種瀕臨歸零的感覺,還在空氣中殘留。
李陽翻開筆記本,在空白頁寫下一行字:技術可以超前,但容災必須保守。
陳帆重新坐直,調出系統調度層代碼。他刪掉了舊的備份任務,新建兩個并行寫入進程,分別指向不同的物理設備。
“現在開始,每一次數據更新都要留下雙重痕跡。”他說,“我們不會再因為一次硬件故障,回到起點。”
李陽抬起頭:“情緒因子模塊還要繼續測試嗎?”
“當然。”陳帆看著主屏上重新跳動的數據流,“它差點讓我們錯過這場危機,但也提醒了我們一件事——系統不只是算法和數據,更是整個運行鏈條的穩定性。”
他頓了頓,補充道:“下一階段,我們要讓系統不僅能看市場,還能保護自己。”
實驗室燈光依舊通明。硬盤指示燈重新恢復規律閃爍,冷卻風扇持續運轉。
就在主控臺即將進入待命狀態時,右側副屏突然彈出一條新提示:
【警告】遠程鏡像寫入延遲上升至1.9秒
【原因】網絡隊列擁堵,重傳包增加
陳帆的手指停在回車鍵上方。