天天看點

OB有問必答 | 分區是什麼?在OceanBase中起到了什麼作用?

雖然“分區”的概念不是很新,但是 ”分區”對了解 OceanBase 的很多原理卻是非常重要的。

分區是一種水準拆分方案

從水準拆分設計上說,目前分布式資料庫産品裡有三種拆分途徑。一是以 Spanner、為代表的在存儲層按定長塊切片的,稱為Region,拆分細節對業務完全透明。二是以 ORACLE、OceanBase 為代表的使用分區表的多分區拆分,業務需要指定拆分政策和分片數,使用上基本上跟單表一樣。三是以DRDS等為代表的分布式資料庫中間件的分庫分表拆分,業務使用的是一個邏輯表,實際資料存放在多個結構相同命名或位置不同的實體表上。

OceanBase 裡一個非分區表隻有一個分區,一個分區表有多個分區。分區就是表的子集OceanBase 裡單個分區隻能在一個節點上,不同分區可以在不同節點上。

分區的好處有:

1.提高可擴充性。分區表的不同分區可以分布在不同的機器上,使得單表能獲得多機的處理能力,并且使得單表的容量可以超過單機的容量。性能也是同理。

2.提高可管理性。對于資料操作的粒度可以控制在單個分區。例如按照時間分區的資料,可以通過 drop 一個分區來實作資料過期功能。

3.提高性能。通過分區裁剪,可以快速定位到使用者需要查詢的分區,提高查詢性能。

分區是資料同步的最小單元

在 OceanBase 裡,每個資料有三份,每個具體的分區也有三份,分布在不同的 Zone 裡的不同節點上。每個分區有三份副本,副本内容相同,角色上有區分,是1個 leader 副本和2個 follower 副本。有時候會簡單說1個主副本2個備副本。但是主備的概念容易引起誤解。

預設業務隻有 leader 副本提供讀寫服務,follower 副本隻同步資料,不提供服務。特殊場景下,業務 SQL 使用弱一緻性讀 Hint (即 read_consistency(weak))可以就近讀取follower 副本。資料的變更在 leader副本,事務送出的時候,leader 副本會就Redo 落盤發起表決,使用 Paxos 協定。具體就是除了自己把 Redo 落盤,同時還發往兩個 follower 副本,follower 副本收到 redo 落盤後表決“成功”。同時 Follower副本開始應用該 Redo。三副本裡隻要有一半以上成員(2個副本)表決落盤成功,leader 副本上的業務的事務就送出成功傳回消息給用戶端。

每個分區的三副本組成一個獨立的 Paxos 小組,相應的 Redo 在副本之間傳輸。是以說分區是資料同步的最小單元。并且這種 Redo同步是自動的,不需要也不能幹預的。

分區是高可用的最小單元

每個分區的三副本會保持資料同步,目的是為了保證在 Leader 副本不可用的時候選舉出新的 Leader 副本擁有全部的資料。Paxos協定保證了 Redo 會在至少一個 Follower 副本裡有(最終會所有Follower副本都有)。三副本會跟 OceanBase 叢集的 rootservice 服務維持心跳,當 Leader 副本不可用時,經過2個租約時間後 rootservice 會選舉出新的Leader 出來,在應用完 Redo 後新 Leader提供讀寫服務。

分區的選舉是自動的,隻要多數派存活,就不需要人工介入。是以說“分區”是高可用的最小單元。OceanBase 的“切換”指的就是一個個 Leader 分區重新選舉的過程,并不是執行個體級别的“切換”。當一個機器節點挂掉後, 嚴格的說,其影響隻是局部的資料(Leader 副本)的讀寫通路短暫中斷)。在OceanBase 裡,一般不會說某台機器是主,某台機器是備,因為理論上所有的機器都可能存在 Leader 副本,都能提供讀寫服務。