FaRM:極端硬件與樂觀并發(fā)控制 OCC
今天,我們將探討一個(gè)截然不同的思路。如果我們的目標(biāo)不是跨越洲際,而是要榨干單個(gè)數(shù)據(jù)中心內(nèi)的每一分性能,那系統(tǒng)設(shè)計(jì)會(huì)變成什么樣?這就是本課的主角 FaRM ,它通過 樂觀并發(fā)控制 (Optimistic Concurrency Control) 和對(duì)尖端硬件的極致運(yùn)用,給出了一個(gè)驚人的答案。
請(qǐng)注意,F(xiàn)aRM 是一個(gè)研究原型,目前還沒有已知的生產(chǎn)系統(tǒng)直接使用它。它的價(jià)值在于探索設(shè)計(jì)的可能性。像微軟、Google 這樣的公司之所以發(fā)表這類論文,一方面是為了吸引頂尖人才,展示公司前沿的智力挑戰(zhàn);另一方面,許多研究人員本身就有推動(dòng)技術(shù)進(jìn)步的學(xué)術(shù)使命感。
換句話說, FaRM 有些前提或者假設(shè)比較理想,不適合現(xiàn)有生產(chǎn)環(huán)境。
FaRM 的性能秘訣(一):榨干硬件潛力
FaRM 的高性能并非空穴來風(fēng),它建立在軟硬件協(xié)同設(shè)計(jì)的基礎(chǔ)上,首先是兩種顛覆傳統(tǒng)瓶頸的硬件技術(shù)。
非易失性內(nèi)存 (NVRAM)
傳統(tǒng)數(shù)據(jù)庫(kù)最大的瓶頸之一是磁盤 I/O。一次寫入到磁盤需要耗費(fèi)數(shù)毫秒,即使是高速的固態(tài)硬盤 (SSD) 也要上百微秒。相比之下,內(nèi)存 (DRAM) 的寫入只需要幾百納秒,速度快了成千上萬(wàn)倍。FaRM 的設(shè)計(jì)哲學(xué)就是:所有數(shù)據(jù)都必須放在內(nèi)存里。
但這帶來了持久性的問題:內(nèi)存是易失的,一旦斷電,數(shù)據(jù)就會(huì)丟失。FaRM 采用了一種巧妙且經(jīng)濟(jì)的方式來打造 非易失性內(nèi)存 (Non-Volatile RAM) 。它沒有使用昂貴的專用 NVDIMM 硬件,而是在每個(gè)機(jī)架上部署了帶鋰電池的 不間斷電源 (UPS) 。
工作流程如下:
- 正常運(yùn)行時(shí),所有數(shù)據(jù)寫入都直接在內(nèi)存中完成,速度極快。
 - 當(dāng)外部電源中斷時(shí),硬件會(huì)通知軟件,服務(wù)器立即切換到電池供電。
 - FaRM 軟件會(huì)暫停所有事務(wù)處理,利用電池提供的幾分鐘電量,將內(nèi)存中的全部?jī)?nèi)容轉(zhuǎn)儲(chǔ)到 SSD 上進(jìn)行持久化。
 - 當(dāng)電力恢復(fù)后,系統(tǒng)會(huì)從 SSD 中將數(shù)據(jù)重新加載回內(nèi)存,然后從斷點(diǎn)處繼續(xù)運(yùn)行。
 
這個(gè)設(shè)計(jì)至關(guān)重要。如果沒有電池和 NVRAM,F(xiàn)aRM 就必須為每個(gè)事務(wù)同步地寫入 SSD,其性能將會(huì)一落千丈,因?yàn)橐淮?SSD 寫入比 FaRM 的目標(biāo)延遲高出太多。那能否用更便宜的機(jī)械硬盤 (HDD) 來代替 SSD 呢?理論上可以,但 HDD 的寫入速度要慢得多,這意味著需要容量更大、成本也更高的電池來支撐更長(zhǎng)的轉(zhuǎn)儲(chǔ)時(shí)間,經(jīng)濟(jì)上可能得不償失。
使用電池來保證斷電時(shí)的數(shù)據(jù)持久性這個(gè)想法并不新鮮,早在 90 年代初的 Harp 文件系統(tǒng)就用過類似的技術(shù)。不過,F(xiàn)aRM 這種機(jī)架級(jí)別的分布式 UPS 方案在通用系統(tǒng)中并不常見。
遠(yuǎn)程直接內(nèi)存訪問 (RDMA)
第二個(gè)傳統(tǒng)瓶頸在于網(wǎng)絡(luò),尤其是處理網(wǎng)絡(luò)消息所帶來的 CPU 開銷。一次傳統(tǒng)的 遠(yuǎn)程過程調(diào)用 (Remote Procedure Call, RPC) 流程相當(dāng)繁瑣:
應(yīng)用層 (App)                                   應(yīng)用層 (App)
      |                                              ^
      v                                              |
  系統(tǒng)調(diào)用 (System Call)                       中斷 (Interrupt)
  ------------- 內(nèi)核空間 (Kernel Space) ------------------
      |                                              ^
      v                                              |
  Socket 緩沖區(qū) -> TCP協(xié)議棧                      TCP協(xié)議棧 <- NIC 驅(qū)動(dòng)
      |                                              ^
      v                                              |
  NIC 驅(qū)動(dòng)  --------------------------------------->  NIC這個(gè)過程涉及到昂貴的系統(tǒng)調(diào)用、內(nèi)核與用戶空間之間的數(shù)據(jù)拷貝以及中斷處理,極大地消耗了 CPU 資源,使得服務(wù)器處理小消息的速率受到限制。
FaRM 則使用了支持 遠(yuǎn)程直接內(nèi)存訪問 (Remote Direct Memory Access, RDMA) 的特殊 網(wǎng)卡 (Network Interface Card, NIC) 。RDMA 允許一臺(tái)機(jī)器上的應(yīng)用程序直接讀寫另一臺(tái)遠(yuǎn)程機(jī)器的內(nèi)存,而完全不需要遠(yuǎn)程機(jī)器 CPU 的參與,這個(gè)過程被稱為 單邊 RDMA (one-sided RDMA) 。請(qǐng)求由 NIC 直接處理,這繞過了遠(yuǎn)程服務(wù)器的整個(gè)操作系統(tǒng)內(nèi)核,幾乎消除了所有傳統(tǒng) RPC 的 CPU 開銷,讓網(wǎng)絡(luò)通信的速度真正接近硬件的極限。
FaRM 的性能秘訣(二):專為 RDMA 設(shè)計(jì)的軟件
有了強(qiáng)大的硬件,還需要同樣出色的軟件來發(fā)揮其潛力。FaRM 的軟件設(shè)計(jì)完全圍繞著如何最高效地利用 RDMA 和 NVRAM 。
系統(tǒng)架構(gòu)與角色
FaRM 是一個(gè)分片、多副本的系統(tǒng)。數(shù)據(jù)被切分成多個(gè) region,每個(gè) region 都有一個(gè)主副本和多個(gè)備份副本,以實(shí)現(xiàn)容錯(cuò)。系統(tǒng)中有三種核心角色:
- Primary (主副本) :每個(gè)數(shù)據(jù)分片有且僅有一個(gè)主副本,負(fù)責(zé)處理該分片所有的讀寫請(qǐng)求。
 - Backup (備份副本) :被動(dòng)地接收來自協(xié)調(diào)者的更新日志,保持與主副本數(shù)據(jù)一致,用于故障恢復(fù)。
 - Configuration Manager (CM, 配置管理器) :一個(gè)借助 ZooKeeper 實(shí)現(xiàn)的高可用服務(wù),負(fù)責(zé)維護(hù)集群的元數(shù)據(jù),例如哪些機(jī)器存活、數(shù)據(jù)分片的副本分布在哪些機(jī)器上等。
 
樂觀并發(fā)控制 (OCC) 的核心思想
這是本節(jié)課的重中之重。FaRM 采用 樂觀并發(fā)控制 (Optimistic Concurrency Control, OCC) 的核心原因,是為了最大化地利用單邊 RDMA 讀取的性能優(yōu)勢(shì)。
- 悲觀鎖 (如 Spanner 的 2PL):在訪問數(shù)據(jù)時(shí)首先加鎖,確保獨(dú)占。這種方式安全直接,但每次讀取都需要服務(wù)器 CPU 的介入來檢查和獲取鎖,無法利用單邊 RDMA。
 - 樂觀鎖 :假定事務(wù)之間的沖突很少發(fā)生。事務(wù)執(zhí)行時(shí),自由地讀取數(shù)據(jù),并將所有寫操作緩存在本地。直到最后提交時(shí),才進(jìn)入一個(gè)“驗(yàn)證”階段,檢查在此期間是否有其他事務(wù)修改了它讀取過的數(shù)據(jù)。如果驗(yàn)證通過,則提交成功;如果檢測(cè)到?jīng)_突,則事務(wù)中止并回滾。
 
FaRM 的四階段提交協(xié)議正是為 RDMA 量身定制的 OCC 實(shí)現(xiàn)。
剖析 FaRM 的提交協(xié)議
讓我們一步步解析這個(gè)協(xié)議(對(duì)應(yīng)論文中的 Figure 4):
- 執(zhí)行 (Execute) :作為事務(wù)協(xié)調(diào)者 (TC) 的客戶端,使用快速的單邊 RDMA 從主副本上讀取所需的對(duì)象,無需加鎖。它會(huì)記下所有讀取對(duì)象的版本號(hào),并將寫操作緩存在本地。
 - 鎖定 (LOCK) :當(dāng)事務(wù)準(zhǔn)備提交時(shí),TC 會(huì)向所有被它 寫入 的對(duì)象所在的主副本發(fā)送 
LOCK記錄。這條記錄通過 RDMA 直接寫入主副本的日志中,包含了新值和原始版本號(hào)。主副本的 CPU 在輪詢?nèi)罩緯r(shí)發(fā)現(xiàn)這條記錄,會(huì)使用一個(gè)原子操作(compare-and-swap)來檢查對(duì)象的版本號(hào)是否匹配并且未被鎖定。如果匹配,就設(shè)置鎖定標(biāo)記;否則,鎖定失敗,整個(gè)事務(wù)將中止。 - 驗(yàn)證 (VALIDATE) :對(duì)于那些只被 讀取 而未被寫入的對(duì)象,TC 無需執(zhí)行完整的加鎖操作。它會(huì)進(jìn)行一次更輕量的驗(yàn)證:通過單邊 RDMA 再次讀取這些對(duì)象的版本號(hào)。如果版本號(hào)發(fā)生了變化,或?qū)ο笠驯黄渌聞?wù)鎖定,說明發(fā)生了沖突,事務(wù)同樣會(huì)中止。這個(gè)優(yōu)化大大減少了只讀事務(wù)的開銷。
 - 提交備份 (COMMIT-BACKUP) :當(dāng)鎖定和驗(yàn)證都成功后,TC 確信事務(wù)是有效的。為了保證容錯(cuò),它會(huì)將包含所有新數(shù)據(jù)的 
COMMIT-BACKUP記錄寫入所有相關(guān)備份副本的日志中。TC 只需等待 NIC 返回的硬件 ACK,確認(rèn)數(shù)據(jù)已安全存入備份副本的 NVRAM 即可,無需等待備份副本的 CPU 進(jìn)行任何處理。 - 提交主庫(kù) (COMMIT-PRIMARY) :一旦所有備份副本都確認(rèn)收到日志,TC 會(huì)向主副本發(fā)送最終的 
COMMIT-PRIMARY記錄。至此,事務(wù)被正式視為已提交。主副本在處理這條日志時(shí),會(huì)應(yīng)用寫入、更新版本號(hào)并釋放鎖,使更改對(duì)其他事務(wù)可見。 
最后,當(dāng)事務(wù)在所有副本上都完成后,協(xié)調(diào)者會(huì)發(fā)起一個(gè) 截?cái)?(Truncate) 操作,通知各副本可以安全地刪除這條事務(wù)對(duì)應(yīng)的日志條目了。截?cái)鄷?huì)刪除某個(gè)點(diǎn)之前的所有日志,以回收空間。
解答一致性與并發(fā)的疑慮
- 執(zhí)行期間讀到不一致數(shù)據(jù)怎么辦? FaRM 確實(shí)允許在事務(wù)執(zhí)行中看到可能不一致的狀態(tài)(例如,另一個(gè)最終會(huì)中止的事務(wù)留下的中間結(jié)果)。但 FaRM 保證,任何看到這種不一致性的事務(wù),在提交時(shí)都會(huì)因驗(yàn)證失敗而被中止。因此,應(yīng)用程序需要有足夠的防御性,不能因?yàn)闀簳r(shí)的不一致而崩潰,要能堅(jiān)持到最后的提交階段,由 FaRM 來決定成敗。
 - 高并發(fā)修改同一對(duì)象會(huì)怎樣? OCC 在高沖突場(chǎng)景下表現(xiàn)不佳。如果大量事務(wù)同時(shí)修改同一個(gè)對(duì)象,大部分事務(wù)會(huì)在 
LOCK或VALIDATE階段失敗,然后不斷中止和重試,導(dǎo)致系統(tǒng)吞吐量急劇下降。FaRM 的出色性能數(shù)據(jù),很大程度上是因?yàn)槠錅y(cè)試負(fù)載的沖突率較低。 COMMIT-BACKUP期間會(huì)失敗嗎? 會(huì)。如果某個(gè)備份副本因?yàn)橛布收隙鴽]有響應(yīng),并且此時(shí) TC 也崩潰了,那么在后續(xù)的恢復(fù)流程中,這個(gè)事務(wù)可能會(huì)被中止。- 為什么論文圖 7 中延遲會(huì)飆升? 這標(biāo)志著系統(tǒng)已達(dá)到其處理能力的飽和點(diǎn)。當(dāng)客戶端發(fā)送請(qǐng)求的速率超過了服務(wù)器的處理極限時(shí),請(qǐng)求就會(huì)開始排隊(duì)等待,這種等待時(shí)間反映為延遲的急劇增加。
 
局限性與總結(jié)
FaRM 雖然強(qiáng)大,但它并非終結(jié)所有妥協(xié)的“銀彈”。它是在特定約束下取得極致性能的典范,其局限性也十分明顯:
- 高沖突敏感 :如前所述,不適用于寫沖突頻繁的應(yīng)用場(chǎng)景。
 - 內(nèi)存限制 :整個(gè)數(shù)據(jù)集必須能完全載入集群所有機(jī)器的內(nèi)存中。
 - 單數(shù)據(jù)中心 :其設(shè)計(jì)嚴(yán)重依賴數(shù)據(jù)中心內(nèi)部的低延遲網(wǎng)絡(luò),不適用于地理上分散的廣域網(wǎng)場(chǎng)景。
 - 開發(fā)復(fù)雜性 :它的 API 是回調(diào)式的,使用起來比較笨拙。應(yīng)用代碼需要自行處理輪詢和臨時(shí)不一致等問題,對(duì)開發(fā)者要求較高。
 
它適合小規(guī)模使用嗎? 完全不適合。如果你的需求只是每秒幾千次事務(wù),那么像 MySQL 這樣成熟穩(wěn)定的傳統(tǒng)數(shù)據(jù)庫(kù)是更簡(jiǎn)單、更明智的選擇。只有當(dāng)你需要支撐每秒數(shù)百萬(wàn)甚至上千萬(wàn)次事務(wù)的巨大負(fù)載時(shí),F(xiàn)aRM 的設(shè)計(jì)和復(fù)雜性才顯示出其價(jià)值。
總結(jié)
FaRM 是一篇里程碑式的論文。它向我們證明了,通過顛覆性的軟硬件協(xié)同設(shè)計(jì),我們可以在數(shù)據(jù)中心這個(gè)特定場(chǎng)景內(nèi),同時(shí)擁有 嚴(yán)格可串行化 的強(qiáng)一致性、基于多副本的 高可用性 以及無與倫比的 高性能 。它雖然是一個(gè)研究原型,但它所揭示的關(guān)于樂觀并發(fā)控制、RDMA 和 NVRAM 的潛力,為未來高性能分布式系統(tǒng)的設(shè)計(jì)開辟了全新的視野。















 
 
 












 
 
 
 