最近TiDB掀起了一波分佈式數據庫的熱潮,公司也在着手準備TiDB的落地工做,前幾天也參與了幾場公司針對TiDB的分享會,下面咱們瞭解一下關於TiDB。php
TiDB 是什麼?mysql
TiDB 是一個分佈式 NewSQL 數據庫。它支持水平彈性擴展、ACID 事務、標準 SQL、MySQL 語法和 MySQL 協議,具備數據強一致的高可用特性,是一個不只適合 OLTP 場景還適合 OLAP 場景的混合數據庫。linux
TiDB怎麼來的?nginx
著名的開源分佈式緩存服務 Codis 的做者,PingCAP聯合創始人& CTO ,資深 infrastructure 工程師的黃東旭,擅長分佈式存儲系統的設計與實現,開源狂熱分子的技術大神級別人物。即便在互聯網如此繁榮的今天,在數據庫這片邊界模糊且不肯定地帶,他還在努力尋找肯定性的實踐方向。git
直到 2012 年末,他看到 Google 發佈的兩篇論文,如同棱鏡般,折射出他本身心裏微爍的光彩。這兩篇論文描述了 Google 內部使用的一個海量關係型數據庫 F1/Spanner ,解決了關係型數據庫、彈性擴展以及全球分佈的問題,並在生產中大規模使用。「若是這個能實現,對數據存儲領域來講將是顛覆性的」,黃東旭爲完美方案的出現而興奮, PingCAP 的 TiDB 在此基礎上誕生了。程序員
TiDB架構github
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 那樣依賴底層的分佈式文件系統,在性能和靈活性上能更好,這個對於在線業務來講是很是重要。web
▲ TiDB 總體架構算法
因此一套集羣是又這樣的3類角色共同組建而成。每一個部分的解釋以下:sql
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 協力開發。)。
TiDB 對比 NOSQL
TiDB 對於這些 NoSQL 來講,最大的特色是編程接口是 SQL,SQL對於開發者而言是更加靈活的操做數據庫的方式,且對 MySQL 有着極高的兼容性—原業務的 MySQL切換到 TiDB 幾乎一行代碼都不用修改就能夠完成。TiDB 在支持 SQL 的同時有沒有喪失 HBase 這樣的系統的彈性擴展能力,業務層不須要再去關心數據庫的容量,不用去考慮分庫分表,也不用像過去那樣投入很大的運維力量,擴容只需簡單加機器就好,存儲節點故障對業務透明,並且數據庫自己具備自我修復的能力,保證數據不會丟失。 對於 MongoDB 也是同樣,更重要的是不須要改變用戶已有的習慣和程序,並且爲了定義將來的雲上的數據庫形態,TiDB 設計的目標是單集羣須要能夠 Scale 到 1000 以上物理節點的規模,支持 P 級別容量,萬億以上的行的結構化數據存儲,在這個前提約束下的設計和技術選型和 MongoDB 很不同,在大數據量的狀況下 TiDB 的表現更穩定,擴展更加平滑。 TiDB 的 SQL 優化器是黃東旭他們從頭開始實現的一個面向分佈式存儲設計的查詢優化器,使用了不少學術界很新的查詢優化技術和分佈式計算框架的思想,保證 MySQL 兼容性的前提下比 MySQL 在複雜查詢下表現要好得多。
與 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_255273
1
nginx
本號專一於linux+nginx+mysql+php 知識交流和分享,有理論知識,更有實際項目的經歷。能保證的是本號全部分享都或多或少能夠助你在技術的道路上向高處奔走。
2
Java北京
從算法基礎到經常使用框架的知識體系,從初級程序員到高級架構師的成長之路,從創業小團隊到Google、BAT的工做機會,始於JAVA而又不止於JAVA。JAVAer在北京,咱們一塊兒成長。
3
水手在掙扎
貧瘠的思想不要放棄渴求養分的權利。