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