數(shù)據(jù)庫系統(tǒng)不僅保存了現(xiàn)代企業(yè)的關鍵業(yè)務數(shù)據(jù),而且對這些數(shù)據(jù)提供訪問從而支撐著企業(yè)業(yè)務。因此,數(shù)據(jù)庫系統(tǒng)的穩(wěn)定可靠對現(xiàn)代企業(yè)至關重要。 數(shù)據(jù)庫系統(tǒng)通常由數(shù)據(jù)庫軟件、運行數(shù)據(jù)庫軟件的數(shù)據(jù)庫服務器硬件以及保存數(shù)據(jù)庫數(shù)據(jù)的數(shù)據(jù)庫存儲硬件(即共享存儲)
數(shù)據(jù)庫系統(tǒng)不僅保存了現(xiàn)代企業(yè)的關鍵業(yè)務數(shù)據(jù),而且對這些數(shù)據(jù)提供訪問從而支撐著企業(yè)業(yè)務。因此,數(shù)據(jù)庫系統(tǒng)的穩(wěn)定可靠對現(xiàn)代企業(yè)至關重要。
數(shù)據(jù)庫系統(tǒng)通常由數(shù)據(jù)庫軟件、運行數(shù)據(jù)庫軟件的數(shù)據(jù)庫服務器硬件以及保存數(shù)據(jù)庫數(shù)據(jù)的數(shù)據(jù)庫存儲硬件(即共享存儲)組成,如下圖所示:
數(shù)據(jù)庫系統(tǒng)的穩(wěn)定可靠,也取決于這三個部分。
首先是數(shù)據(jù)庫軟件,數(shù)據(jù)庫軟件廠商平均2~3年發(fā)布一個大版本,新版本發(fā)布前會進行反復測試。即使如此,數(shù)據(jù)庫軟件的維護升級依然有很大的風險,2013年6月中國工商銀行系統(tǒng)不可用即是其數(shù)據(jù)庫DB2的維護升級導致,2014年8月美國國務院簽證數(shù)據(jù)庫系統(tǒng)超過1周的不可用也是其數(shù)據(jù)庫Oracle的維護升級導致。
其次是數(shù)據(jù)庫服務器。為了保障數(shù)據(jù)庫系統(tǒng)的穩(wěn)定可靠,傳統(tǒng)數(shù)據(jù)庫系統(tǒng)廠商推薦用戶使用穩(wěn)定性較高的高端服務器,這些服務器價格非常昂貴,難以擴展,并且擴展能力也十分有限。
第三是數(shù)據(jù)庫存儲(共享存儲)。數(shù)據(jù)庫中的數(shù)據(jù)是企業(yè)最寶貴的財富,為了避免數(shù)據(jù)丟失,傳統(tǒng)數(shù)據(jù)庫廠商推薦用戶使用穩(wěn)定性較高的共享存儲,同樣地,這類存儲設備價格非常昂貴,難以擴展,并且擴展能力也有限。
為了避免水災、火災或者其他自然災害導致的數(shù)據(jù)庫系統(tǒng)不可用甚至數(shù)據(jù)丟失,傳統(tǒng)數(shù)據(jù)庫系統(tǒng)通常還要搭建備庫,出于安全考慮,主庫與備庫需要保持一定的距離,例如50km或以上,俗稱主備鏡像,如下圖所示:
然而,盡管稱為主備鏡像,數(shù)據(jù)庫的備庫并不能保證與主庫一致:假如強制要求兩者一致,那么主庫的每一筆事務都必須到達備庫后才能提交和應答客戶,這樣一旦主庫備庫之間的網(wǎng)絡異常或者備庫異常,整個數(shù)據(jù)庫系統(tǒng)將不可用,從而導致業(yè)務的中斷,與主庫備庫部分數(shù)據(jù)不一致相比,業(yè)務的中斷對于企業(yè)來講更加不能接受,因而主庫故障后業(yè)務切換到備庫時,通常會有少量數(shù)據(jù)不一致。因此,即使部署了主備鏡像,傳統(tǒng)數(shù)據(jù)庫系統(tǒng)也不得不使用可靠性盡可能高的服務器和存儲,以降低主庫故障的幾率,減少對業(yè)務的影響。之所以要使用可靠的服務器和可靠的存儲,本質上是因為傳統(tǒng)數(shù)據(jù)庫假設硬件(服務器、存儲、網(wǎng)絡等)是“可靠的”。
對于數(shù)據(jù)庫,與傳統(tǒng)企業(yè)相比,互聯(lián)網(wǎng)企業(yè)最大的不同之一是并發(fā)訪問量非常大。傳統(tǒng)商業(yè)企業(yè)、銀行,用戶需要通過收銀臺、銀行終端、ATM柜員機、POS機等專用設備開展業(yè)務并訪問數(shù)據(jù)庫,幾百和幾千的數(shù)據(jù)庫并發(fā)訪問比較常見,幾萬以上的并發(fā)訪問相當少見。在互聯(lián)網(wǎng)上,每一個草根網(wǎng)民都可以發(fā)起購物交易并訪問數(shù)據(jù)庫,幾十萬的數(shù)據(jù)庫并發(fā)訪問時??梢姡瑤装偃f甚至千萬的并發(fā)訪問都可以見到(例如雙11下的淘寶、天貓和支付寶)。如此之大的并發(fā)訪問下,商業(yè)數(shù)據(jù)庫軟件及其高可靠的數(shù)據(jù)庫服務器和共享存儲的成本成為了不可承擔之重。
由于上述原因,OceanBase的一個基本假設就是硬件(服務器、存儲、網(wǎng)絡等)是不可靠的,另一個基本假設是單機(數(shù)據(jù)庫服務器及共享存儲)無法滿足互聯(lián)網(wǎng)業(yè)務的需求。因此,OceanBase必須是一個多機(分布式)系統(tǒng),并且必須保證任何時刻出現(xiàn)的少量硬件(服務器、存儲、網(wǎng)絡等)異常不影響業(yè)務。
為此,OceanBase引入了Paxos協(xié)議,每一筆事務,主庫執(zhí)行完成后,要同步到半數(shù)以上庫(包括主庫自身),例如3個庫中的2個庫,或者5個庫中的3個庫,事務才成功。這樣,少數(shù)庫(例如3個庫中的1個庫,或者5個庫中的2個庫)異常后業(yè)務并不受影響:
與傳統(tǒng)數(shù)據(jù)庫相比,OceanBase的另外一個關鍵特征是軟件版本的灰度升級。主備方式的傳統(tǒng)數(shù)據(jù)庫是“單活”的,只有主庫可執(zhí)行寫事務,盡管維護升級時可以先操作備庫,操作完成后備庫變成主庫并且接受用戶訪問是一步到位的,如果新版本有問題,則業(yè)務受到影響:
傳統(tǒng)數(shù)據(jù)庫:升級前
傳統(tǒng)數(shù)據(jù)庫:升級中
傳統(tǒng)數(shù)據(jù)庫:升級后只能一次性地引入全部讀寫流量
OceanBase則是“多活”設計,即多個庫(3個,5個等)每個都可以有部分讀寫流量,升級時先把要升級的庫的讀寫流量切走,升級后先進行數(shù)據(jù)對比,正常后逐步引入讀寫流量(白名單,1%,5%,10%......),一切正常并運行一段時間后再升級其他的庫:
OceanBase之3機群(3庫)部署:升級前
OceanBase之3機群(3庫)部署:切走讀寫流量,準備升級
OceanBase之3機群(3庫)部署:升級一個機群(庫)
OceanBase之3機群(3庫)部署:升級一個機群(庫)后切回部分讀寫流量
OceanBase之3機群(3庫)部署:升級一個機群(庫)后切回全部讀寫流量
基于硬件不可靠的假設并且能夠容忍少量服務器的故障,OceanBase使用了相對廉價的PC服務器代替高可靠服務器并且不再使用昂貴的共享存儲,從而不僅提供了比使用高可靠服務器和共享存儲低得多的成本,容忍少數(shù)服務器乃至少數(shù)機群故障意味著比傳統(tǒng)數(shù)據(jù)庫更高的可靠性。通過灰度升級,OceanBase避免了傳統(tǒng)數(shù)據(jù)庫的“一錘子買賣”的升級,極大地降低了數(shù)據(jù)庫維護升級的風險。
本文作者:陽振坤,螞蟻金服高級研究員。
聲明:本網(wǎng)頁內容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com