最近TiDB掀起了一波分布式數(shù)據(jù)庫(kù)的熱潮,公司也在著手準(zhǔn)備TiDB的落地工作浴鸿,前幾天也參與了幾場(chǎng)公司針對(duì)TiDB的分享會(huì)井氢,下面我們了解一下關(guān)于TiDB。
TiDB 是什么岳链?
TiDB 是一個(gè)分布式 NewSQL 數(shù)據(jù)庫(kù)花竞。它支持水平彈性擴(kuò)展、ACID 事務(wù)掸哑、標(biāo)準(zhǔn) SQL约急、MySQL 語(yǔ)法和 MySQL 協(xié)議,具有數(shù)據(jù)強(qiáng)一致的高可用特性苗分,是一個(gè)不僅適合 OLTP 場(chǎng)景還適合 OLAP 場(chǎng)景的混合數(shù)據(jù)庫(kù)厌蔽。
TiDB怎么來(lái)的?
著名的開(kāi)源分布式緩存服務(wù) Codis 的作者摔癣,PingCAP?聯(lián)合創(chuàng)始人& CTO 奴饮,資深 infrastructure 工程師的黃東旭,擅長(zhǎng)分布式存儲(chǔ)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)择浊,開(kāi)源狂熱分子的技術(shù)大神級(jí)別人物拐云。即使在互聯(lián)網(wǎng)如此繁榮的今天,在數(shù)據(jù)庫(kù)這片邊界模糊且不確定地帶近她,他還在努力尋找確定性的實(shí)踐方向叉瘩。
直到 2012 年底,他看到 Google 發(fā)布的兩篇論文粘捎,如同棱鏡般薇缅,折射出他自己內(nèi)心微爍的光彩危彩。這兩篇論文描述了 Google 內(nèi)部使用的一個(gè)海量關(guān)系型數(shù)據(jù)庫(kù) F1/Spanner ,解決了關(guān)系型數(shù)據(jù)庫(kù)泳桦、彈性擴(kuò)展以及全球分布的問(wèn)題汤徽,并在生產(chǎn)中大規(guī)模使用【淖“如果這個(gè)能實(shí)現(xiàn)谒府,對(duì)數(shù)據(jù)存儲(chǔ)領(lǐng)域來(lái)說(shuō)將是顛覆性的”,黃東旭為完美方案的出現(xiàn)而興奮浮毯, PingCAP 的 TiDB 在此基礎(chǔ)上誕生了完疫。
TiDB架構(gòu)
TiDB在整體架構(gòu)基本是參考 Google Spanner 和 F1 的設(shè)計(jì),上分兩層為?TiDB?和?TiKV?债蓝。 TiDB 對(duì)應(yīng)的是 Google F1壳鹤, 是一層無(wú)狀態(tài)的 SQL Layer ,兼容絕大多數(shù) MySQL 語(yǔ)法饰迹,對(duì)外暴露 MySQL 網(wǎng)絡(luò)協(xié)議芳誓,負(fù)責(zé)解析用戶的 SQL 語(yǔ)句,生成分布式的 Query Plan啊鸭,翻譯成底層 Key Value 操作發(fā)送給 TiKV 锹淌, TiKV 是真正的存儲(chǔ)數(shù)據(jù)的地方,對(duì)應(yīng)的是 Google Spanner 赠制,是一個(gè)分布式 Key Value 數(shù)據(jù)庫(kù)葛圃,支持彈性水平擴(kuò)展,自動(dòng)的災(zāi)難恢復(fù)和故障轉(zhuǎn)移(高可用)憎妙,以及 ACID 跨行事務(wù)。值得一提的是 TiKV 并不像 HBase 或者 BigTable 那樣依賴底層的分布式文件系統(tǒng)曲楚,在性能和靈活性上能更好厘唾,這個(gè)對(duì)于在線業(yè)務(wù)來(lái)說(shuō)是非常重要。
所以一套集群是又這樣的3類角色共同組建而成龙誊。每個(gè)部分的解釋如下:
TiDB Server?
TiDB Server 負(fù)責(zé)接收 SQL 請(qǐng)求抚垃,處理 SQL 相關(guān)的邏輯,并通過(guò) PD 找到存儲(chǔ)計(jì)算所需數(shù)據(jù)的 TiKV 地址趟大,與 TiKV 交互獲取數(shù)據(jù)鹤树,最終返回結(jié)果。 TiDB Server 是無(wú)狀態(tài)的逊朽,其本身并不存儲(chǔ)數(shù)據(jù)罕伯,只負(fù)責(zé)計(jì)算,可以無(wú)限水平擴(kuò)展叽讳,可以通過(guò)負(fù)載均衡組件(如LVS追他、HAProxy 或 F5)對(duì)外提供統(tǒng)一的接入地址坟募。?
PD Server?
Placement Driver (簡(jiǎn)稱 PD) 是整個(gè)集群的管理模塊,其主要工作有三個(gè): 一是存儲(chǔ)集群的元信息(某個(gè) Key 存儲(chǔ)在哪個(gè) TiKV 節(jié)點(diǎn))邑狸;二是對(duì) TiKV 集群進(jìn)行調(diào)度和負(fù)載均衡(如數(shù)據(jù)的遷移懈糯、Raft group leader 的遷移等);三是分配全局唯一且遞增的事務(wù) ID单雾。 PD 是一個(gè)集群赚哗,需要部署奇數(shù)個(gè)節(jié)點(diǎn),一般線上推薦至少部署 3 個(gè)節(jié)點(diǎn)硅堆。?
TiKV Server?
TiKV Server 負(fù)責(zé)存儲(chǔ)數(shù)據(jù)屿储,從外部看 TiKV 是一個(gè)分布式的提供事務(wù)的 Key-Value 存儲(chǔ)引擎。存儲(chǔ)數(shù)據(jù)的基本單位是 Region硬萍,每個(gè) Region 負(fù)責(zé)存儲(chǔ)一個(gè) Key Range (從 StartKey 到 EndKey 的左閉右開(kāi)區(qū)間)的數(shù)據(jù)扩所,每個(gè) TiKV 節(jié)點(diǎn)會(huì)負(fù)責(zé)多個(gè) Region 。TiKV 使用 Raft 協(xié)議做復(fù)制朴乖,保持?jǐn)?shù)據(jù)的一致性和容災(zāi)祖屏。副本以 Region 為單位進(jìn)行管理,不同節(jié)點(diǎn)上的多個(gè) Region 構(gòu)成一個(gè) Raft Group买羞,互為副本袁勺。數(shù)據(jù)在多個(gè) TiKV 之間的負(fù)載均衡由 PD 調(diào)度,這里也是以 Region 為單位進(jìn)行調(diào)度畜普。 當(dāng)然做這件事情期丰,我是認(rèn)真的,而不是簡(jiǎn)單試一下就完事了吃挑。我列了一個(gè)基本的計(jì)劃钝荡,來(lái)看看是否能夠滿足一些痛點(diǎn),改進(jìn)一些情況舶衬。
TiDB開(kāi)發(fā)語(yǔ)言
在 TiDB 研發(fā)語(yǔ)言的選擇過(guò)程中埠通,放棄了 Java 而采用 Go 。TiDB整個(gè)項(xiàng)目分為兩層逛犹,TiDB 作為 SQL 層端辱,采用 Go 語(yǔ)言開(kāi)發(fā), TiKV 作為下邊的分布式存儲(chǔ)引擎虽画,采用 Rust 語(yǔ)言開(kāi)發(fā)舞蔽。在架構(gòu)上確實(shí)類似 FoundationDB,也是基于兩層的結(jié)構(gòu)码撰。 FoundationDB 的 SQL Layer 采用 Java 渗柿,底層是 C++ ,不過(guò)在去年脖岛,被 Apple 收購(gòu)了做祝。 在選擇編程語(yǔ)言并沒(méi)有融入太多的個(gè)人喜好偏向砾省, SQL 層選擇 Go 相對(duì) Java 來(lái)說(shuō):?
第一是?他們團(tuán)隊(duì)的背景使用 Go 的開(kāi)發(fā)效率更高,而且性能尚可混槐,尤其對(duì)于高并發(fā)程序而言编兄,可以使用 goroutine / channel 等工具用更少的代碼寫(xiě)出正確的程序;?
第二是?在標(biāo)準(zhǔn)庫(kù)中很多包對(duì)網(wǎng)絡(luò)程序開(kāi)發(fā)非常友好声登,這個(gè)對(duì)于一個(gè)分布式系統(tǒng)來(lái)說(shuō)非常重要狠鸳;?
第三是?在存儲(chǔ)引擎底層對(duì)于性能要求很高,Go 畢竟是一個(gè)帶有 GC 和 Runtime 的語(yǔ)言悯嗓,在 TiKV 層可以選擇的方案并不多件舵,過(guò)去基本只有 C 或 C++,不過(guò)近兩年隨著 Rust 語(yǔ)言的成熟脯厨,又在經(jīng)過(guò)長(zhǎng)時(shí)間的思考和大量實(shí)驗(yàn)铅祸,最終他們團(tuán)隊(duì)選擇了 Rust( Rust是Mozilla開(kāi)發(fā)的注重安全、性能和并發(fā)性的編程語(yǔ)言合武×俟#“Rust”,由web語(yǔ)言的領(lǐng)軍人物Brendan Eich(js之父)稼跳,Dave Herman以及Mozilla公司的Graydon Hoare 合力開(kāi)發(fā)盟庞。)。
TiDB 對(duì)比 NOSQL
TiDB 對(duì)于這些 NoSQL 來(lái)說(shuō)汤善,最大的特點(diǎn)是編程接口是 SQL什猖,SQL對(duì)于開(kāi)發(fā)者而言是更加靈活的操作數(shù)據(jù)庫(kù)的方式,且對(duì) MySQL 有著極高的兼容性—原業(yè)務(wù)的 MySQL切換到 TiDB 幾乎一行代碼都不用修改就可以完成红淡。TiDB 在支持 SQL 的同時(shí)有沒(méi)有喪失 HBase 這樣的系統(tǒng)的彈性擴(kuò)展能力不狮,業(yè)務(wù)層不需要再去關(guān)心數(shù)據(jù)庫(kù)的容量,不用去考慮分庫(kù)分表在旱,也不用像過(guò)去那樣投入很大的運(yùn)維力量摇零,擴(kuò)容只需簡(jiǎn)單加機(jī)器就好,存儲(chǔ)節(jié)點(diǎn)故障對(duì)業(yè)務(wù)透明颈渊,而且數(shù)據(jù)庫(kù)本身具有自我修復(fù)的能力,保證數(shù)據(jù)不會(huì)丟失终佛。 對(duì)于 MongoDB 也是一樣俊嗽,更重要的是不需要改變用戶已有的習(xí)慣和程序,而且為了定義未來(lái)的云上的數(shù)據(jù)庫(kù)形態(tài)铃彰,TiDB 設(shè)計(jì)的目標(biāo)是單集群需要可以 Scale 到 1000 以上物理節(jié)點(diǎn)的規(guī)模绍豁,支持 P 級(jí)別容量,萬(wàn)億以上的行的結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)牙捉,在這個(gè)前提約束下的設(shè)計(jì)和技術(shù)選型和 MongoDB 很不一樣竹揍,在大數(shù)據(jù)量的情況下 TiDB 的表現(xiàn)更穩(wěn)定敬飒,擴(kuò)展更加平滑。 TiDB 的 SQL 優(yōu)化器是黃東旭他們從頭開(kāi)始實(shí)現(xiàn)的一個(gè)面向分布式存儲(chǔ)設(shè)計(jì)的查詢優(yōu)化器芬位,使用了很多學(xué)術(shù)界很新的查詢優(yōu)化技術(shù)和分布式計(jì)算框架的思想无拗,保證 MySQL 兼容性的前提下比 MySQL 在復(fù)雜查詢下表現(xiàn)要好得多。
與 MySQL 兼容性對(duì)比
TiDB 支持包括跨行事務(wù)昧碉,JOIN 及子查詢?cè)趦?nèi)的絕大多數(shù) MySQL 的語(yǔ)法英染,用戶可以直接使用現(xiàn)有的 MySQL 客戶端連接。如果現(xiàn)有的業(yè)務(wù)已經(jīng)基于 MySQL 開(kāi)發(fā)被饿,大多數(shù)情況不需要修改代碼即可直接替換單機(jī)的 MySQL四康。
包括現(xiàn)有的大多數(shù) MySQL 運(yùn)維工具(如 PHPMyAdmin, Navicat, MySQL Workbench 等),以及備份恢復(fù)工具(如 mysqldump, mydumper/myloader)等都可以直接使用狭握。
不過(guò)一些特性由于在分布式環(huán)境下沒(méi)法很好的實(shí)現(xiàn)闪金,目前暫時(shí)不支持或者是表現(xiàn)與 MySQL 有差異。
一些 MySQL 語(yǔ)法在 TiDB 中可以解析通過(guò)论颅,但是不會(huì)做任何后續(xù)的處理哎垦,例如 Create Table 語(yǔ)句中?Engine?以及?Partition?選項(xiàng),都是解析并忽略嗅辣。更多兼容性差異請(qǐng)參考具體的文檔撼泛。
不支持的特性
? ??存儲(chǔ)過(guò)程
? ??視圖
? ??觸發(fā)器
? ??自定義函數(shù)
? ??外鍵約束
? ??全文索引
? ??空間索引
? ??非 UTF8 字符集
TiDB 基本操作
下面具體介紹 TiDB 中基本的增刪改查操作。
創(chuàng)建澡谭、查看和刪除數(shù)據(jù)庫(kù)
使用?CREATE DATABASE?語(yǔ)句創(chuàng)建數(shù)據(jù)庫(kù)愿题。語(yǔ)法如下:
CREATE DATABASE db_name [options];
例如,要?jiǎng)?chuàng)建一個(gè)名為?samp_db?的數(shù)據(jù)庫(kù)蛙奖,可使用以下語(yǔ)句:
CREATE DATABASE IF NOT EXISTS samp_db;
使用?SHOW DATABASES?語(yǔ)句查看數(shù)據(jù)庫(kù):
SHOW DATABASES;
使用?DROP DATABASE?語(yǔ)句刪除數(shù)據(jù)庫(kù)潘酗,例如:
DROP DATABASE samp_db;
創(chuàng)建、查看和刪除表
使用?CREATE TABLE?語(yǔ)句創(chuàng)建表雁仲。語(yǔ)法如下:
CREATE TABLE table_name column_name data_type constraint;
例如:
CREATE TABLE person (
number INT(11),
name VARCHAR(255),
birthday DATE
);
如果表已存在仔夺,添加?IF NOT EXISTS?可防止發(fā)生錯(cuò)誤:
CREATE TABLE IF NOT EXISTS person (
number INT(11),
name VARCHAR(255),
birthday DATE
);
使用?SHOW CREATE?語(yǔ)句查看建表語(yǔ)句。例如:
SHOW CREATE table person;
使用?SHOW FULL COLUMNS?語(yǔ)句查看表的列攒砖。 例如:
SHOW FULL COLUMNS FROM person;
使用?DROP TABLE?語(yǔ)句刪除表缸兔。例如:
DROP TABLE person;
或者
DROP TABLE IF EXISTS person;
使用?SHOW TABLES?語(yǔ)句查看數(shù)據(jù)庫(kù)中的所有表。例如:
SHOW TABLES FROM samp_db;
創(chuàng)建吹艇、查看和刪除索引
對(duì)于值不唯一的列惰蜜,可使用?CREATE INDEX?或?ALTER TABLE?語(yǔ)句。例如:
CREATE INDEX person_num ON person (number);
或者
ALTER TABLE person ADD INDEX person_num (number);
對(duì)于值唯一的列受神,可以創(chuàng)建唯一索引抛猖。例如:
CREATE UNIQUE INDEX person_num ON person (number);
或者
ALTER TABLE person ADD UNIQUE person_num on (number);
使用?SHOW INDEX?語(yǔ)句查看表內(nèi)所有索引:
SHOW INDEX from person;
使用?ALTER TABLE?或?DROP INDEX?語(yǔ)句來(lái)刪除索引。與?CREATE INDEX?語(yǔ)句類似,DROP INDEX?也可以嵌入?ALTER TABLE?語(yǔ)句财著。例如:
DROP INDEX person_num ON person;
ALTER TABLE person DROP INDEX person_num;
增刪改查數(shù)據(jù)
使用?INSERT?語(yǔ)句向表內(nèi)插入數(shù)據(jù)联四。例如:
INSERT INTO person VALUES("1","tom","20170912");
使用?SELECT?語(yǔ)句檢索表內(nèi)數(shù)據(jù)。例如:
SELECT * FROM person;
+--------+------+------------+
| number | name | birthday |+--------+------+------------+
| 1 | tom | 2017-09-12 |+--------+------+------------+
使用?UPDATE?語(yǔ)句修改表內(nèi)數(shù)據(jù)撑教。例如:
UPDATE person SET birthday='20171010' WHERE name='tom';
SELECT * FROM person;
+--------+------+------------+
| number | name | birthday |+--------+------+------------+
| 1 | tom | 2017-10-10 |+--------+------+------------+
使用?DELETE?語(yǔ)句刪除表內(nèi)數(shù)據(jù):
DELETE FROM person WHERE number=1;
SELECT * FROM person;
Empty set (0.00 sec)
創(chuàng)建朝墩、授權(quán)和刪除用戶
使用?CREATE USER?語(yǔ)句創(chuàng)建一個(gè)用戶?tiuser,密碼為?123456:
CREATE USER 'tiuser'@'localhost' IDENTIFIED BY '123456';
授權(quán)用戶?tiuser?可檢索數(shù)據(jù)庫(kù)?samp_db?內(nèi)的表:
GRANT SELECT ON samp_db.* TO 'tiuser'@'localhost';
查詢用戶?tiuser?的權(quán)限:
SHOW GRANTS for tiuser@localhost;
刪除用戶?tiuser:
DROP USER 'tiuser'@'localhost';
TiDB資料
TiDB中文簡(jiǎn)介(墻裂推薦)
https://pingcap.com/docs-cn
TiDB最佳實(shí)踐等PPT
https://eyun.baidu.com/s/3huniXE0#sharelink/path=%2F
開(kāi)源項(xiàng)目地址
https://github.com/pingcap/tidb
tidb 部署指導(dǎo)?
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整體架構(gòu)?
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 協(xié)議的分布式數(shù)據(jù)庫(kù)解決方案?
http://www.sohu.com/a/55958574_255273