揭秘紅包場景下的高性能本地存儲架構設計
前言:紅包是最近興起的全民參與的活動,2017年新春紅包在參與人數和業務峰值上都到達了曆史新高,其中紅包除夕開獎峰值達到90W/s。近日,阿裏雲係統和塊存儲負責人、資深專家馬濤從高性能本地存儲架構設計、高性能本地存儲要點分享、高性能本地存儲性能數據等方麵分享了高性能本地存儲的實戰經驗。
以下內容根據現場分享和幻燈片整理而成。
支付寶紅包的大致業務架構包括單元化部署、統一接入、網關、DAO、數據庫以及在線\離線數據處理,整體流程很長。其中數據庫在整理的交易鏈路中起到承上啟下的作用。在紅包業務中,數據庫具有三大特點:
(1)峰值壓力大。除夕夜開獎峰值達到90W/s,但這僅僅是從業務層麵考慮,由於業務對數據庫不僅僅是一次事務的壓力,所以開獎峰值時數據庫麵臨的壓力可達百萬之多。
(2)延遲要求苛刻。數據庫單位時間內能承受的事務是有嚴格要求的,數據庫延遲降低後,會大幅降低對數據庫數目的需求,進而降低所需物理機配置,對整體的業務壓力也會大幅度降低。
(3)自帶容災。對於大型互聯網公司,他們的數據庫業務實際上是有非常完善的容災機製,數據庫具備主從複製;業務層也會有本身的容災機製。從存儲來看,上層的容災業務做得很全麵。
針對紅包業務,數據庫的需求可以概括為兩點:一是延遲要非常低,延遲要低於100us;二是IOPS一定要高,需要達到20W以上。
目前阿裏提供了三種不同的塊存儲產品,分別是SSD雲盤、高效雲盤和普通雲盤。三者詳細的對比如上圖所示,可以看到:三種塊存儲的產品都具有高可靠的優點,它們的數據可靠性都達到了99.9999999%;它們的缺點也非常明顯,IOPS和延遲不達標,IOPS最高的SSD雲盤也隻有20000,延遲最低的SSD雲盤也有500us之久,距離20w IOPS和100us延遲的要求還存在很大的差距,這就需要設計一款新的存儲產品來滿足雙十一以及紅包業務的要求。
因此,高性能本地存儲應運而生。
高性能本地存儲的設計目標是為了滿足高性能數據庫的要求,設計要點一是超高的IOPS;另一點是超低延遲。  通用的雲本地存儲常規架構如上圖所示。以MySQL數據庫為例,它通過POSIX API與雲主機內核交互,雲主機內核包括一個標準文件係統和標準的塊設備接口;雲主機內核下麵是雲物理機內核,它自上而下由標準文件係統、標準塊設備接口、硬件驅動和硬件組成。當數據庫發起IO訪問時,要經過7個模塊才能到達硬件;請求完成後,再經過7個模塊才能返回給應用層,路徑相當之長。雲主機內核和雲物理機內核中都包括標準文件係統和塊設備層,也就是說同樣的模塊可能在雲主機內跑了一遍,還需要在雲物理機上再運行一遍,功能上重疊,實現方式上也基本類似;重疊的模塊導致請求訪問時的路徑很長,對於業務和數據庫性能造成的的直觀影響是延遲高、性能差。 因此,采用通用的雲本地存儲常規架構是無法解決紅包業務的需求,也不能設計出高性能的存儲產品。那該如何將雲本地存儲的性能發揮到極致呢?我們的切入點是高性能存儲架構。  上圖是高性能存儲架構,圖中左側是標準物理機情況下存儲性能達到極致的框架:它的層次比較少,數據庫經過POSIX API直接就到標準文件係統、塊設備層、硬件驅動、硬件,請求所經過的模塊比上文提到的雲本地存儲常規架構少2-3個,性能也相對有所提升。 那麼如何在雲主機的環境下搭建一個類似物理機的環境呢?首先雲主機的必要模塊是必須保留的,應該盡可能精簡雲物理機內核中的模塊,進而達到性能的最佳值。如上圖右側所示,首先必須保留雲主機內的標準文件係統和塊設備層,因為它們和業務數據庫是息息相關的,標準文件係統提供了標準的Open、Creat、Write之類的接口,如果省去該模塊,業務是無法適配這種修改的。 對用戶而言,雲物理機內所有的修改都是透明的,因此在雲物理機上隻保留硬件驅動,從而達到最佳性能。
在雲主機內,標準文件係統是不能變化的,因為它是存儲與數據庫、業務交互的地方。因此,想要進行性能優化,隻能考慮在塊設備層、硬件驅動、硬件三個模塊入手加速本地存儲的性能。
經過一係列的調研與研發測試,最終在塊設備層使用了標準virtio blk驅動;硬件驅動使用了SPDK工具集;硬件使用了NVMe SSD。下麵對這三個模塊進行詳細的解讀與分析。
利用Virtio blk可以實現雲主機和雲物理機之間的高性能數據交互。Virtio提供了半虛擬化的接口,所謂半虛擬化就是在虛擬機和物理機之間通過某種方式(修改了虛擬機某些接口),從而使得虛擬機和物理機之間實現高速傳輸,性能比傳統的全虛擬化有所提高。
Virtio blk是標準塊設備接口,通過塊設備接口可以對塊設備進行格式化、分區、創建文件係統等標準操作,對用戶完全透明,數據庫無需任何更改。Virtio blk另一個優點是采用了Virtio協議,通過共享環交換數據。在上圖中,藍色部分是虛擬機,紅色部分是物理機。虛擬機通過Virtio Front End將數據通過Virtio Ring傳遞到後端的Virtio Back End;Virtio Back End將這些數據處理後再回傳給Virtio Front End,完成了一次數據的交互。
SPDK
除了Virtio blk之外,SPDK是另一個重要的組件。SPDK全稱是Storage Performance Development Kit,它是一組用來編寫高性能、高擴展性的用戶態存儲應用的工具集。
相比於SPDK,DPDK可能更為人知,它主要是為了解決網絡方麵的問題。SPDK在很多模塊上是與DPDK共用的,它的核心觀點是通過用戶態協議加無鎖設計加輪詢機製達到高性能:
(1)用戶態協議是指SPDK實現了用戶NVMe協議,讓用戶可以在旁路內核的情況下去訪問設備;其缺點是不支持posix API、不支持標準的文件係統,也沒有標準的設備支持,應用性較差。
(2)無鎖設計,對於高性能編程而言,無鎖設計都是核心的思想,此次不再展開。
(3)輪詢機製,SPDK提供了Polling Mode ,它摒棄了內核中常用的中斷這類的機製,消除了中斷的影響,提高了整體性能。
NVMe SSD有兩個核心點:首先SSD是PCI-E的SSD,本身的訪問速度是非常快的;采用NVMe之後,速度會更快,NVMe是用來代替SCSI的新協議,它具有高帶寬、低延遲的特點,比SCSI協議更簡單高效,提高了係統整體的性能。
高性能本地雲儲存的數據鏈路如上圖所示,在雲主機中,核心數據庫、POSIX API和標準文件係統保持不變。雲數據庫通過標準的POSIX API 訪問標準文件係統;標準文件係統通過Virtio-Blk和SPDK用戶態驅動直接交互,在SPDK用戶態驅動中再與NVMe SSD交互,減少了數據鏈路的長度,同時提高了IO性能。
高性能本地雲儲存搭建之後,我們使用了fio磁盤測試工具在CentOS7上對通用虛擬化架構本地盤和阿裏雲高性能本地存儲的隨機IO平均延遲進行了對比測試。測試時塊設備IO調度器均設置為noop,測試參數為--direct=1--bs=4k--iodepth=1--numjobs=1。
從上圖可以看出,在隨機讀兩方麵,阿裏雲高IO本地盤延遲隻有70us左右,而通用虛擬化架構本地盤延遲在130us左右;隨機寫方麵,阿裏雲高IO本地盤的延遲隻有30us左右;通用虛擬化架構本地盤延遲在60us左右。
上圖是新舊數據庫Index-Update性能對比,可以看到:在舊數據庫實例的情況下,TPS隻有14242.65、RT為8.21ms;新數據庫實例下,TPS可以達到26969.81、RT為1.7ms,整體性能大幅度提升。
釋放紅包技術福利,即將在公有雲上線
通過延遲分布和數據庫性能的對比,可以看出高本地雲存儲對性能提升起到了很大的作用,在紅包活動中發揮了很大的作用。在完成雙十一及紅包活動之後,阿裏雲希望將高性能本地雲存儲技術推廣給其他用戶使用。因此,在今年2月底,高性能本地雲存儲在公共雲上線,它的技術架構與支撐支付寶紅包的技術架構相同:采用NVMe SSD+SPDK技術,也是全球首家采用該技術的高性能本地盤。
本地盤2.0性能非常好,容量為3TB、IOPS為50萬、延遲為50us、帶寬為4GB。具體參數如下表所示:
可以看出,最優產品讀寫IOPS單盤可達24000;讀帶寬達2GBps;寫帶寬為1.2GBps。
有了本地盤作為基礎,如果想要實現高性能本地存儲實例,還需要在計算性能、存儲IO性能、網絡性能上進行相應地提升:
(1)為了保證計算性能穩定,采用了Intel Xeon E5-2682 v4(Broadwell)處理器,主頻為2.5GHz,DDR4內存。
(2)為了保證存儲IO性能穩定,采用了基於NVMe SSD和SPDK技術,提供高達數十萬隨機IO讀寫能力的同時,保持在us級別的時延水平。
(3)網絡性能方麵,實例網絡性能與計算規格相對應(實例計算規格越大則網絡性能越強)。
綜上所述,將SPDK與NVMe SSD技術結合起來,能夠讓本地盤接近或類似物理機的性能,在雙十一以及新春紅包這類峰值壓力很大的場景下,性能依舊很好。
最後更新:2017-06-19 19:32:47