天天看點

2017雙11技術揭秘—阿裡資料庫計算存儲分離與離線上混布

作者:呂建樞(呂健)

随着阿裡集團電商、物流、大文娛等業務的蓬勃發展,資料庫執行個體以及資料存儲規模不斷增長,在傳統基于單機的運維以及管理模式下,遇到非常多的困難與挑戰,主要歸結為:

機型采購與預算問題

在單機模式下計算資源(CPU和記憶體)與存儲資源(主要為磁盤或者SSD)存在着不可調和的沖突;計算與存儲資源綁定緊密,無法進行單獨預算。資料庫存儲時,要麼計算資源達到瓶頸,要麼是存儲單機存儲容量不足。這種綁定模式下,注定了有一種資源必須是浪費的。

排程效率問題

在計算與存儲綁定的情況下,計算資源無法做無狀态排程,導緻無法實作大規模低成本排程,也就無法與在大促與離線資源進行混布。

大促成本問題

在計算資源無法做到排程後,離線混布就不再可能;為了大促需要采購更多的機器,大促成本上漲嚴重。

是以,為了解決諸多如成本,排程效率等問題,2017年首次對資料庫實作計算存儲分離;計算存儲分離後,再将計算節點與離線資源混布,達到節省大促成本的目的。

2017年資料庫計算存儲分離,

使得資料庫進行大規模無狀态化容器排程成為可能!

使得資料庫與離線業務混布成為可能!

使得低成本支援大促彈性成為可能!

在高吞吐下,總存儲叢集整體RT表現平穩,與離線資源聯合首次發力,完成2017年“11.11”大促的交易支撐。

在所有業務中,資料庫的計算存儲分離最難,這是大家公認的。因為資料庫對于存儲的穩定性以及單路端到端的時延有着極緻的要求:

在分布式存儲的穩定性方面,我們做了非常多的有意探索,并且逐一落地。這些新技術的落地,使得資料庫計算存儲分離成為可能:

單機failover我們做到業界的極緻,5s内完成fo,對整體叢集的影響在4%以内(以叢集規模24台為例,叢集機器越多,影響越小)。另外,我們對分布式存儲的狀态機進行加速優化,使得基于paxos的選舉在秒級内進行叢集視圖更新推送。

計算存儲分離後,所有的IO都變成了網絡IO,是以對于單路IO時延影響的因素非常多,如網絡抖動,慢盤,負載等,而這些因素也是不可避免的。我們設計了“副本達成多數寫入即傳回的政策(commit majority feature)”,能夠有效地使長尾時延抖動做到合理的控制,以滿足業務的需求。

以下是commit majority feature開起前後的效果對比。其中“藍色”為優化後的長尾時延,“紅色”為優化前長尾時延,效果非常顯著。

2017雙11技術揭秘—阿裡資料庫計算存儲分離與離線上混布

我們實作了基于滑動視窗的流控功能,使得叢集背景活動(如backfill和recovery)能根據目前的業務流量進行自适配的調整,在業務與背景資料恢複之間做到最佳平衡。

一般如果叢集後端活動太低,會影響資料恢複,這會提高多盤故障的機率,降低了資料的可靠性。我們經過優化後,通過滑動視窗機制,做到了前後端資料寫入的速動,在不影響業務寫入的情況下,盡最大可能提高資料恢複速度,保證多副本資料的完整性。

提高資料重平衡的速度,也是為了保證整個叢集的性能。因為一出現資料傾斜時,部分盤的負載将變大,進而會影響整個叢集的時延和吞吐。

流控效果如下:

2017雙11技術揭秘—阿裡資料庫計算存儲分離與離線上混布

在高可用部署上,我們引入的故障域的概念。多個資料副本存儲在多個故障域,分布到至少4個RACK以上的機架上,用于保障底層機櫃電源以及網絡交換裝置引起的故障等。

為了能夠更好的了解資料副本存儲位置(data locality),需要知道資料散射度(scatter width)的概念。怎麼來了解資料散射度?

舉個例子:我們定義三個copy set(存放的都是不同的資料):{1,2,3},{4,5,6},{7,8,9}。任意一組copy set中存放的資料沒有重複,也就是說一份資料的三個副本分别放置在:{1,4,7}或者{2,5,8}或者{3,6,9}。那麼這個時候,其資料散射度遠小于随機組合的C(9,3)。

随機組合時,任意3台機器Down機都會存在資料丢失。而采用此方案後,隻有當{1,4,7}或者{2,5,8}或者{3,6,9}其中的任意一個組合不可用時,才會影響高可用性,才會有資料丢失。

綜上可知,我們引入copy set的目标就是盡量的降低資料散射度“S”。下圖中兩組replica set,其中每一組的三個副本分别放置到不同的RACK中。

2017雙11技術揭秘—阿裡資料庫計算存儲分離與離線上混布

我們的優化還有很多,這裡不再一一列舉。

當所有的IO都變成網絡IO後,我們要做的就是如何減少單路IO的延遲,當然這個是分布式存儲以及網絡要解的問題。

分布式存儲需要優化自身的軟體stack以及底層SPDK的結合等。

而網絡層則需要更高帶寬以及低延遲時間技術,如25G TCP或者25G RDMA,或者100G等更高帶寬的網絡等。

但是我們可以從另外一個角度來考慮問題,如何在時延一定的情況下,提高并發量,進而來提高吞吐。或者說在關鍵路徑上減少IO調用的次數,進而從某種程度上提高系統的吞吐。

大家知道,影響資料庫事務數的最關鍵因素就是事務commit的速度,commit的速度依賴于寫REDO時的IO吞吐。所謂的REDO也就是大家熟知的WAL(Write Ahead Log)日志。

在髒資料flush回存儲時,日志必須先落地,這是因為資料庫的Crash Recovery是重度以來于此的。在recovery階段,資料庫先利用redo進行roll forward,再利用undo進行roll backward,最後再撤銷使用者未送出的事務。

是以,存儲計算分離下,要想在單路IO時延一定時提高吞吐,就必須要優化commit送出時的效率。我們通過優化redo的寫入方式,讓整個提高吞吐100%左右。另外,也可以優化redo group commit的大小,結合底層存儲stripe能力,做并發與吞吐優化。

在資料庫記憶體模型中,資料頁通常是以16K做為一個bufferpage來管理的。當核心修改完資料之後,會有專門的“checkpoint”線程按一定的頻率将Dirty Page flush到磁盤上。我們知道,通常os的page cache是4K,而一般的檔案系統block size也是4K。是以一個16k和page會被分成4個4k的os filesystem block size來存儲,實體上不能保證連續性。

那麼會帶來一個嚴重的問題,就是當fsync語義發出時,一個16k的pageflush,隻完成其中的8k,而這個時候client端crash,不再會有重試;那麼整個fsync就隻寫了一半,fsync語義被破壞,資料不完整。上面的這個場景,我們稱之為“partial write”。

對于MySQL而言,在本地存儲時,使用Double Write Buffer問題不大。但是如果底層變成網絡IO,IO時延變高時,會使MySQL的整體吞吐下降,而Double Write Buffer會加重這個影響。

我們實作了原子寫,關閉掉Double Write Buffer,進而在高并發壓力及高網絡IO時延下,讓吞吐至少提高50%以上。

分布式存儲,對于網絡的帶寬要求極高,我們引入了25G網絡。高帶寬能更好的支援阿裡集團的大促業務。另外,對于存儲叢集背景的活動,如資料重平衡以及恢複都提供了有力的保障。

計算存儲分離後,離線上混布成為可能;今年完成資料庫離線上混布,為2017年大促節省了計算資源成本。

在與離線混布的方案中,我們對資料庫與離線任務混跑的場景進行了大量的測試。

實踐證明,資料庫對時延極度敏感,是以為了達到資料庫混布的目的,我們采用了以下的隔離方案:

CPU的L3是被各個核共享的,如果在一個socket内部進行排程,會對資料庫業務有抖動。是以,在大促場景下,我們會對CPU進行獨立socket 綁定,避免L3 cache幹擾;另外,記憶體不超賣。當然,大促結束後,在業務平峰時,可以擇機進行排程和超賣。

我們對資料庫線上業務進行網絡打标,NetQoS中将資料庫計算節點的所有通信元件加入到高優先級group中。

基于分布式存儲,底層分布式存儲支援多點mount,用于将計算節點快速彈性到離線機器。

另外,資料庫Buffer Pool可以進行動态擴容。大促ODPS任務撤離,DB執行個體Buffer Pool擴容;大促結束後,Buffer Pool回縮到平峰業務時的大小。

大促期間,其中一個庫吞吐達到将近3w tps,RT在1ms以内,基本上與本地相當,很好的支撐了2017年大促。這就是我們今年所做的諸多技術創新的結果。

目前我們正在進行軟硬體結合(RDMA,SPDK)以及上層資料庫引擎與分布式存儲融合優化,性能将會超出傳統SATA SSD本地盤的性能。

RDMA和SPDK的特點就是kernel pass-by。未來,我們資料庫将引入全使用者态IO Stack,從計算節點到存儲節點使用使用者态技術,更能充分滿足集團電商業務對高吞吐低延遲時間的極緻要求。

這些網絡和硬體技術的發展,将會給“雲計算”帶來更多的可能性,也會給真正的“雲計算”新的商業模式帶來更多憧憬,而我們已經在這條陽光的大道上。

歡迎有更多的存儲及資料庫核心專家一起參與進來,一起攜手邁進未來。

【引用】

[1] Copysets:Reducing the Frequency of Data Loss in Cloud Storage

[2] CRUSH: Controlled,Scalable, Decentralized Placement of Replicated Data