資料內(nèi)容:
CockroachDB是一個(gè)分布式SQL數(shù)據(jù)庫。其主要設(shè)計(jì)目標(biāo)是擴(kuò)展性、強(qiáng)一致性和生存性(CockroachDB蟑螂
數(shù)據(jù)庫由此得名)。CockroachDB的目標(biāo)是容忍磁盤、機(jī)器、機(jī)架,甚至數(shù)據(jù)中心故障,在無需人工干預(yù)的
情況下,最小化這些延遲中斷的影響。CockroachDB各節(jié)點(diǎn)是對(duì)等的,設(shè)計(jì)目標(biāo)是同質(zhì)化部署(一個(gè)二進(jìn)制
包),最小化配置,也不需要外部依賴項(xiàng)。
為數(shù)據(jù)庫客戶端提供的訪問接口是SQL接口。CockroachDB集群中的每個(gè)節(jié)點(diǎn)都可以扮演一個(gè)客戶端SQL網(wǎng)
關(guān)角色。SQL網(wǎng)關(guān)將客戶端SQL語句轉(zhuǎn)換成KV操作,分發(fā)到所需的節(jié)點(diǎn)執(zhí)行并返回結(jié)果給客戶端。
CockroachDB實(shí)現(xiàn)了一個(gè)單一整體有序映射Map,其中的鍵Key和值Value都是字節(jié)串(不是unicode)。
KV映射(map)邏輯上由更小的稱為范圍(range)的鍵值空間區(qū)域分割組成。每一個(gè)range依靠本地KV存儲(chǔ)引
擎(我們使用RocksDB, LevelDB的變種)的數(shù)據(jù)存儲(chǔ)能力來支持。Range數(shù)據(jù)可被復(fù)制到指定數(shù)量的其他
CockroachDB節(jié)點(diǎn)上。Range會(huì)被合并或者拆分以維持目標(biāo)尺寸大小,目標(biāo)大小默認(rèn)是64M。相對(duì)而言,小
尺寸可以更快速的修復(fù),以及更快速地重新調(diào)整,以處理節(jié)點(diǎn)失效、新增容量、甚至讀寫負(fù)載。無論如
何,該尺寸的選取必須依據(jù)系統(tǒng)上的壓力(系統(tǒng)中有多少更多的range需要管理)來平衡考慮。
CockroachDB水平擴(kuò)展性:
水平擴(kuò)展性:
l 增加更多節(jié)點(diǎn)來增加集群容量,理論上邏輯數(shù)據(jù)可擴(kuò)展到4E byte。每個(gè)節(jié)點(diǎn)增加的有效容量=所增加的存
儲(chǔ)容量/所配置的復(fù)制系數(shù);
l 客戶端查詢可以發(fā)送到集群中的任一節(jié)點(diǎn),這些查詢可以獨(dú)立執(zhí)行(無沖突),這意味著整體吞吐量隨集
群節(jié)點(diǎn)數(shù)線性增長(zhǎng);
l 查詢被分發(fā)執(zhí)行(參見:分布式SQL),所以單一查詢的吞吐量也會(huì)因增加更多節(jié)點(diǎn)而增加。
CockroachDB強(qiáng)一致性:
強(qiáng)一致性:
l 每個(gè)KV range內(nèi)數(shù)據(jù)的同步復(fù)制都采用分布式一致性協(xié)議。我們采用Raft一致性算法,所有一致性狀態(tài)都
存儲(chǔ)在RocksDB中;
l 對(duì)單一range的單一或者批量變化是通過該range的Raft實(shí)例作為中介來完成的。Raft保障了ACID語義;
l 涉及多個(gè)range的邏輯上的變化則是利用分布式事務(wù)來保障ACID語義。CockroachDB使用高效的無鎖分布
式提交協(xié)議。
CockroachDB生存性:
生存性:
l range多個(gè)副本可以在單一數(shù)據(jù)中心內(nèi)同地協(xié)作,目的是提供低延遲復(fù)制和在磁盤或者機(jī)器故障時(shí)仍然存
活。Range副本可以被分布到不同機(jī)架,目的是在一些網(wǎng)絡(luò)交換機(jī)故障時(shí)仍能夠存活。
l range多個(gè)副本可以位于跨越不同地域的數(shù)據(jù)中心范圍內(nèi),目的是在更大的故障場(chǎng)景(從數(shù)據(jù)中心斷電、斷
網(wǎng)到區(qū)域性電力故障)中仍然存活。(多數(shù)據(jù)中心跨地域的例子:{ 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提供快照隔離級(jí)別(snapshotisolation簡(jiǎn)稱SI)和序列化快照隔離級(jí)別(serializable snapshot isolation
簡(jiǎn)稱SSI)語義,容許外部一致性、無鎖定讀寫—--從歷史快照時(shí)間戳和從當(dāng)前系統(tǒng)時(shí)間讀寫(系統(tǒng)時(shí)間指
從時(shí)間設(shè)備如:鐘表、電腦等計(jì)時(shí)設(shè)備等讀到的時(shí)間值,它是我們對(duì)真實(shí)時(shí)間的度量值,但跟真實(shí)時(shí)間總
是不可能完全一致)。SI隔離級(jí)別提供無鎖定讀寫但會(huì)產(chǎn)生寫偏序(譯注:因?yàn)槊總€(gè)事務(wù)在更新過程中看不
到其他事務(wù)的更新結(jié)果,所以可能造成各個(gè)事務(wù)提交之后的最終結(jié)果違反了一致性)。SSI隔離級(jí)別消除了
寫偏序,但在競(jìng)爭(zhēng)頻繁的系統(tǒng)中引起了性能的下降。SSI隔離級(jí)別是默認(rèn)的隔離級(jí)別,用戶必須有意識(shí)地決
定是否用性能換取正確性。CockroachDB實(shí)現(xiàn)了嚴(yán)格一致性(線性一致性)的一種有限形式,為任一觀察者
或觀察者鏈提供有序化。
類似于Spanner目錄,CockroachDB允許對(duì)任意數(shù)據(jù)地域進(jìn)行配置。允許配置復(fù)制因子、存儲(chǔ)設(shè)備類型、數(shù)
據(jù)中心位置,以優(yōu)化性能或者提高可用性。但與Spanner不同,地域是整體的,不允許在實(shí)體組層面進(jìn)行更
細(xì)粒度數(shù)據(jù)的移動(dòng)。
3 Architecture(架構(gòu))
(架構(gòu))
CockroachDB采用分層架構(gòu)。其最高抽像層為SQL層(目前本文檔未詳細(xì)描述)。CockroachDB直接通過
SQL層提供熟悉的關(guān)系概念,如:模式schema、表table、列column和索引index。接下來SQL層依賴于分布式
KV存儲(chǔ),該存儲(chǔ)管理range處理的細(xì)節(jié)以提供一個(gè)單一全局KV存儲(chǔ)的抽象。分布式KV存儲(chǔ)與任意數(shù)量的
cockroach物理節(jié)點(diǎn)通信。每個(gè)物理節(jié)點(diǎn)包含一個(gè)或者多個(gè)存儲(chǔ)。