PingCAP劉奇 如何構建乙個NewSQL資料庫

2021-07-22 20:32:45 字數 3771 閱讀 2777

75 0 0

【編者按】6月24日,由香港主辦、開源社群主導的國際技術會議,香港開源年會2016 (hkoscon)在港召開。pingcap 聯合創始人兼ceo劉奇應邀出席,與大家分享了《how to build a newsql database》的英文主題演講。

首先,來介紹下我自己。和你們當中很多人一樣,我是一名開源hacker,一名架構工程師,並長期致力於建立新一代資料庫。我曾投身於以下幾個開源專案的工作,包括tikv、tidb 和codis,這些專案都已在github上發布。今天,我的演講將涉及下列話題:

簡要介紹newsql;

如何建立乙個newsql資料庫;

以及roadmap。

▌為什麼我們需要乙個新的資料庫?

在正式開始前,我先問乙個問題:你們熟悉資料庫嗎?熟悉的朋友請舉手。謝謝!

另外,有誰知道mysql嗎?謝謝,比我預期的人數要少一些。

那麼,現有資料庫存在哪些問題呢?

因此,新一代資料庫將會是怎樣的?在我看來,其主要特徵應該是:

首先,它必須支援sql,因為這數十年來我們一直在使用sql,而且許多應用程式都使用sql,故而不能輕易將其捨棄。

第二,必須有良好的擴充套件性,也就是說只需通過接入更多的機器就可以擴充套件其容量或使之實現負載均衡。

第三,必須支援事務的acid屬性,這一點也恰恰是關聯式資料庫的主要特徵之一。有了強大的一致性作保障,開發者便可以用較短的**編寫出正確的程式。

最後,即使是在計算機陷入故障,甚至是整個資料中心癱瘓的情況下,它也應該能夠保持其較高的可用性。同時,它還應當可以自動修復。

總之,新一代資料庫應該既有很好的可擴充套件性,又能保留關聯式資料庫的主要特徵。

▌newsql是什麼?

你可能會好奇,這樣的資料庫真的存在嗎?它聽起來似乎太過完美和理想化了。這個問題的答案是肯定的,這樣的資料庫的確存在,它就是newsql。那什麼是newsql資料庫?先來看一看維基百科給出的解釋:

newsql是指這樣一類新式的關係型資料庫管理系統,它針對oltp實現讀-寫工作負載,追求提供和nosql系統相同的擴充套件效能,且仍然保持傳統資料庫支援的acid特性。

從上述定義來看,我們不難發現newsql的擴充套件性與nosql相當,並同時保留了acid特性。而這恰恰是我們需要的。

▌建立乙個newsql資料庫

今天我將向大家展示如何建立乙個這樣的資料庫。我們受到全球最大資料庫google spanner 和 f1 的啟發,將其分為兩個層級:

▌建立newsql資料庫

這就是我們在pingcap所從事的工作,當然是開源的。其中,我們的資料庫分為兩層,即kv層和sql層。就kv層來看,我們有tikv;對於sql層,則有tidb。而我將在稍後介紹其中的關鍵技術。這裡的ti是titanium(鈦)的縮寫,我們都知道鈦作為一種抗腐蝕性的化學元素,被廣泛應用於高階科技當中。

■tikv的特性

✦tikv架構

從上圖中可以看出,它經過了高度分層。

從底層往上看。底層是rocksdb,它是乙個持久的內嵌式kv儲存引擎。rocksdb的最初設計重點在於其極高的效能,可以輕鬆對讀放大、寫放大以及空間放大進行優化。

上面一層是raft kv,這一層用來實現分布式。

再往上是mvcc,即多版本併發控制(multi-version concurrency control)。我相信你們當中很多人對此都很熟悉。tikv是乙個多版本資料庫,而mvcc則支援我們的無鎖讀以及事務的acid屬性。

接下來的事務(transaction)層,我之前已經介紹過了。

然後是kv api,這是一組程式介面,它允許開發者對資料的輸入和輸出。

同樣,協處理器(coprocesser)在前面也提過了。

最後是placement driver,這是乙個尤為重要的部分,因為它可協助進行異地備份,水平擴充套件以及一致性的分布式事務。稍後我將對其細節進行進一步補充。

✦tikv 軟體棧

讓我們來看一下軟體棧。首先,我們會發現客戶端與tikv相連。同時我們還能看見幾個node。而在每個node當中都有store,每乙個物理磁碟存乙個store。在每個 store 當中,我們又劃出許多region。而region是資料遷移的基本單位,並且經由raft備份。每個region都被同步到多個節點。乙個 raft group 由乙個 region 的數個備份組成。如你所見,每個 region 在三個不同的節點上有三個備份。

✦驅動程式配置

pd,又稱 placement driver,這一名稱**自spanner的原文。它是集群管理器,提供了該集群的上帝視角。它由兩個部分構成:rebalancer和timestamp allocator。pd對region副本進行週期性檢測,平衡負載,並自動處理資料遷移。當它檢測到負載過高時,將會重新平衡資料。

■tidb

- 以tikv為基礎的newsql:它將tikv轉變成了乙個newsql資料庫。

✦tidb的架構

讓我們來看一下tidb的架構:

mysql客戶端:頂層是一組mysql客戶端,這些客戶端向下一層傳送請求。在這裡你仍然可以使用你所熟悉的mysql驅動程式。

負載平衡器:這一層屬於可選層,例如haproxy 以及 lvs。

tidb伺服器:它是無狀態的,乙個客戶端可以同任何乙個tidb伺服器相連線。在tidb伺服器內部,最頂層提供mysql協議支援;下一層是sql plan層,往往被用以將mysql請求轉換成tidb sql plan;底層則是kv api以及分布式sql api。如果較底層的儲存引擎支援協處理器,tidb sql層將會使用比kv api更為高效的distsql api。tidb支援外掛程式式儲存引擎,早期支援hbase。同時作為試驗性儲存引擎,我們還支援cockroachdb。但我們推薦tikv為預設儲存引擎。

✦tidb如何使sql與kv相匹配

讓我們用乙個例子來展示乙個sql 表是如何對映成kv對的。

假設我們的資料庫裡有一張簡單的使用者表。它有一行三列:nickname、email和age。此處的nickname型別是字串,且nickname是主鍵。

nickname

email

agebob

[email protected]

如果我們對映這張表到kv對,key就分成了三個部分:table、row key、column。而這時的kv對排列如下:

key (table/row key/column)

value

user/bob/nickname

niluser/bob/email

[email protected]

user/bob/age30

現在,我們得到了乙個典型的sql statement:按使用者名稱bob篩選email和age;如果對映為kv操作的話,則表達如下:

這就是在乙個使用字串的通用kv資料庫中的儲存方式。在tidb內部,每個表,每一列都有乙個唯一的id。所以tidb使用表id以及列id來取代字串。因此在tidb中,表id是1,nickname列id為2,email列id為3,age列id則為4,而這一tidb表顯示如下:

key (table id/row id/column id)

value

1/bob/2

nil1/bob/3

[email protected]

1/bob/430

以上就是我今天演講的全部內容。謝謝大家。

如何利用Dockerfile檔案構建乙個新映象

dockerfile是由一系列引數和命令組成的指令碼,這些命令和引數應用於基礎映象並最終建立乙個新的映象。開發人員構建好乙個一致的開發環境,測試人員和運維人員就可以直接使用了。隨便找個目錄,新建個檔案,名稱必須為dockerfile 然後輸入 from centos cmd echo hello d...

構建乙個 synchronized

校對 智多芯 定稿 numbbbbb,cmb synchronized在 objective c 中是一種控制結構。它接受乙個物件指標作為引數,後面跟著一段 塊。物件指標充當鎖,在任何時候 synchronized 塊中只允許有乙個執行緒使用該物件指標。這是一種使用鎖進行多執行緒程式設計的簡單方法。...

學習乙個朱劉演算法

什麼是最小樹形圖?相信大家如果會過來看這篇文章,想必也應該對最小生成樹有所了解的,最小生成樹求的是無向圖的一顆生成樹的最小權值。我們的最小樹形圖就是來解決乙個有向圖的一顆生成樹的最小權值,對於度娘來說,最小樹形圖是這樣定義的 最小樹形圖,就是給有向帶權圖中指定乙個特殊的點root,求一棵以root為...