作者介紹:劉奇,PingCAP聯(lián)合創(chuàng)始人兼CEO,先后創(chuàng)建了TiDB、Codis等知名開源項(xiàng)目。曾任豌豆莢,京東資深系統(tǒng)架構(gòu)師。同時(shí)也是知名的Go語言專家和Redis專家。現(xiàn)從事開源的分布式NewSQL數(shù)據(jù)庫TiDB(受GoogleF1啟發(fā))的開發(fā)。擅長(zhǎng)高并發(fā)、大規(guī)模、分布式數(shù)據(jù)庫系統(tǒng)架構(gòu)設(shè)計(jì)。
6月24日,由香港主辦、開源社群主導(dǎo)的國(guó)際技術(shù)會(huì)議,香港開源年會(huì)2016(HKOSCon)在港召開。PingCAP聯(lián)合創(chuàng)始人兼CEO劉奇應(yīng)邀出席,與大家分享了《How to Build a NewSQL Database》的英文主題演講。
以下為他的演講實(shí)錄:
大家好,我是PingCAPCEO劉奇。今天我將和大家分享一下如何構(gòu)建一個(gè)NewSQL數(shù)據(jù)庫。
首先,來介紹下我自己。和你們當(dāng)中很多人一樣,我是一名開源Hacker,一名架構(gòu)工程師,并長(zhǎng)期致力于創(chuàng)建新一代數(shù)據(jù)庫。我曾投身于以下幾個(gè)開源項(xiàng)目的工作,包括TiKV、TiDB和Codis,這些項(xiàng)目都已在Github上發(fā)布。今天,我的演講將涉及下列話題:
簡(jiǎn)要介紹NewSQL;
如何建立一個(gè)NewSQL數(shù)據(jù)庫;
為什么我們需要一個(gè)新的數(shù)據(jù)庫?
在正式開始前,我先問一個(gè)問題:你們熟悉數(shù)據(jù)庫嗎?熟悉的朋友請(qǐng)舉手。謝謝!
另外,有誰知道MySQL嗎?謝謝,比我預(yù)期的人數(shù)要少一些。
那么,現(xiàn)有數(shù)據(jù)庫存在哪些問題呢?
像MySQL、Oracle、PostgreSQL這樣的關(guān)系數(shù)據(jù)庫,它們的問題是很難擴(kuò)展。盡管我們有分片技術(shù),還有youtube/vitess和MySQLproxy等,但它們都不支持分布式事務(wù)以及cross-nodejoin連接。
像HBase、MongoDB以及Redis這樣的NoSQL數(shù)據(jù)庫:它們可擴(kuò)展,但不支持SQL,同時(shí)也舍棄了事務(wù)的一致性。
因此,新一代數(shù)據(jù)庫將會(huì)是怎樣的?在我看來,其主要特征應(yīng)該是:
支持SQL;
具有可擴(kuò)展性;
支持事務(wù)執(zhí)行四要素/ACID Transaction;
高可用。
首先,它必須支持SQL,因?yàn)檫@數(shù)十年來我們一直在使用SQL,而且許多應(yīng)用程序都使用SQL,故而不能輕易將其舍棄。
第二,必須有良好的擴(kuò)展性,也就是說只需通過接入更多的機(jī)器就可以擴(kuò)展其容量或使之實(shí)現(xiàn)負(fù)載均衡。
第三,必須支持事務(wù)的ACID屬性,這一點(diǎn)也恰恰是關(guān)系數(shù)據(jù)庫的主要特征之一。有了強(qiáng)大的一致性作保障,開發(fā)者便可以用較短的代碼編寫出正確的程序。
最后,即使是在計(jì)算機(jī)陷入故障,甚至是整個(gè)數(shù)據(jù)中心癱瘓的情況下,它也應(yīng)該能夠保持其較高的可用性。同時(shí),它還應(yīng)當(dāng)可以自動(dòng)修復(fù)。
總之,新一代數(shù)據(jù)庫應(yīng)該既有很好的可擴(kuò)展性,又能保留關(guān)系數(shù)據(jù)庫的主要特征。
NewSQL是什么?
你可能會(huì)好奇,這樣的數(shù)據(jù)庫真的存在嗎?它聽起來似乎太過完美和理想化了。這個(gè)問題的答案是肯定的,這樣的數(shù)據(jù)庫的確存在,它就是NewSQL。那什么是NewSQL數(shù)據(jù)庫?先來看一看維基百科給出的解釋:
NewSQL是指這樣一類新式的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),它針對(duì)OLTP實(shí)現(xiàn)讀-寫工作負(fù)載,追求提供和NoSQL系統(tǒng)相同的擴(kuò)展性能,且仍然保持傳統(tǒng)數(shù)據(jù)庫支持的ACID特性。
從上述定義來看,我們不難發(fā)現(xiàn)NewSQL的擴(kuò)展性與NoSQL相當(dāng),并同時(shí)保留了ACID特性。而這恰恰是我們需要的。
建立一個(gè)NewSQL數(shù)據(jù)庫
今天我將向大家展示如何建立一個(gè)這樣的數(shù)據(jù)庫。我們受到全球最大數(shù)據(jù)庫Google Spanner和F1的啟發(fā),將其分為兩個(gè)層級(jí):
KV層:這一層屬于底層存儲(chǔ)系統(tǒng),負(fù)責(zé)提供跨數(shù)據(jù)中心的同步以及強(qiáng)一致性事務(wù)。
SQL層:這一層使能夠滿足我們對(duì)傳統(tǒng)SQL數(shù)據(jù)庫可用性以及功能性的支持。
建立NewSQL數(shù)據(jù)庫
這就是我們?cè)赑ingCAP所從事的工作,當(dāng)然是開源的。其中,我們的數(shù)據(jù)庫分為兩層,即KV層和SQL層。就KV層來看,我們有TiKV;對(duì)于SQL層,則有TiDB。而我將在稍后介紹其中的關(guān)鍵技術(shù)。這里的Ti是Titanium(鈦)的縮寫,我們都知道鈦?zhàn)鳛橐环N抗腐蝕性的化學(xué)元素,被廣泛應(yīng)用于高端科技當(dāng)中。
TiKV的特性
異地備份:我們利用Raft來支持異地備份。Raft是一種一致性算法,它在容錯(cuò)性和性能方面相當(dāng)于Paxos算法。我們的實(shí)現(xiàn)參考應(yīng)用廣泛的etcd,它已經(jīng)通過了廣泛測(cè)試并具有較高的穩(wěn)定性。
水平擴(kuò)展性:由于Raft支持membership變更,我們利用其這一特性來實(shí)現(xiàn)水平擴(kuò)展。
一致性的分布式事務(wù):這種事務(wù)模型的創(chuàng)建是受到了Google Percolator(來自一篇2006發(fā)表的論文)的啟發(fā),主要是一個(gè)優(yōu)化的兩階段提交協(xié)議。該模型借助一個(gè)時(shí)間戳分配器來給各項(xiàng)事務(wù)分配單調(diào)遞增的時(shí)間戳,因此可檢測(cè)到?jīng)_突。
協(xié)處理器支持:與HBase類似,我們運(yùn)用協(xié)處理器架構(gòu)執(zhí)行服務(wù)器代碼來進(jìn)行分布式計(jì)算。
追求更高的性能和更低的延遲,用編程語言Rust進(jìn)行了編寫。你們當(dāng)中有誰知道Rust嗎?很不錯(cuò)。你們應(yīng)該嘗試一下,它真的相當(dāng)有趣。
TiKV架構(gòu)
圖1 TiKV架構(gòu)
從上圖中可以看出,它經(jīng)過了高度分層。
從底層往上看。底層是RocksDB,它是一個(gè)持久的內(nèi)嵌式KV存儲(chǔ)引擎。RocksDB的最初設(shè)計(jì)重點(diǎn)在于其極高的性能,可以輕松對(duì)讀放大、寫放大以及空間放大進(jìn)行優(yōu)化。
上面一層是RaftKV,這一層用來實(shí)現(xiàn)分布式。
再往上是MVCC,即多版本并發(fā)控制(Multi-version concurrency control)。我相信你們當(dāng)中很多人對(duì)此都很熟悉。TiKV是一個(gè)多版本數(shù)據(jù)庫,而MVCC則支持我們的無鎖讀以及事務(wù)的ACID屬性。
接下來的事務(wù)(Transaction)層,我之前已經(jīng)介紹過了。
然后是KVAPI,這是一組程序接口,它允許開發(fā)者對(duì)數(shù)據(jù)的輸入和輸出。
同樣,協(xié)處理器(Coprocesser)在前面也提過了。
最后是PlacementDriver,這是一個(gè)尤為重要的部分,因?yàn)樗蓞f(xié)助進(jìn)行異地備份,水平擴(kuò)展以及一致性的分布式事務(wù)。稍后我將對(duì)其細(xì)節(jié)進(jìn)行進(jìn)一步補(bǔ)充。
TiKV軟件棧
圖2 TiKV軟件棧
讓我們來看一下軟件棧。首先,我們會(huì)發(fā)現(xiàn)客戶端與TiKV相連。同時(shí)我們還能看見幾個(gè)Node。而在每個(gè)Node當(dāng)中都有Store,每一個(gè)物理磁盤存一個(gè)store。在每個(gè)Store當(dāng)中,我們又劃出許多Region。而Region是數(shù)據(jù)遷移的基本單位,并且經(jīng)由Raft備份。每個(gè)Region都被同步到多個(gè)節(jié)點(diǎn)。一個(gè)Raftgroup由一個(gè)Region的數(shù)個(gè)備份組成。如你所見,每個(gè)Region在三個(gè)不同的節(jié)點(diǎn)上有三個(gè)備份。
驅(qū)動(dòng)程序配置
PD,又稱placement driver,這一名稱來源自Spanner的原文。它是集群管理器,提供了該集群的上帝視角。它由兩個(gè)部分構(gòu)成:rebalancer和time stampal locator。PD對(duì)Region副本進(jìn)行周期性檢測(cè),平衡負(fù)載,并自動(dòng)處理數(shù)據(jù)遷移。當(dāng)它檢測(cè)到負(fù)載過高時(shí),將會(huì)重新平衡數(shù)據(jù)。
TiDB
以TiKV為基礎(chǔ)的NewSQL:它將TiKV轉(zhuǎn)變成了一個(gè)NewSQL數(shù)據(jù)庫。
異步schema改變:你可以在不停止也不影響正在進(jìn)行的操作的前提下,添加新的列以及索引。本質(zhì)上看,它是一個(gè)多階段協(xié)議。
與MySQL協(xié)議兼容:TiDB服務(wù)器遵從MySQL協(xié)議,并且遵循其SQL語法。換句話說就是在大多情況下,你能夠在不更改任何一行代碼的同時(shí),通過用TiDB替換MySQL來增強(qiáng)你的應(yīng)用。TiDB適用于MySQL應(yīng)用和管理工具,比phpMyAdmin、Navicat以及WordPress。同時(shí),很多ORM也可以在TiDB上很好的工作,例如Hibernate、GORM、ActiveRecord、SQLAlchemy等。
TiDB的架構(gòu)
讓我們來看一下TiDB的架構(gòu):
圖3 TiDB的架構(gòu)
MySQL客戶端:頂層是一組MySQL客戶端,這些客戶端向下一層發(fā)送請(qǐng)求。在這里你仍然可以使用你所熟悉的MySQL驅(qū)動(dòng)程序。
負(fù)載平衡器:這一層屬于可選層,例如HAProxy以及LVS。
TiDB服務(wù)器:它是無狀態(tài)的,一個(gè)客戶端可以同任何一個(gè)TiDB服務(wù)器相連接。在TiDB服務(wù)器內(nèi)部,最頂層提供MySQL協(xié)議支持;下一層是SQLPlan層,往往被用以將MySQL請(qǐng)求轉(zhuǎn)換成TiDBSQLPlan;底層則是KVAPI以及分布式SQLAPI。如果較底層的存儲(chǔ)引擎支持協(xié)處理器,TiDBSQL層將會(huì)使用比KVAPI更為高效的DistSQLAPI。TiDB支持插件式存儲(chǔ)引擎,早期支持HBase。同時(shí)作為試驗(yàn)性存儲(chǔ)引擎,我們還支持CockroachDB。但我們推薦TiKV為默認(rèn)存儲(chǔ)引擎。
TiDB如何使SQL與KV相匹配
讓我們用一個(gè)例子來展示一個(gè)SQL表是如何映射成KV對(duì)的。
假設(shè)我們的數(shù)據(jù)庫里有一張簡(jiǎn)單的用戶表。它有一行三列:nickname、email和age。此處的nickname類型是字符串,且nickname是主鍵。
圖4 該假設(shè)表
如果我們映射這張表到KV對(duì),Key就分成了三個(gè)部分:table、rowkey、column。而這時(shí)的KV對(duì)排列如下:
圖5 KV對(duì)排
現(xiàn)在,我們得到了一個(gè)典型的SQLstatement:按用戶名bob篩選email和age;如果映射為KV操作的話,則表達(dá)如下:
email=kv.Get(”user/bob/email”)
age=kv.Get(”user/bob/age”)
這就是在一個(gè)使用字符串的通用KV數(shù)據(jù)庫中的存儲(chǔ)方式。在TiDB內(nèi)部,每個(gè)表,每一列都有一個(gè)唯一的ID。所以TiDB使用表ID以及列ID來取代字符串。因此在TiDB中,表id是1,nickname列id為2,email列id為3,age列id則為4,而這一TiDB表顯示如下:
圖6 TiDB表
以上就是我今天演講的全部?jī)?nèi)容。謝謝大家。
核心關(guān)注:拓步ERP系統(tǒng)平臺(tái)是覆蓋了眾多的業(yè)務(wù)領(lǐng)域、行業(yè)應(yīng)用,蘊(yùn)涵了豐富的ERP管理思想,集成了ERP軟件業(yè)務(wù)管理理念,功能涉及供應(yīng)鏈、成本、制造、CRM、HR等眾多業(yè)務(wù)領(lǐng)域的管理,全面涵蓋了企業(yè)關(guān)注ERP管理系統(tǒng)的核心領(lǐng)域,是眾多中小企業(yè)信息化建設(shè)首選的ERP管理軟件信賴品牌。
轉(zhuǎn)載請(qǐng)注明出處:拓步ERP資訊網(wǎng)http://www.ezxoed.cn/
本文標(biāo)題:PingCAP劉奇:如何構(gòu)建一個(gè)NewSQL數(shù)據(jù)庫
本文網(wǎng)址:http://www.ezxoed.cn/html/support/11121519689.html