淘寶開源海量數(shù)據(jù)庫OceanBase 重CA
OceanBase是一個(gè)支持海量數(shù)據(jù)的高性能分布式數(shù)據(jù)庫系統(tǒng),實(shí)現(xiàn)了數(shù)千億條記錄、數(shù)百TB數(shù)據(jù)上的跨行跨表事務(wù),由淘寶核心系統(tǒng)研發(fā)部、運(yùn)維、DBA、廣告、應(yīng)用研發(fā)等部門共同完成。
OceanBase解決什么問題
許多公司的核心資產(chǎn)是各種各樣的商業(yè)數(shù)據(jù),例如淘寶的商品、交易、訂單、購物愛好等等,這些數(shù)據(jù)通常是結(jié)構(gòu)化的,并且數(shù)據(jù)之間存在各種各樣的關(guān)聯(lián),傳統(tǒng)的關(guān)系數(shù)據(jù)庫曾經(jīng)是這些數(shù)據(jù)的最佳載體。然而,隨著業(yè)務(wù)的快速發(fā)展,這些數(shù)據(jù)急劇膨脹,記錄數(shù)從幾千萬條增加到數(shù)十億條,數(shù)據(jù)量從百GB增加到數(shù)TB,未來還可能增加到數(shù)千億條和數(shù)百TB,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫已經(jīng)無法承擔(dān)如此海量的數(shù)據(jù)。OceanBase解決不斷增加的結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)與查詢的問題。
從Eric Brewer教授的CAP(一致性C: Consistency, 可用性A: Availability,分區(qū)容錯(cuò)性P: Tolerance of network Partition)理論角度分析,作為電子商務(wù)企業(yè),淘寶和其他公司的業(yè)務(wù)對(duì)一致性和可用性的要求高于分區(qū)容錯(cuò)性,數(shù)據(jù)特征是數(shù)據(jù)總量龐大且逐步增加,單位時(shí)間內(nèi)的數(shù)據(jù)更新量并不大,但實(shí)時(shí)性要求很高。這就要求我們提供一套更加偏重于支持CA特性的系統(tǒng),同時(shí)兼顧可分區(qū)性,并且在實(shí)時(shí)性、成本、性能等方面表現(xiàn)良好。
OceanBase的架構(gòu)
OceanBase的邏輯架構(gòu)簡圖
OceanBase架構(gòu)的一些基本概念
主鍵
row key,也稱為primary key,類似于DBMS的主鍵,與DBMS不同的是,OceanBase的主鍵總是二進(jìn)制字符串(binary string),但可以有某種結(jié)構(gòu)。OceanBase以主鍵為順序存放表格數(shù)據(jù)
sstable
一種數(shù)據(jù)存儲(chǔ)格式,OceanBase用來存儲(chǔ)一個(gè)或幾個(gè)表的一段按主鍵連續(xù)的數(shù)據(jù)
tablet
一個(gè)表按主鍵劃分的一個(gè)(前開后閉的)范圍,通常包含一個(gè)或幾個(gè)sstable,一個(gè)tablet的數(shù)據(jù)量通常在256MB左右
基準(zhǔn)數(shù)據(jù)和動(dòng)態(tài)數(shù)據(jù)
OceanBase以增量方式記錄一段時(shí)間內(nèi)的表格數(shù)據(jù)的增刪改,從而保持著表格主體數(shù)據(jù)在一段時(shí)間內(nèi)相對(duì)穩(wěn)定,其中增刪改的數(shù)據(jù)稱為動(dòng)態(tài)數(shù)據(jù)(通常在內(nèi)存,也稱為內(nèi)存表),而一段時(shí)間內(nèi)相對(duì)穩(wěn)定的主體數(shù)據(jù)稱為基準(zhǔn)數(shù)據(jù),基準(zhǔn)數(shù)據(jù)和轉(zhuǎn)儲(chǔ)后(保存到SSD固態(tài)盤或磁盤)的動(dòng)態(tài)數(shù)據(jù)以sstable格式存儲(chǔ)
ChunkServer
保存基準(zhǔn)數(shù)據(jù)的服務(wù)器,通常是多臺(tái),為了避免軟件硬件故障導(dǎo)致的服務(wù)中斷,同一份基準(zhǔn)數(shù)據(jù)通常保存了3份并存儲(chǔ)在不同ChunkServer上
UpdateServer
保存動(dòng)態(tài)數(shù)據(jù)的服務(wù)器,一般是單臺(tái)服務(wù)器。為了避免軟件硬件故障導(dǎo)致的服務(wù)中斷,UpdateServer記錄commit log并通常使用雙機(jī)熱備
MergeServer
進(jìn)行靜態(tài)動(dòng)態(tài)數(shù)據(jù)合并的服務(wù)器,常常與ChunkServer共用一臺(tái)物理服務(wù)器。MergeServer使得用戶能夠訪問到完整的最新的數(shù)據(jù)
RootServer
配置服務(wù)器,一般是單臺(tái)服務(wù)器。為了避免軟件硬件故障導(dǎo)致的服務(wù)中斷,RootServer記錄commit log并通常采用雙機(jī)熱備。由于RootServer負(fù)載一般都很輕,所以它常常與UpdateServer共用物理機(jī)器
凍結(jié)
指動(dòng)態(tài)數(shù)據(jù)(也稱為內(nèi)存表)的更新到一定時(shí)間或者數(shù)據(jù)量達(dá)到一定規(guī)模后,OceanBase停止該塊動(dòng)態(tài)數(shù)據(jù)的修改,后續(xù)的更新寫入新的動(dòng)態(tài)數(shù)據(jù)塊(即新的內(nèi)存表),舊的動(dòng)態(tài)數(shù)據(jù)塊不再修改,這個(gè)過程稱為凍結(jié)
轉(zhuǎn)儲(chǔ)
出于節(jié)省內(nèi)存或者持久化等原因?qū)⒁粋€(gè)凍結(jié)的動(dòng)態(tài)數(shù)據(jù)塊(內(nèi)存表)持久化(轉(zhuǎn)化為sstable并保存到SSD固態(tài)盤或磁盤上)的過程
數(shù)據(jù)合并(merge)
查詢時(shí),查詢項(xiàng)的基準(zhǔn)數(shù)據(jù)與其動(dòng)態(tài)數(shù)據(jù)(即增刪改操作)合并以得到該數(shù)據(jù)項(xiàng)的最新結(jié)果的過程。此外,把舊的基準(zhǔn)數(shù)據(jù)與凍結(jié)的動(dòng)態(tài)數(shù)據(jù)進(jìn)行合并生成新的基準(zhǔn)數(shù)據(jù)的過程也稱為數(shù)據(jù)合并
聯(lián)表(join)
一張表與另一張或幾張表基于主鍵的左連接關(guān)系,類似于DBMS的自然連接
COW
Copy on Write的縮寫,在OceanBase中特指BTree在更新時(shí)復(fù)制數(shù)據(jù)備份寫入,避免系統(tǒng)鎖的技術(shù)手段
#p#
OceanBase的特點(diǎn)
OceanBase功能
OceanBase設(shè)計(jì)和實(shí)現(xiàn)的時(shí)候暫時(shí)摒棄了不緊急的DBMS的功能,例如臨時(shí)表,視圖(view),研發(fā)團(tuán)隊(duì)把有限的資源集中到關(guān)鍵點(diǎn)上,當(dāng)前OceanBase主要解決數(shù)據(jù)更新一致性、高性能的跨表讀事務(wù)、范圍查詢、join、數(shù)據(jù)全量及增量dump、批量數(shù)據(jù)導(dǎo)入。
OceanBase數(shù)據(jù)訪問特點(diǎn)
雖然數(shù)據(jù)總量比較大,但跟許多行業(yè)一樣,淘寶業(yè)務(wù)一段時(shí)間(例如小時(shí)或天)內(nèi)數(shù)據(jù)的增刪改是有限的(通常一天不超過幾千萬次到幾億次),根據(jù)這個(gè)特點(diǎn),OceanBase把一段時(shí)間內(nèi)的增刪改等修改操作以增量形式記錄下來(稱之為動(dòng)態(tài)數(shù)據(jù),通常保存在內(nèi)存中),這樣也使得了主體數(shù)據(jù)在一段時(shí)間內(nèi)保持了相對(duì)穩(wěn)定(稱之為基準(zhǔn)數(shù)據(jù))。
由于動(dòng)態(tài)數(shù)據(jù)相對(duì)較小,通常情況下,OceanBase把它保存在獨(dú)立的服務(wù)器UpdateServer的內(nèi)存中。以內(nèi)存保存增刪改記錄極大地提高了系統(tǒng)寫事務(wù)的性能。此外,假如每條修改平均消耗100 Bytes,那么10GB內(nèi)存可以記錄100M(即1億)條修改,且擴(kuò)充UpdateServer內(nèi)存即增加了內(nèi)存中容納的修改量。不僅如此,由于凍結(jié)后的內(nèi)存表不再修改,它也可以轉(zhuǎn)換成sstable格式并保存到SSD固態(tài)盤或磁盤上。轉(zhuǎn)儲(chǔ)到SSD固態(tài)盤后所占內(nèi)存即可釋放,并仍然可以提供較高性能的讀服務(wù),這也緩解了極端情況下UpdateServer的內(nèi)存需求。為了應(yīng)對(duì)機(jī)器故障,動(dòng)態(tài)數(shù)據(jù)服務(wù)器UpdateServer寫commit log并采取雙機(jī)(乃至多機(jī))熱備。由于UpdateServer的主備機(jī)是同步的,因此備機(jī)也可同時(shí)提供讀服務(wù)。
因?yàn)榛鶞?zhǔn)數(shù)據(jù)相對(duì)穩(wěn)定,OceanBase把它按照主鍵(primary key,也稱為row key)分段(即tablet)后保存多個(gè)副本(一般是3個(gè))到多臺(tái)機(jī)器(ChunkServer)上,避免了單臺(tái)機(jī)器故障導(dǎo)致的服務(wù)中斷,多個(gè)副本也提升了系統(tǒng)服務(wù)能力。單個(gè)tablet的尺寸可以根據(jù)應(yīng)用數(shù)據(jù)特點(diǎn)進(jìn)行配置,相對(duì)配置過小的tablet會(huì)合并,過大的tablet則會(huì)分裂。
由于tablet按主鍵分塊連續(xù)存放,因此OceanBase按主鍵的范圍查詢對(duì)應(yīng)著連續(xù)的磁盤讀,十分高效。
對(duì)于已經(jīng)凍結(jié)/轉(zhuǎn)儲(chǔ)的動(dòng)態(tài)數(shù)據(jù),OceanBase的ChunkServer會(huì)在自己不是太繁忙的時(shí)候啟動(dòng)基準(zhǔn)數(shù)據(jù)與凍結(jié)/轉(zhuǎn)儲(chǔ)內(nèi)存表的合并,并生成新的基準(zhǔn)數(shù)據(jù)。這種合并過程其實(shí)是一種范圍查詢,是一串連續(xù)的磁盤讀和連續(xù)的磁盤寫,也是很高效的。
傳統(tǒng)DBMS提供了強(qiáng)大的事務(wù)性、良好的一致性和很短的查詢修改響應(yīng)時(shí)間,但數(shù)據(jù)規(guī)模受到嚴(yán)重制約,缺乏擴(kuò)展性;現(xiàn)代云計(jì)算提供了極大的數(shù)據(jù)規(guī)模、良好的擴(kuò)展性,但缺乏跨行跨表事務(wù)、數(shù)據(jù)一致性也較弱、查詢修改響應(yīng)時(shí)間通常也較長,OceanBase的設(shè)計(jì)和實(shí)現(xiàn)融合了二者的優(yōu)勢:
--------------------------------------------------------------------------------
UpdateServer:類似于DBMS中的DB角色,提供跨行跨表事務(wù)和很短的查詢修改的響應(yīng)時(shí)間以及良好的一致性。
ChunkServer:類似于云計(jì)算中的工作機(jī)(如GFS的chunk server),具有數(shù)據(jù)多副本(通常是3)、中等規(guī)模數(shù)據(jù)粒度(tablet大小約256MB)、自動(dòng)負(fù)載平衡、宕機(jī)恢復(fù)、機(jī)器plug and play等特點(diǎn),系統(tǒng)容量及性能可隨時(shí)擴(kuò)展。
MergeServer:結(jié)合ChunkServer和UpdateServer,獲得最新數(shù)據(jù),實(shí)現(xiàn)數(shù)據(jù)一致性。
RootServer:類似于云計(jì)算中的主控機(jī)(如GFS master),進(jìn)行機(jī)器故障檢測、負(fù)載平衡計(jì)算、負(fù)載遷移調(diào)度等。
--------------------------------------------------------------------------------
上述的DBMS和云計(jì)算技術(shù)的優(yōu)勢互補(bǔ)使得OceanBase既具有傳統(tǒng)DBMS的跨行跨表事務(wù)、數(shù)據(jù)的強(qiáng)一致性以及很短的查詢修改響應(yīng)時(shí)間,還有云計(jì)算的海量數(shù)據(jù)管理能力、自動(dòng)故障恢復(fù)、自動(dòng)負(fù)載平衡以及良好的擴(kuò)展性。
OceanBase當(dāng)前在淘寶的應(yīng)用
OceanBase現(xiàn)在已經(jīng)應(yīng)用于淘寶收藏夾,用于存儲(chǔ)淘寶用戶收藏條目和具體的商品、店鋪信息,每天支持4~5千萬的更新操作。等待上線的應(yīng)用還包括CTU、SNS等,每天更新超過20億,更新數(shù)據(jù)量超過2.5TB,并會(huì)逐步在淘寶內(nèi)部推廣,也期待外部合作者。
主要的性能數(shù)據(jù)
測試軟硬件環(huán)境
Red Hat Enterprise Linux Server release 5.4 (Tikanga)
gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)
Intel(R) Xeon(R) CPU E5520 @ 2.27GH
ChunkServer & MergeServer:Memory 16GB Disk 300GB SAS*10 NO Raid
UpdateServer & RootServer:Memory 48GB Disk 300GB SAS*6 Raid1
測試環(huán)境部署簡圖
#p#
測試數(shù)據(jù)規(guī)模
21億條數(shù)據(jù),基準(zhǔn)數(shù)據(jù)3備份。
測試Schema
兩張表,其中表1中有21列,表2中11列。
其中表1中的11列和表2中的11列存在join關(guān)系。
單條記錄大小為500字節(jié)。
測試性能曲線圖
Range數(shù)據(jù)查詢
單條數(shù)據(jù)查詢
當(dāng)壓力最大時(shí),ChunkServer單臺(tái)輸出數(shù)據(jù)90MB/S,已經(jīng)接近了千兆網(wǎng)卡的極限
更新數(shù)據(jù)