翻譯自 design
關(guān)于
本文檔是 Spencer Kimball 早期(2014)寫的設計文檔的升級版本椿访】迕剑可能不是很完整。如果需要更加詳盡的CockroachDB工作原理的說明术浪,建議閱讀體系結(jié)構(gòu)相關(guān)文檔。
概述
CockroachDB 是一個分布式的SQL數(shù)據(jù)庫寿酌。最初的設計目標包括可擴展性胰苏、強一致性和生存性(就像它的名字一樣)。CockroachDB 致力于在最小的延遲時間和人為干預下容許硬盤醇疼、物理機硕并、機架甚至數(shù)據(jù)中心的災難。CockroachDB 節(jié)點是對稱的秧荆;一個設計目標是以最少的配置且無需外界依賴進行同源部署(即使用同一個二進制文件)倔毙。
數(shù)據(jù)庫的入口是SQL接口。CockroachDB 集群中每一個節(jié)點充當一個客戶端SQL網(wǎng)關(guān)乙濒。SQL網(wǎng)關(guān)將客戶端SQL語句變換并執(zhí)行到 key-value(KV)操作陕赃,并能在集群上按需分發(fā)和返回結(jié)果給客戶端。CockroachDB 實現(xiàn)了一個單一颁股、龐大的有序鍵值對映射么库,其鍵值都是byte字符。
KV映射在邏輯上是由叫做range的keyspace的小片段組成的豌蟋。每一個range都由存儲在本地KV存儲引擎中的數(shù)據(jù)作支持(我們使用 RocksDB廊散,LevelDB的一個變體)。Range 的數(shù)據(jù)會被復制到一個可配置數(shù)量的額外 CockroachDB 節(jié)點中梧疲。Range 會被合并或切分以維持在是設定的大小允睹,默認為 64M
。相對較小的尺寸可以加快節(jié)點的錯誤修復和節(jié)點幌氮、容量甚至讀寫負載的再平衡缭受。但是,這個尺寸必須和系統(tǒng)壓力平衡该互,以便有更多range來管理米者。
CockroachDB 實現(xiàn)了水平可伸縮性
- 增加更多節(jié)點并通過集群中每個節(jié)點的存儲量來增加集群的容量(由可配置的復制因子來切分),理論上可以擴大至4E字節(jié)的邏輯數(shù)據(jù)量宇智;
- 客戶端查詢可以被發(fā)送到集群中任意的節(jié)點蔓搞,且查詢會被獨立操作(w/o 沖突),這意味著總吞吐量是影響集群中節(jié)點數(shù)量的線性因素随橘。
- 查詢操作會被分發(fā)(參考:分布式 SQL),因此單次查詢操作的總吞吐量可以通過增加更多節(jié)點來擴大机蔗。
CockroachDB 實現(xiàn)了強一致性
- 在每個鍵值range中同步復制數(shù)據(jù)時使用分布式一致性的協(xié)議蒲祈。我們選擇使用 Raft 一致性算法甘萧;所有的一致性狀態(tài)都存儲在 RocksDB 中。
- 單一或批量地突變到單個 range 可以通過range的Raft實例進行調(diào)節(jié)梆掸。Raft保證了ACID語義扬卷。
- 邏輯上的突變會影響多個range使用分布式事務的語義。CockroachDB 使用了一個高效的 non-locking distributed commit(非鎖定分布式提交) 協(xié)議酸钦。
CockroachDB 實現(xiàn)了強生存性
- range 副本可以共同定位在一個單獨的數(shù)據(jù)中心以達到較低的延遲和降低磁盤或機器的故障率怪得。其可以進行分布式的部署以承受交換機的故障。
- range 副本可以部署在跨越不同地域的數(shù)據(jù)中心以承受網(wǎng)絡钝鸽、電力甚至更大的災難場景帶來的后果汇恤,比如(e.g. { 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 提供了快照隔離級別(snapshot isolation 簡稱SI)語義和序列化快照隔離級別(serializable snapshot isolation簡稱SSI)語義拔恰,容許外部一致性因谎、無鎖定讀寫—--從歷史快照時間戳和從當前系統(tǒng)時間讀寫(系統(tǒng)時間指從時間設備如:鐘表、電腦等計時設備等讀到的時間值颜懊,它是我們對真實時間的度量值财岔,但跟真實時間總是不可能完全一致)。SI隔離級別提供無鎖定讀寫但會產(chǎn)生寫偏序(譯注:因為每個事務在更新過程中看不到其他事務的更新結(jié)果河爹,所以可能造成各個事務提交之后的最終結(jié)果違反了一致性)匠璧。SSI隔離級別消除了寫偏序,但在競爭頻繁的系統(tǒng)中引起了性能的下降咸这。SSI 隔離級別是默認的隔離級別夷恍,用戶必須有意識地決定是否用性能換取正確性。CockroachDB 實現(xiàn)了嚴格一致性(線性一致性)的一種有限形式媳维,為任一觀察者或觀察者鏈提供有序化酿雪。類似于 Spanner 目錄,CockroachDB 允許對任意數(shù)據(jù)地域進行配置侄刽。允許配置復制因子指黎、存儲設備類型、數(shù)據(jù)中心位置州丹,以優(yōu)化性能或者提高可用性醋安。但與 Spanner 不同,地域是整體的墓毒,不允許在實體組層面進行更細粒度數(shù)據(jù)的移動吓揪。