分散式NewSQL/HTAP資料庫——Cockroach
CockroachDB是一個分散式關係型資料庫,它的主要設計目標是可擴充套件性,強一致性和高可靠性。CockroachDB能夠在無人為干預情況下,以極短的中斷時間容忍磁碟、主機、機架甚至整個資料中心的故障。CockroachDB採用完全去中心化架構,叢集中各個節點的地位完全相同,同時所有功能封裝在一個二進位制可執行程式檔案中,可以做到最小化設定和沒有外部依賴的直接部署。
CockroachDB對資料庫客戶端提供標準SQL介面(相容PostgreSQL),叢集中任意節點都可以作為接入節點處理使用者的SQL請求。接入節點把SQL請求轉換為一組KV操作,並且在必要時將這些操作傳送至叢集中其它節點進行處理,完成後將結果返回給客戶端。CockroachDB底層將資料組織成由有序的Key-Value對組成的一個巨大的KV Map
這個巨大的有序KV Map邏輯上被切分成很多較小的段,每一個這樣的小段叫做範圍(Range,Google的Spanner也叫Range,PingCap的TiDB叫做Region)。每個Range中的資料由本地KV儲存引擎(RocksDB,是LevelDB的變體)儲存。每個Range被複制多份分佈到叢集中多個不同的CockroachDB節點上,Range副本數量是可動靜態配置的。每個Range預設大小為64M(Range能夠合併或著劈開以維護這個尺寸),合理的Range大小有利於加速節點故障恢復、擴容、以及均衡讀寫負載。Range大小應該根據系統壓力進行設定,以便管理更多Range。
CockroachDB支援水平擴充套件
- 新增更多節點可以提升整個叢集的儲存容量,理論上最大可以支撐4EB的資料儲存。
- 客戶端的查詢請求可以傳送到叢集任意節點,且每個查詢可獨立併發執行(無論有無衝突),這意味著叢集的吞吐能力可以隨著節點數的增加線性提升。
- 查詢以分散式任務的方式在各個資料節點併發執行,可以通過增加節點數來提升單個查詢的效能
CockroachDB支援強一致性
- Range的多個副本之間使用分散式一致性協議——Raft同步資料,所有一致性狀態都儲存在RocksDB中。
- 對同一個Range內資料的單一或批量修改,由Raft保證Range操作的ACID語義。
- 涉及跨多個Range的操作,CockroachDB使用一種高效的無鎖分散式提交協議保障事務的ACID語義。
CockroachDB支援高可用性
- 將Range副本分佈在一個數據中心內,可以確保低延遲複製,同時能容忍磁碟或機器故障。如果將副本分佈在不同機架,即使某些網路交換機故障,CockroachDB仍可提供服務。
- Range副本可以跨資料中心和跨地域分佈,以應對來自資料中心電源中斷或網路中斷,以及區域電力故障等問題。多資料中心跨地域的例子:{ US-East-1a, US-East-1b, US-East-1c }, {US-East, US-West, Japan }, { Ireland, US-East, US-West}, { Ireland, US-East,US-West, Japan, Australia }
CockroachDB 提供快照隔離 (SI) 和 序列快照隔離 (SSI) 兩種隔離級別;基於歷史快照時間和當前時間,提供外部一致的無鎖讀寫。SI提供無鎖讀寫,但是存在寫偏序問題(write skew); SSI消除了寫偏序,但在競爭激烈的系統中會存在效能問題。SSI是預設的隔離級別,使用者須根據實際效能情況,選擇合適的隔離級別。
類似於Spanner的Directory,CockroachDB允許根據複製策略、儲存裝置型別或者資料中心位置把叢集劃分成任意個數據區域(Zone),以提升叢集效能和可用性。與Spanner不同的是,區域是一個整體,不存在子區域。