我們聽到的TiDB到底是什麼?!

Java架構大師2019-04-22 10:28:33

最近TiDB掀起了一波分佈式數據庫的熱潮,公司也在着手準備TiDB的培訓工作,前幾天也參與了幾場公司針對TiDB的培訓,下面我們瞭解一下關於TiDB。

TiDB 是什麼?

TiDB 是一個分佈式 NewSQL 數據庫。它支持水平彈性擴展、ACID 事務、標準 SQL、MySQL 語法和 MySQL 協議,具有數據強一致的高可用特性,是一個不僅適合 OLTP 場景還適OLAP 場景的混合數據庫。

TiDB怎麼來的?

開源分佈式緩存服務 Codis 的作者,PingCAP 聯合創始人& CTO ,資深 infrastructure 工程師的黃東旭,擅長分佈式存儲系統的設計與實現,開源狂熱分子的技術大神級別人物。即使在互聯網如此繁榮的今天,在數據庫這片邊界模糊且不確定地帶,他還在努力尋找確定性的實踐方向。

2012 年底,他看到 Google 發佈的兩篇論文,得到了很大的觸動,這兩篇論文描述了 Google 內部使用的一個海量關係型數據庫 F1/Spanner ,解決了關係型數據庫、彈性擴展以及全球分佈的問題,並在生產中大規模使用。“如果這個能實現,對數據存儲領域來說將是顛覆性的”,黃東旭爲完美方案的出現而興奮, PingCAP 的 TiDB 在此基礎上誕生了。

TiDB架構

TiDB在整體架構基本是參考 Google Spanner 和 F1 的設計,上分兩層爲 TiDB  TiKV 。 TiDB 對應的是 Google F1, 是一層無狀態的 SQL Layer ,兼容絕大多數 MySQL 語法,對外暴露 MySQL 網絡協議,負責解析用戶的 SQL 語句,生成分佈式的 Query Plan,翻譯成底層 Key Value 操作發送給 TiKV , TiKV 是真正的存儲數據的地方,對應的是 Google Spanner ,是一個分佈式 Key Value 數據庫,支持彈性水平擴展,自動的災難恢復和故障轉移(高可用),以及 ACID 跨行事務。值得一提的是 TiKV 並不像 HBase 或者 BigTable 那樣依賴底層的分佈式文件系統,在性能和靈活性上能更好,這個對於在線業務來說是非常重要。

所以一套集羣是又這樣的3類角色共同組建而成。每個部分的解釋如下:

TiDB Server

TiDB Server 負責接收 SQL 請求,處理 SQL 相關的邏輯,並通過 PD 找到存儲計算所需數據的 TiKV 地址,與 TiKV 交互獲取數據,最終返回結果。 TiDB Server 是無狀態的,其本身並不存儲數據,只負責計算,可以無限水平擴展,可以通過負載均衡組件(如LVS、HAProxy 或 F5)對外提供統一的接入地址。

PD Server

Placement Driver (簡稱 PD) 是整個集羣的管理模塊,其主要工作有三個: 一是存儲集羣的元信息(某個 Key 存儲在哪個 TiKV 節點);二是對 TiKV 集羣進行調度和負載均衡(如數據的遷移、Raft group leader 的遷移等);三是分配全局唯一且遞增的事務 ID。 PD 是一個集羣,需要部署奇數個節點,一般線上推薦至少部署 3 個節點。

TiKV Server

TiKV Server 負責存儲數據,從外部看 TiKV 是一個分佈式的提供事務的 Key-Value 存儲引擎。存儲數據的基本單位是 Region,每個 Region 負責存儲一個 Key Range (從 StartKey 到 EndKey 的左閉右開區間)的數據,每個 TiKV 節點會負責多個 Region 。TiKV 使用 Raft 協議做複製,保持數據的一致性和容災。副本以 Region 爲單位進行管理,不同節點上的多個 Region 構成一個 Raft Group,互爲副本。數據在多個 TiKV 之間的負載均衡由 PD 調度,這裏也是以 Region 爲單位進行調度。 當然做這件事情,我是認真的,而不是簡單試一下就完事了。我列了一個基本的計劃,來看看是否能夠滿足一些痛點,改進一些情況。

TiDB開發語言

在 TiDB 研發語言的選擇過程中,放棄了 Java 而採用 Go 。TiDB整個項目分爲兩層,TiDB 作爲 SQL 層,採用 Go 語言開發, TiKV 作爲下邊的分佈式存儲引擎,採用 Rust 語言開發。在架構上確實類似 FoundationDB,也是基於兩層的結構。 FoundationDB 的 SQL Layer 採用 Java ,底層是 C++ ,不過在去年,被 Apple 收購了。 在選擇編程語言並沒有融入太多的個人喜好偏向, SQL 層選擇 Go 相對 Java 來說:

第一是 他們團隊的背景使用 Go 的開發效率更高,而且性能尚可,尤其對於高併發程序而言,可以使用 goroutine / channel 等工具用更少的代碼寫出正確的程序;

第二是 在標準庫中很多包對網絡程序開發非常友好,這個對於一個分佈式系統來說非常重要;

第三是 在存儲引擎底層對於性能要求很高,Go 畢竟是一個帶有 GC 和 Runtime 的語言,在 TiKV 層可以選擇的方案並不多,過去基本只有 C 或 C++,不過近兩年隨着 Rust 語言的成熟,又在經過長時間的思考和大量實驗,最終他們團隊選擇了 Rust( Rust是Mozilla開發的注重安全、性能和併發性的編程語言。“Rust”,由web語言的領軍人物Brendan Eich(js之父),Dave Herman以及Mozilla公司的Graydon Hoare 合力開發。)。

與 MySQL 兼容性對比

TiDB 支持包括跨行事務,JOIN 及子查詢在內的絕大多數 MySQL 的語法,用戶可以直接使用現有的 MySQL 客戶端連接。如果現有的業務已經基於 MySQL 開發,大多數情況不需要修改代碼即可直接替換單機的 MySQL。

包括現有的大多數 MySQL 運維工具(如 PHPMyAdmin, Navicat, MySQL Workbench 等),以及備份恢復工具(如 mysqldump, mydumper/myloader)等都可以直接使用。

不過一些特性由於在分佈式環境下沒法很好的實現,目前暫時不支持或者是表現與 MySQL 有差異。

一些 MySQL 語法在 TiDB 中可以解析通過,但是不會做任何後續的處理,例如 Create Table 語句中 Engine 以及 Partition 選項,都是解析並忽略。更多兼容性差異請參考具體的文檔。

不支持的特性

存儲過程

視圖

觸發器

自定義函數

外鍵約束

全文索引

空間索引

非 UTF8 字符集

TiDB 基本操作

下面具體介紹 TiDB 中基本的增刪改查操作。

創建、查看和刪除數據庫

使用 CREATE DATABASE 語句創建數據庫。語法如下:
CREATE DATABASE db_name [options];
例如,要創建一個名爲 samp_db 的數據庫,可使用以下語句:
CREATE DATABASE IF NOT EXISTS samp_db;
使用 SHOW DATABASES 語句查看數據庫:
SHOW DATABASES;
使用 DROP DATABASE 語句刪除數據庫,例如:
DROP DATABASE samp_db;

創建、查看和刪除表

使用 CREATE TABLE 語句創建表。語法如下:
CREATE TABLE table_name column_name data_type constraint;
例如:
CREATE TABLE person (
number INT(11),
name VARCHAR(255),
birthday DATE
);
如果表已存在,添加 IF NOT EXISTS 可防止發生錯誤:
CREATE TABLE IF NOT EXISTS person (
number INT(11),
name VARCHAR(255),
birthday DATE
);
使用 SHOW CREATE 語句查看建表語句。例如:
SHOW CREATE table person;
使用 SHOW FULL COLUMNS 語句查看錶的列。 例如:
SHOW FULL COLUMNS FROM person;
使用 DROP TABLE 語句刪除表。例如:
DROP TABLE person;
或者
DROP TABLE IF EXISTS person;
使用 SHOW TABLES 語句查看數據庫中的所有表。例如:
SHOW TABLES FROM samp_db;

創建、查看和刪除索引

對於值不唯一的列,可使用 CREATE INDEX 或 ALTER TABLE 語句。例如:
CREATE INDEX person_num ON person (number);
或者
ALTER TABLE person ADD INDEX person_num (number);
對於值唯一的列,可以創建唯一索引。例如:
CREATE UNIQUE INDEX person_num ON person (number);
或者
ALTER TABLE person ADD UNIQUE person_num on (number);
使用 SHOW INDEX 語句查看錶內所有索引:
SHOW INDEX from person;
使用 ALTER TABLE 或 DROP INDEX 語句來刪除索引。與 CREATE INDEX 語句類似,DROP INDEX 也可以嵌入 ALTER TABLE 語句。例如:
DROP INDEX person_num ON person;
ALTER TABLE person DROP INDEX person_num;

增刪改查數據

使用 INSERT 語句向表內插入數據。例如:
INSERT INTO person VALUES("1","tom","20170912");
使用 SELECT 語句檢索表內數據。例如:
SELECT * FROM person;
+--------+------+------------+
| number | name | birthday |+--------+------+------------+
| 1 | tom | 2017-09-12 |+--------+------+------------+
使用 UPDATE 語句修改表內數據。例如:
UPDATE person SET birthday='20171010' WHERE name='tom';
SELECT * FROM person;
+--------+------+------------+
| number | name | birthday |+--------+------+------------+
| 1 | tom | 2017-10-10 |+--------+------+------------+
使用 DELETE 語句刪除表內數據:
DELETE FROM person WHERE number=1;
SELECT * FROM person;
Empty set (0.00 sec)

創建、授權和刪除用戶

使用 CREATE USER 語句創建一個用戶 tiuser,密碼爲 123456:
CREATE USER 'tiuser'@'localhost' IDENTIFIED BY '123456';
授權用戶 tiuser 可檢索數據庫 samp_db 內的表:
GRANT SELECT ON samp_db.* TO 'tiuser'@'localhost';
查詢用戶 tiuser 的權限:
SHOW GRANTS for tiuser@localhost;
刪除用戶 tiuser:
DROP USER 'tiuser'@'localhost';

 

TiDB資料

TiDB中文簡介(牆裂推薦)

https://pingcap.com/docs-cn

TiDB最佳實踐等PPT

https://eyun.baidu.com/s/3huniXE0#sharelink/path=%2F

開源項目地址

https://github.com/pingcap/tidb

TiDB 部署指導

https://github.com/pingcap/docs-cn/blob/master/op-guide/binary-deployment.md#%E5%8D%95%E8%8A%82%E7%82%B9%E6%96%B9%E5%BC%8F%E5%BF%AB%E9%80%9F%E9%83%A8%E7%BD%B2

TiDB整體架構

https://github.com/pingcap/docs-cn/blob/master/overview.md#tidb-%E6%95%B4%E4%BD%93%E6%9E%B6%E6%9E%84

TiDB:支持 MySQL 協議的分佈式數據庫解決方案

http://www.sohu.com/a/55958574_255
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章