倉儲規模與資料中心運算

冗餘(redundancy)

如果你只帶一把家門鑰匙、又弄丟了,你就被鎖在門外。如果你在花盆下放了一把備份,弄丟一把只是聳聳肩,不是危機。冗餘(redundancy)正是這個想法:對任何你輸不起的東西,多留不只一份,好讓任何單一份的失效都不會讓你停擺。在倉儲規模電腦裡,這不是奢侈而是生存的必要,因為在數萬台機器的規模下,元件不斷故障——工作假設是每一天都有一些伺服器、磁碟、交換器與電源供應器掛掉。冗餘就是讓一個用不可靠零件造出的系統,變成一個可靠整體的方法。

具體而言,冗餘意味著把每一片資料存在好幾台機器上(複製 replication),並把每個服務跑在好幾台伺服器上,最好散佈到不同機架、不同供電迴路、甚至不同建築,好讓任何單一故障都不會一次拿掉所有副本。若一台持有某副本的伺服器掛了,請求就直接被導到另一個有相同資料的副本;若整個機架斷電,其他機架的副本繼續運作。系統持續監看故障,當一份副本遺失時,就在某個健康的地方做一份新副本,恢復安全餘裕。代價很明顯:把每樣東西存三份,要花三倍的儲存;而即使什麼都沒壞,跑著備用容量也要花錢。

冗餘是規模下可依賴性的基礎,它改變你對硬體的思考方式。因為你假設故障是家常便飯,你不需要每台機器都超級可靠又昂貴——你可以用便宜的商用零件,讓眾多零件之間的冗餘去交付可靠性,就像一群鳥即使個別的鳥會死、整群仍能存活。這是個深刻的 WSC 哲學:可靠性是在系統層級透過複製與快速復原來打造的,而非在元件層級用鍍金硬體買來的。

一個會咬到真實系統的誠實提醒:冗餘只在故障彼此獨立時才保護你。三份副本若全坐在同一個機架、而機架斷電,就毫無用處;若一個臭蟲、一次糟糕的部署、或一個相關連的事件把它們一起拿掉,也一樣。所以真實設計拚命讓副本獨立地故障——不同機架、不同供電、推送過程中不同的軟體版本——而且還必須測試,因為一條未經測試的故障切換路徑,是一份你只會在最糟時刻才發現壞掉的副本。

一個檔案系統把每個資料塊存三份,放在三個不同機架的三台伺服器上。一次磁碟故障損失一份副本;讀取切到另外兩份之一,系統悄悄在一顆健康的磁碟上重建第三份。使用者完全沒察覺任何事——即使在整支艦隊裡,磁碟整天都在故障。

三個機架上的三份副本:任何單一故障都看不見,遺失的副本會自動重建。

冗餘只對獨立的故障有幫助。同一機架裡的三份副本,或被一次糟糕部署一起殺掉的副本,會一起失效。而一條未經測試的故障切換路徑,是你只在停機時才得知壞掉的副本。

又稱
replicationredundant components備援冗餘設計