開發與維運

OB有問必答 | OceanBase如何保證數據可靠性?

在傳統數據庫中,有以下幾種常用的手段來保證數據可靠性:

1) Redo Log;2) 主從熱備;3) 備份/恢復;4) 存儲層數據校驗

這些技術從很大程度上提高數據的可靠性,但似乎都無法做到完美(即RPO=0)。OceanBase分佈式數據庫更多的是在軟件層面引入保障機制,OceanBase充分利用了Paxos協議,並將Paxos協議和傳統的WAL機制結合起來,每一次Redo Log落盤時,都會以強一致方式同步到Paxos組中多數派(leader+若干follower)副本的磁盤中,這樣做有兩個好處:

1)在Paxos組中任意少數派副本發生故障的情況下,剩下的多數派副本都能保證有最新的Redo Log,因此就能避免個別硬件故障帶來的數據損失,保證RPO=0。

2)Paxos協議中的數據強一致是針對“多數派”副本而言,如果Paxos組中有少數派follower副本發生故障,剩下的多數派副本(leader+若干follower)之間的數據強一致完全不受影響,這就解決了主從熱備模式下備副本故障拖累主副本的可用性。

綜合以上兩點,OceanBase利用Paxos協議可以保證RPO=0,且不必擔心應用的性能會受到影響,這也是OceanBase和傳統數據庫在數據可靠性方面最顯著的不同點。

OceanBase除了在存儲層引入了數據校驗機制,還加入了更多的技術手段來預防或者解決錯誤,大致包含以下內容:

1)Redo Log的數據校驗:Redo Log在落盤的時候會加上數據校驗信息,用來應對可能發生的磁盤靜默錯誤。此外,為了保證一個Paxos組中多個副本之間Redo Log的一致性,Redo Log在leader發送和follower接受時都會檢查數據校驗信息,避免網絡傳輸問題導致的數據錯誤。

2)數據盤上的校驗信息:和Redo Log類似,數據盤上的數據也會有校驗信息以應對磁盤靜默錯誤。但由於OceanBase是通過Redo Log實現Paxos組中多個副本之間的數據同步,數據盤上的數據並不會通過網絡傳輸在多個副本間同步,因此不需要副本間的實時校驗。

3)副本間的檢查點一致性校驗:OceanBase會在一些特定的檢查點,對多個副本之間的數據盤做一致性檢查。這個檢查點選在了OceanBase的“每日合併”點,主要的原因是每日合併動作本身就要對大量數據做歸併和重新寫入,剛好可以利用這個時機做數據的一致性檢查。通過這個檢查,進一步在存儲層確保了多個副本之間的數據一致性,提高了數據可靠性。

4)數據表和索引表之間的數據一致性校驗:對於有關聯關係的數據對象,OceanBase會做額外的檢查以保證它們之間的數據一致性。比較典型的例子就是索引和它的數據表,OceanBase會在一些特定的檢查點(如每日合併點)做索引和數據表之間的一致性檢查,進一步提高數據可靠性。

5)定期做數據校驗信息檢查:OceanBase定期檢查任務,在不影響在線業務的前提下,利用數據校驗信息主動檢查磁盤靜默錯誤,一旦發現錯誤會及時通知用戶,儘快採取補救措施。

最後,OceanBase也和傳統數據庫一樣提供完善的備份/恢復機制,包括全量備份功能和增量備份功能。而且OceanBase的增量備份是以不間斷的後臺daemon任務形式持續進行,完全不影響在線業務,降低了運維操作的複雜度。不過從分佈式數據庫的運行實踐來看,在實際系統中極少發生Paxos組中多數派副本同時毀壞的情況,因此基本不會真正用到備份來恢復數據。

Leave a Reply

Your email address will not be published. Required fields are marked *