TiDB
是
PingCAP
公司設計的開源分布式
NewSQL
資料庫。由于它相容
MySQL
協定,并支援絕大多數
SQL
功能(比如
joins
,
subqueries
,
transaction
等)。業務能夠直接通過
MySQL connector
去使用它來替換
MySQL
。
TiDB
适合場景:
- 資料量大,
複雜查詢很慢。MySQL
影響業務的使用。Online DDL
-
單機容量或者性能達到瓶頸,不想分庫分表或者使用資料庫中間件等對業務侵入性較大、對業務有限制的MySQL
方案。Sharding
- 有高并發實時寫入、實時查詢、實時統計分析的需求。
- 有分布式事務、多資料中心的資料
強一緻性、100%
的高可用的需求。auto-failover
TiDB
與
MySQL
相比,有什麼優勢,讓它更适合上述場景?接下來将從以下六個方面進行對比。
1. TiDB
實作分布式的 SQL
引擎和存儲
TiDB
SQL
MySQL
水準擴充一般是主從複制,典型的就是一主多從模式。但這種隻适合讀多寫少的業務。碰到大寫入量的業務,這種模式反而會成為瓶頸。那麼就必須尋求其他的分布式方案,有以下兩種思路:
- 基于修改
的分布式方案。通過MySQL
的MySQL
把Server
變成分布式資料庫,但由于InnoDB
生成的執行計劃是單機的,這不是一個分布式的MySQL
。不了解底層分布式存儲,是無法選擇一個最高效率的執行計劃。Plan
- 基于中間件方式的分布式方案,比如 ProxySQL 。做一款中間件需要考慮很多,比如通過解析
解析出SQL
,然後根據ShardKey
分發請求,再合并結果。另外在中間件這層還需要維護ShardKey
并儲存緩存結果。大多數方案并不支援分布式Session
,不支援跨節點Transaction
,無法處理複雜Join
,也不會處理Plan
。同時業務需要維護Subqueries
,不支援ShardKey
導緻業務開發效率降低。ORM
以上
MySQL
的問題是由傳統架構模式本身帶來的,而
TiDB
的模式是不一樣的。它在
TiDB Server
層實作了分布式的SQL引擎,依賴
TiKV
來提供分布式存儲和
分布式事務支援,分布式的設計也友善做水準擴充。以上
MySQL
分布式方案帶來的問題,
TiDB
都能做很好的解決,這是架構本身帶來的優勢。

如上圖所示,
TiDB
叢集主要分為以下三個元件:
-
TiDB Server
負責接收TiDB Server
請求,處理SQL
相關的邏輯,并通過SQL
找到存儲計算所需資料的PD
位址,與TiKV
互動擷取資料,最終傳回結果。TiKV
本身并不存儲資料,隻負責計算,可以無限水準擴充。通過負載均衡元件(如TiDB Server
、LVS
或HAProxy
)對外提供統一的接入位址。F5
-
PD Server
(簡稱Placement Driver
)是整個叢集的管理子產品。其主要工作有三個:一是存儲叢集的元資訊(某個PD
存儲在哪個 TiKV節點);二是對Key
叢集進行排程和負載均衡(如資料的遷移、TiKV
成員變更等);三是配置設定全局唯一且遞增的事務Raft group leader
(支援分布式事務)。ID
-
TiKV Server
TiDB原了解析系列(一)---Why Do We Use it?
TiKV Server
負責存儲資料,從外部看
TiKV
是一個分布式的提供事務的
Key-Value
存儲引擎。存儲資料的基本機關是
Region
,每個
Region
負責存儲一個
Key Range
(從
StartKey
到
EndKey
的左閉右開區間)的資料,每個
TiKV
節點會負責多個
Region
TiKV
使用
Raft
協定做複制,保持資料的一緻性和容災。副本以
Region
為機關進行管理,不同節點上的多個
Region
構成一個
Raft Group
。資料在多個
TiKV
之間的負載均衡由
PD
排程,是以
Region
為機關進行排程。
2. TiDB
金融級的高可用
TiDB
MySQL
的複制方式是半同步或者是異步,半同步也可以降級成異步。也就是說任何時候資料出了問題是不敢切換的,因為有可能是異步複制,有一部分資料還沒有同步過來,這時候切換資料就不一緻了。多資料中心的複制和資料中心的容災,
MySQL
在這上面是做不好的。
而
TiDB/TiKV/PD
的三個元件都能容忍部分執行個體失效,并且不影響整個叢集的可用性,支援
跨中心部署下面分别說明這三個元件的單個執行個體失效後的服務狀态,以及如何進行恢複。
-
TiDB Server
是無狀态的,推薦至少部署兩個執行個體。當單個執行個體失效時,會影響正在這個執行個體上進行的服務,從應用的角度看,會出現單次請求失敗的情況,重新連接配接成功後即可繼續獲得服務。單個執行個體失效後,可以重新開機這個執行個體或者部署一個新的執行個體。TiDB Server
-
PD Server
是一個叢集,通過PD
協定保持資料的一緻性,單個執行個體失效時,如果這個執行個體不是Raft
Raft
,那麼服務完全不受影響;如果這個執行個體是leader
Raft
,會重新選出新的leader
,自動恢複服務。Raft leader
在選舉的過程中無法對外提供服務,這個時間大約是3秒鐘。推薦至少部署三個PD
執行個體,單個執行個體失效後,重新開機這個執行個體或者添加新的執行個體。PD
-
TiKV Server
TiKV
協定保持資料的一緻性(副本數量可配置,預設儲存三副本),并通過Raft
做負載均衡排程。單個節點失效時,會影響這個節點上存儲的所有PD
。對于Region
中的Region
結點,會中斷服務,等待重新選舉;對于Leader
Region
節點,不會影響服務。當某個Follower
節點失效,并且在一段時間内(預設TiKV
分鐘)無法恢複,10
會将其上的資料遷移到其他的PD
節點上。TiKV
3. TiDB
存儲引擎 RocksDB
TiDB
RocksDB
MySQL
預設存儲引擎從2010年起就一直是
InnoDB
InnoDB
B+
樹資料結構,這與傳統的商業資料庫相似。
TiDB
RocksDB
作為
TiKV
的存儲引擎。
讀寫性能的測試對比:
-
讀性能隻有RocksDB
性能的InnoDB-Compress
。但在高并發下,70%
平均響應時間表現要比RocksDB
。但與未壓縮的InnoDB-Compress好
還是差不少。InnoDB
-
寫性能表現優異,RocksDB
大概是QPS
InnoDB-Compress
倍。10
RocksDB
優勢是在于處理大型資料集,因為它可以更有效地壓縮資料并且插入資料性能優秀。
6億4千萬資料導入
MySQL
InnoDB
未經壓縮大小為
160GB
InnoDB-Compress
為
86GB
RocksDB
62GB
TiDB
更加适合大規模資料場景。資料條數少于
5000w
的場景下通常用不到
TiDB
,單機
MySQL
能滿足的場景也不需要用到
TiDB
4. TiDB
更好的解決了 Online DDL
問題
TiDB
Online DDL
業務發展迅速,應用模式頻繁更改是常态。相應地,資料庫通路模式和
Schema
也随之變化。
DDL
SQL
的一類,主要作用是建立和更改資料的
Schema
資訊,最常見的操作包括:加減列、更改列類型、加減索引等。
5.6
版本以後,
MySQL
内部開始支援
Online DDL
。但
MySQL
Online DDL
方案始終沒有解決下面問題:
MySQL
主備副本之間通過
Binlog
同步,主的
Schema
變更成功後,才會寫
BinLog
同步給備庫,然後備庫才開始做
DDL
。假設一個
DDL
變更需要一個小時,那麼備庫最多可能會延遲兩倍的變更時間。若變更期間,主庫發生故障,備庫資料還未追平,則無法提供服務的。
TiDB
Google F1
論文介紹的協定實作
線上DDLTikv
基本不感覺
DDL
操作。對于
Tikv
來說,所有的操作都是
PUT/GET/DELETE
,是以副本間的變更也與普通
DML
沒有差異。任何時候,隻要底層
raft
協定能正常
work
,三副本高可用和強一緻就能得到保證。這個方案雖然
Schema
變更比較麻煩,但對于
Tikv
存儲層特别友好,不用感覺
DDL
,共用一套機制保證高可用和強一緻。不會出現類似
MySQL
主備延遲和主備
Schema
不一緻問題。
DDL
更改也被分解成更小的轉換階段,這樣它們可以防止資料損壞場景,并且系統允許單個節點一次最多支援一個
DDL
版本。
5. TiDB
提供一站式 HTAP
解決方案
TiDB
HTAP
MySQL
團隊把注意力放在優化聯機事務處理(
OLTP
)查詢的性能上。也就是說,
MySQL
團隊花費更多的時間使簡單查詢執行得更好,而不是使所有或複雜查詢執行得更好。這種方法沒有錯,因為許多應用程式隻使用簡單的查詢。
TiDB
設計目标在處理混合事務/分析處理(
HTAP
)的性能上。對于那些希望對資料進行實時分析的應用來說,這是一個主要的賣點,因為它消除了在
MySQL
資料庫和分析資料庫之間進行的批量加載。一份存儲同時處理
OLTP & OLAP
,無需傳統繁瑣的
ETL
過程。
6. TiDB
可視化監控與告警
TiDB
這一點對運維非常友好。
MySQL
将關鍵監控名額放在記憶體表中,擷取它需要通過
SQL
查詢,可視化與告警部分都需要額外開發。而TiDB提供
Metrics接口,使用
Prometheus
記錄元件中各種操作的詳細資訊,使用
Grafana
進行可視化展示。無須其他開發額外,根據需要,即可配置定制化自己的監控圖表和報警。
總結
在替代
MySQL
的場景中,
TiDB
MySQL
相比更加适合大數量的場景;同時也補充了
MySQL
的不足,比如處理
Online DDL
問題;在
MySQL
不适合的場景中,比如
HTAP
場景中也能發揮很好的優勢。如果你想更多了解
TiDB
作者的初衷,參閱
How do we build TiDB Meet TiDB: An open source NewSQL database