7x24 高可用是怎樣煉成的?
現實世界中單點故障是常态,確定故障下業務連續性是高可用系統的核心能力,那麼在金融、保險、政務等關鍵應用中,如何保證業務 7*24 高可用?通常來講,業務系統由計算、網絡、存儲組成,在雲上,網絡多路徑和存儲分布式確定了穩定高可用,但要實作業務全鍊路高可用,還要解決計算和業務側單點故障。以常見的資料庫為例,單點故障導緻業務停止對于使用者難以接受,那麼,當斷電、當機、硬體故障等導緻執行個體不可服務時,如何快速恢複業務?
不同場景的解決方案有所不同,MySQL 通常搭建主從/主備架構實作業務高可用,主庫故障時切換到備庫持續對外提供服務。但執行個體切換後,如何保證主從庫資料的一緻性?根據業務對資料丢失的容忍度,MySQL 通常采用同步或異步方式進行資料複制,由此引入額外的問題:部分場景下導緻資料缺失、同步資料影響系統性能、業務擴容要新增整套裝置并進行全量資料複制、主備切換時間較長影響業務連續性等。可以看到,為了搭建高可用系統,架構将變得複雜,且很難兼顧可用性、可靠性、擴充性、成本、性能等,那麼是否有更加先進的方案,兼得魚和熊掌?答案必須是:Yes!

圖1:資料庫的高可用架構
通過共享存儲,不同資料庫執行個體間可共享同一份資料,進而通過計算執行個體的快速切換獲得高可用(圖1),Oracle RAC、AWS Aurora、阿裡雲 PolarDB 資料庫就是其中的代表。這裡的關鍵在于共享存儲,傳統 SAN 價格高昂,擴縮容麻煩,機頭也容易成為瓶頸,其使用門檻較高對使用者并不友好,有沒有更好、更快、更省的共享存儲,來解決使用者的痛點呢?阿裡雲最近推出的 NVMe 雲盤和共享特性,将充分滿足使用者的訴求,接下來我們将重點介紹。這裡給大家抛出一個問題,在執行個體切換過後,如果原庫仍在寫入資料,如何保證資料正确性?賣個關子,讀者可以先思考下。

圖2:主從切換場景的資料正确性問題
曆史前進的車輪:雲上 SAN 和NVMe
我們已步入“資料石油”的數字經濟時代,雲計算、人工智能、物聯網、5G 等技術的快速發展,促使資料的爆炸式增長。從 IDC 2020 年報告可以看出,全球資料規模逐年增長,2025 年将達到 175 ZB,資料将主要集中在公共雲和企業資料中心。資料的快速增長,為存儲的發展提供了新的動力和要求,讓我們回憶下塊存儲形态是如何一步步演進的。

圖3:塊存儲形态演進
DAS:儲存設備采用直連方式(SCSI、SAS、FC 等協定)與主機連接配接,系統簡單、易于配置管理、費用較低,由于存儲資源無法被充分利用和共享,難以做到集中統⼀的管理和維護。
SAN:通過專用網路連接配接存儲陣列和業務主機,解決了統一管理和資料共享等問題,并實作高性能低延遲的資料通路,不過 SAN 存儲價格昂貴、運維複雜、可擴充性差,提高了使用者的使用門檻。
全閃:底層存儲媒體的革命和成本的下降,标志着全閃存時代的到來,從此存儲性能轉移到軟體棧,迫使軟體進行大規模的變革,促進了使用者态協定、軟硬一體化、RDMA 等技術的高速發展,帶來了存儲性能的飛越。
雲盤:雲計算的高速發展曆程中,存儲轉移到雲上,雲盤具有天生的優點:靈活、彈性、易用、易擴充、高可靠、大容量、低成本、免運維等,在數字化轉型曆程中成為存儲堅實的底座。
雲上 SAN:為全方面支援存儲業務,取代傳統的 SAN 存儲,雲上 SAN 應時代而生,它繼承了雲盤的諸多優勢,也具備了傳統 SAN 存儲能力,包括共享存儲、資料保護、同步/異步複制、極速快照等特性,必将在企業存儲市場持續發光發熱。
另一端,在存儲協定的演進上,NVMe 正在成為新時代的寵兒。

圖4:存儲協定的演進
SCSI/SATA:存儲遠古時代,硬碟多為低速裝置,資料經過 SCSI 層和 SATA 總線傳輸資料,性能受限于存儲慢速媒體,如機械硬碟,掩蓋了 SATA 單通道和 SCSI 軟體層的性能劣勢。
VirtIO-BLK/VirtIO-SCSI:伴随着虛拟化技術和雲計算的快速發展,VirtIO-BLK/VirtIO-SCSI 逐漸成為雲計算的主流存儲協定,使得存儲資源的使用更加彈性、靈活、安全、可擴充。
NVMe/NVMe-oF:閃存技術的發展和普及推動了新一代存儲技術革命,當存儲媒體不再成為性能的攔路虎,軟體棧成為了最大的瓶頸,由此催生了 NVMe/NVMe-oF、DPDK/SPDK、使用者态網絡等各種高性能輕量級協定,NVMe 協定族兼具高性能、進階特性和高擴充性,必将引領雲計算新時代。
在可遇見的未來,雲上 SAN 和 NVMe 必将成為未來的潮流,這是大勢所趨。
雲盤新時代之 NVMe
閃存技術的迅速發展和普及,将性能瓶頸轉移到軟體側,對于存儲性能和功能的更多需求,将 NVMe 推上了曆史舞台。NVMe 專門針對高性能裝置設計了資料通路協定,相比傳統的 SCSI 協定,更加簡捷輕量,配合多隊列技術,能大幅度提升存儲性能。同時 NVMe 還提供了豐富的存儲特性,NVMe 标準自 2011 年誕生以來,通過不斷完善協定,規範了多 Namespace、Multi-Path、全鍊路資料保護 T10-DIF、Persistent Revervation 權限控制協定、原子寫等衆多進階功能,其定義的存儲新特性将持續幫助使用者創造價值。

圖5:阿裡雲 NVMe 雲盤
NVMe 的高性能和豐富特性,為企業存儲提供了堅實的基礎,加上協定本身具備的擴充性和成長性,成為演進 NVMe 雲盤的核心動力。NVMe 雲盤以 ESSD 為基礎,它繼承了 ESSD 的高可靠、高可用、高性能、原子寫等能力,以及 ESSD 原生快照資料保護、跨域容災、加密、秒級性能變配等企業特性,ESSD 和 NVMe 特性的融合,能有效的滿足企業級應用需求,使大部分基于 NVMe 和 SCSI 的業務無縫上雲。本文講述的共享存儲技術就是基于NVMe Persistent Reservation 标準實作,作為 NVMe 雲盤的附加功能之一,其多重挂載和 IO Fencing 技術,可以幫助使用者大幅降低存儲成本,并有效提升業務靈活性和資料可靠性,在分布式業務場景具有廣泛的應用,特别對于 Oracle RAC、SAP Hana 等高可用資料庫系統具有重要價值。
企業存儲利器:共享存儲
前面講到,共享存儲可以有效地解決資料庫高可用問題,其主要依賴的能力包括多重挂載和 IO Fencing,以資料庫為例,我們将講述它們是如何發揮作用的。
業務高可用關鍵 -- 多重挂載
多重挂載允許雲盤被同時挂載到多台 ECS 執行個體上(目前最大支援 16),所有執行個體均可讀寫通路該雲盤(圖6)。通過多重挂載,多個節點間共享同一份資料,能有效地降低存儲成本。當單節點發生故障時,業務可以迅速切換到健康節點,該過程無需進行資料複制,為故障快速恢複提供了原子能力,如 Oracle RAC、SAP HANA 等高可用資料庫均依賴該特性實作。需要留意的是,共享存儲提供了資料層的一緻性和恢複能力,若要達到最終業務一緻性,業務可能需要進行額外處理,如資料庫的日志 replay 等。

圖6:多執行個體挂載
通常,單機檔案系統不适合作為多重挂載的檔案系統,為了加速檔案通路,ext4 等檔案系統會對資料和中繼資料進行緩存,對于檔案的修改資訊無法及時同步到其他節點,進而導緻多節點間資料的不一緻。中繼資料的不同步,也會導緻節點間對硬碟空間通路的沖突,進而引入資料錯。是以,多重挂載通常要配合叢集檔案系統使用,常見的有 OCFS2、GFS2、GPFS、Veritas CFS、Oracle ACFS 等,阿裡雲 DBFS、PolarFS 也具備該能力。
有了多重挂載,是否就可以高枕無憂了?多重挂載并非萬能,它有自身無法解決的盲點:權限管理。通常基于多重挂載的應用需要依賴叢集管理系統來管理權限,如 Linux Pacemaker 等,但在某些場景下,權限管理會失效進而導緻嚴重問題。回憶下文章最開始抛出的問題,在高可用架構下,主執行個體發生異常後會切換到備執行個體,如果主執行個體處于假死狀态(如網絡分區、硬體故障等場景),它會錯誤地認為自己擁有寫入權限,進而和備執行個體一起寫髒資料,如何規避該風險? 此時該輪到 IO Fencing 出場了。
資料正确性保證 -- IO Fencing
解決髒資料寫入的可選方案之一是:終止原執行個體的在途請求,并拒絕新請求繼續下發,確定舊資料不再寫入後切換執行個體。基于該思路,傳統的解決方案是 STONITH(shoot the other node in the head),即通過遠端重新開機該故障機器來防止舊資料落盤。不過該方案存在兩個問題,首先,重新開機流程過長,業務切換較慢,通常會導緻幾十秒到分鐘級的業務停止。更嚴重的是,由于雲上 IO 路徑較長,涉及元件較多,計算執行個體的元件故障(如硬體、網絡故障等)都有幾率導緻 IO 在短時間内無法恢複,是以無法 100% 保證資料的正确性。
為了從根本性解決該問題, NVMe 規範了 Persistent Reservation(PR)能力,它定義了 NVMe 雲盤的權限配置規則,可以靈活地修改雲盤和挂載節點權限。具體到該場景,在主庫發生故障後,從庫首先發送 PR 指令禁止主庫的寫入權限,拒絕主庫的所有在途請求,此時從庫可以無風險的進行資料更新(圖7)。IO Fencing 通常可以在毫秒級别協助應用完成故障切換,大幅縮短了故障恢複時間,業務的平滑遷移使上層應用基本無感覺,相比于 STONITH 有了質的飛越。接下來我們進一步介紹 IO Fencing 的權限管理技術。

圖7:IO Fencing 在故障切換下的應用
權限管理的瑞士軍刀 -- Persistent Reservation
NVMe Persistent Reservation (PR) 協定定義了雲盤和用戶端權限,搭配多重挂載能力,可以高效、安全、平穩地進行業務切換。在 PR 協定中,挂載節點有 3 種身份,分别是 Holder(所有者)、Registerant(注冊者)、Non-Registrant(訪客),從名字可以看出,所有者擁有雲盤全部權限,注冊者擁有部分權限,訪客隻擁有讀權限。同時,雲盤擁有 6 種共享模式,可實作獨占、一寫多讀、多寫能力,通過配置共享模式和角色身份,可以靈活地管理各節點權限(表1),進而滿足豐富的業務場景需求。NVMe PR 繼承了 SCSI PR 的全部能力,所有基于 SCSI PR 的應用可以通過少量的改動即可運作在 NVMe 共享雲盤之上。

表1:NVMe Persistent Reservation權限表
多重挂載配合 IO Fencing 能力,可以完美搭建高可用系統,除此之外,NVMe 共享盤還能提供一寫多讀能力,并廣泛應用于讀寫分離的資料庫、機器學習模型訓練、流式處理等場景。另外,鏡像共享、心跳探活、仲裁選主、鎖機制等技術可以通過共享雲盤輕松實作。
圖8:NVMe 共享盤一寫多讀應用場景
NVMe 雲盤技術揭秘
NVMe 雲盤基于計算存儲分離架構實作,依托于神龍硬體平台實作了高效的 NVMe 虛拟化和極速 IO 路徑,以盤古2.0 存儲為底座實作了高可靠、高可用、高性能,計算存儲通過使用者态網絡協定和 RDMA 互連,NVMe 雲盤是全棧高性能和高可用技術的結晶(圖9)。

圖9:NVMe 共享盤技術架構
NVMe 硬體虛拟化:以神龍 MOC 平台打造了 NVMe 硬體虛拟化技術,通過 Send Queue(SQ) 和 Completion Queue(CQ) 進行資料流和控制流的高效互動,簡潔的 NVMe 協定加上高效的設計,配合硬體解除安裝技術,使 NVMe 虛拟化延遲降低 30%。
極速 IO 通道:基于神龍 MoC 軟硬一體化技術實作了極速 IO 通道,有效縮短了 IO 通路,進而獲得極緻的性能。
使用者态協定:NVMe 使用了全新一代 Solar-RDMA 使用者态網絡通信協定,結合 Leap-CC 自研擁塞控制實作了資料可靠傳輸并降低了網絡長尾延遲,基于 25G 網絡的 JamboFrame 實作了高效的大包傳輸,通過資料面和控制面全面分離精簡了網絡軟體棧并提升了性能,網絡多路徑技術支撐了鍊路故障毫秒級恢複。
管控高可用:以盤古 2.0 分布式高可用存儲實作了 NVMe 控制中心,NVMe 控制指令不再經過管控節點,進而獲得接近 IO 的可靠性和可用性,可協助使用者實作毫秒級别的業務切換;基于 NVMe 控制中心實作了多用戶端和多伺服器間的精确流控,在亞秒級内實作對于 IO 的精确分布式流控;在分布式系統上實作了對于多節點的 IO Fencing 一緻性,通過兩階段更新使雲盤分區之間權限狀态保持一緻,有效解決了分區權限的腦裂問題。
大 IO 原子性:基于分布式系統從計算、網絡、存儲端到端實作了大 IO 的原子寫能力,在 IO 不跨越相鄰 128K 邊界的條件下,確定同一資料不會部分落盤,這對于資料庫等依賴原子寫的應用場景具有重要作用,它能有效優化資料庫 double write 流程,進而大幅提升資料庫的寫入性能。
目前現狀和未來展望
可以看出,目前 NVMe 雲盤結合了業界最先進的軟硬體技術,在雲存儲市場,首創性同時實作了 NVMe 協定 + 共享通路 + IO Fencing 技術。它在 ESSD 之上獲得了高可靠、高可用、高性能,同時基于 NVMe 協定實作了豐富的企業特性,如多重挂載、IO Fencing、加密、離線擴容、原生快照、異步複制等功能。

圖10:全球首次 NVMe + 共享通路 + IO Fencing 技術融合
目前 NVMe 雲盤和 NVMe 共享盤已在邀測中,并得到了 Oracle RAC、SAP HANA 和内部資料庫團隊的初步認證,接下來它将進一步擴大公測範圍并商業化。在可預見的未來,我們會逐漸圍繞 NVMe 雲盤持續演進,以更好地支援線上擴容、全鍊路資料保護 T10-DIF、雲盤多 namespace 等進階特性,進而進化出全面的雲上 SAN 能力,敬請期待!
Vendor 1 | Vendor 2 | Vendor 3 | 阿裡雲 | |
雲盤協定 | SCSI | NVMe | ||
多重挂載 | ✓ | |||
IO Fencing | × | |||
資料持久性 | N/A | 9個9 | 5個9 | |
IO延遲 | > 300 us | 100~200 us | < 100 us | |
雲盤最大IOPS | 160K | 128K | 256K | 1000K |
雲盤最大吞吐 | 2GB/s | 1GB/s | 4GB/s |
表2:主流雲計算廠商的塊存儲概覽
原創作品:阿裡雲存儲 阿綸