如何在非可靠硬體上實現金融級高可用?

作者| @正祥

高可用是OceanBase的核心特性,是支持支付寶100%核心業務的基礎,如何在非可靠硬體上實現金融級高可用呢?

序言

就像在「傳統關係資料庫高可用的缺失」一文中所看到的,高可用在傳統關係資料庫的理論和實踐上都是缺失的,這使得傳統資料庫無法做到主庫備庫完全一致,為了減少主庫故障對業務的影響不得不使用昂貴的高可靠硬體,缺乏高可用還導致了分散式OLTP資料庫缺失、無法水平伸縮從而使得高並發業務不得不採用更加昂貴的大型伺服器等。作為分散式關係資料庫,OceanBase必須解決這個問題。那麼,採用普通PC伺服器的OceanBase是如何做到高可用的呢?

解決之道

傳統關係資料庫假設硬體是相當可靠的,而OceanBase必須假設硬體是不可靠的,為了應對硬體的故障,OceanBase採用了Leslie Lamport在論文「The Part-Time Parliament」中發明的分散式一致性協議Paxos。這個協議是一種多數派協議,即任何修改都需要超過半數的參與者同意才能通過。OceanBase的做法是:

  1. 資料庫的每個數據分片都有三個(或以上)的庫,其中一個是主庫,其餘是備庫,每台伺服器上通常既有主庫(一部分數據分片)也有備庫(另一部分數據分片),而傳統資料庫整個庫要麼是主庫要麼是備庫;
  2. 主庫由所有庫選舉產生,同一時間每個數據分片最多只有一個主庫;主庫只有相當短的任期(例如若干秒),到期前可以申請連任;如果因為故障等原因主庫無法連任,則主庫任期到期後活著的其他庫(只要超過半數)就會選舉出新的主庫;
  3. 事務由主庫執行;主庫執行寫事務(含增刪改操作的事務)後,把事務日誌(red log)同步到備庫,只有在包括主庫自己在內的超過半數庫(比如3個庫中的2個,5個庫中的3個等)都收到了日誌並且持久化了,事務才提交。

Paxos協議帶來的一個明顯的好處是,即使主庫突發故障,只要活著的庫超過半數,則已經提交的每一筆事務的日誌至少會在一個庫上存在。活著的庫在選舉出新的主庫後,新的主庫可與每個備庫通信以便獲得所有已經提交的事務,然後繼續提供服務,而不會有任何數據丟失(Recovery Point Object,RPO=0),這是傳統資料庫的主備鏡像無法做到的。

對於只需要部署在本地的業務,OceanBase的做法通常是3個庫(3份數據)分布在三個機房,如下圖所示:

OceanBase同城三機房部署

在三機房部署模式下,單個伺服器甚至單個機房故障(不論其中是否有主庫),OceanBase都不會停止服務,數據也不會有任何損失,任何網路故障只要不導致三個機房兩兩之間的網路都斷開,OceanBase就可以正常服務,也不會有任何的數據損失。

由於主庫粒度小,OceanBase的主庫可以均勻分布到兩個主機房,因此正常情況下兩個主機房的資料庫伺服器以及其中的應用伺服器都處於工作狀態,提高了伺服器的利用率,並降低了成本。

本地部署難以抵禦地震、水災等自然災害,因此重要的業務通常採用跨城市部署,OceanBase有兩種做法,一種是兩地三中心部署:

OceanBase兩地三機房部署

兩地三中心部署下,任何單機或單機房故障(不論其中是否有主庫),OceanBase都不會停止服務,數據也不會有任何損失,任何網路故障只要不導致三個機房兩兩之間的網路都斷開,OceanBase都可以正常服務,也不會有任何的數據損失。

由於主庫粒度小,OceanBase的主庫可以均勻分布到主城市的兩個機房,因此正常情況下兩個機房的資料庫伺服器連同其中的應用伺服器都處於工作狀態,進一步提高了伺服器的利用率,並降低了成本。這與銀行採用的傳統資料庫的兩地三中心的「主庫(主機房)+同城熱備庫(同城熱備機房)+異地災備庫(異地災備機房)」有所不同,這種方式下通常只有主機房的伺服器是處於工作狀態的。

兩地三中心部署下,如果主城市出現城市級故障,則災備城市的OceanBase庫依然可以工作,但由於沒有了多數派,因此災備庫的數據是有損的,即RPO>0。OceanBase另一種部署,三地五中心,則實現了城市級故障的無損容災,即RPO=0:

OceanBase三地五中心部署

三地五中心部署下,任何單機或單機房或單個城市故障(不論其中是否有主庫),OceanBase都不會停止服務,數據也不會有任何損失,任何網路故障只要活著的三個機房兩兩之間能夠通信,OceanBase就可以正常服務,也不會有任何的數據損失。

由於主庫粒度小,OceanBase的主庫可以均勻分布到兩個主城市的四個機房,因此正常情況下四個機房的資料庫伺服器以及其中的應用伺服器都處於工作狀態,更進一步提高了伺服器的利用率,並降低了成本。

儘管跨城市部署和數據同步導致了事務提交時間的增加,但三地五中心部署不僅真正做到了多庫多活,而且實現了城市級故障的無損容災(RPO=0),這對於許多關鍵業務和系統十分重要。目前螞蟻金服的部分核心業務已經採用了三地五中心部署,進一步提升了業務對災難的抵禦能力。


推薦閱讀:

手把手教您解決90%的自然語言處理問題
Access資料庫應用思維導圖
資料庫面試題(開發者必看)
資料庫原理
sql中插入中文問題

TAG:資料庫 | 分散式系統 |