OceanBase是通過對原有2PC的改良,來實現分散式事務
OceanBase通過多副本(Multi-Paxos),解決了2PC單點,阻塞和資料不一致的問題
如上圖所示,當分散式事務提交時,會選擇其中的一個資料分片作為協調者在所有資料分片上執行兩階段提交協定。還記得前文提到過的協調者宕機問題麼?在 OceanBase 中,由於所有資料分片都是通過 Paxos 複製紀錄檔實現多副本高可用的,當主副本發生宕機後,會由同一資料分片的備副本轉換為新的主副本繼續提供服務,所以可以認為在 OceanBase 中,參與者和協調者都是保證高可用不宕機的(多數派存活),繞開了協調者宕機的問題。
在參與者高可用的實現前提下,OceanBase 對協調者進行了「無狀態」的優化。在標準的兩階段提交中,協調者要通過記錄紀錄檔的方法持久化自己的狀態,否則如果協調者和參與者同時宕機,協調者恢復後可能會導致事務提交狀態不一致。但是如果我們認為參與者不會宕機,那麼協調者並不需要寫紀錄檔記錄自己的狀態。
OceanBase在第一階段所有參與者都回復prepare完成以後,即反饋事務提交成功,提升了2PC的效率
由於存在多副本,只要保證在prepare階段,驗證事務執行沒有錯誤,協調者發出commit指令後,就可以樂觀的認為,事務執行成功並反饋給事務發起者。OceanBase相信commit訊息會被多數副本收到,多數副本收到訊息以後,剩下的就交給他們自己同步
在上圖中(綠色部分表示寫紀錄檔的動作),左側為標準兩階段提交協定,使用者感知到的提交時延是4次寫紀錄檔耗時以及2次 RPC 的往返耗時;右側圖中 OceanBase 的兩階段提交實現,由於少了協調者的寫紀錄檔耗時以及提前了應答使用者端的時機,使用者感知到的提交時延是1次寫紀錄檔耗時以及1次 RPC 的往返耗時。
OceanBase資料庫在分割區以後,在處理一些複雜的查詢,比如跨分割區鍵的多表join,不包含的分割區鍵的查詢,這些查詢需要分發到每一個分割區,甚至產生笛卡爾乘積。
問題
OceanBase 有沒有提供類似於Mysql Binlog監聽的功能,這樣可以把一些複雜查詢,放到ES上去處理
正如上面討論的OceanBase在沒有使用到分割區鍵的時候,查詢效率非常低,這也是目前分散式資料庫普遍的問題。
OceanBase 特別適合於寫多讀少,對事務有比較高要求,高並行,巨量資料量的業務場景(例如金融領域)