TIDB 開源分布式關(guān)系型數(shù)據(jù)庫
介紹
TiDB 是 PingCAP 公司自主設(shè)計、研發(fā)的開源分布式關(guān)系型數(shù)據(jù)庫,是一款同時支持在線事務(wù)處理與在線分析處理 (Hybrid Transactional and Analytical Processing, HTAP) 的融合型分布式數(shù)據(jù)庫產(chǎn)品,具備水平擴(kuò)容或者縮容、金融級高可用、實時 HTAP、云原生的分布式數(shù)據(jù)庫、兼容 MySQL 5.7 協(xié)議和 MySQL 生態(tài)等重要特性。目標(biāo)是為用戶提供一站式 OLTP (Online Transactional Processing)、OLAP (Online Analytical Processing)、HTAP 解決方案。TiDB 適合高可用、強(qiáng)一致要求較高、數(shù)據(jù)規(guī)模較大等各種應(yīng)用場景。
特點
- 一鍵水平擴(kuò)容或者縮容:得益于 TiDB 存儲計算分離的架構(gòu)的設(shè)計,可按需對計算、存儲分別進(jìn)行在線擴(kuò)容或者縮容,擴(kuò)容或者縮容過程中對應(yīng)用運維人員透明。
- 金融級高可用:數(shù)據(jù)采用多副本存儲,數(shù)據(jù)副本通過 Multi-Raft 協(xié)議同步事務(wù)日志,多數(shù)派寫入成功事務(wù)才能提交,確保數(shù)據(jù)強(qiáng)一致性且少數(shù)副本發(fā)生故障時不影響數(shù)據(jù)的可用性??砂葱枧渲酶北镜乩砦恢?、副本數(shù)量等策略滿足不同容災(zāi)級別的要求。
- 實時 HTAP:提供行存儲引擎 TiKV、列存儲引擎 TiFlash 兩款存儲引擎,TiFlash 通過 Multi-Raft Learner 協(xié)議實時從 TiKV 復(fù)制數(shù)據(jù),確保行存儲引擎 TiKV 和列存儲引擎 TiFlash 之間的數(shù)據(jù)強(qiáng)一致。TiKV、TiFlash 可按需部署在不同的機(jī)器,解決 HTAP 資源隔離的問題。
- 云原生的分布式數(shù)據(jù)庫:專為云而設(shè)計的分布式數(shù)據(jù)庫,通過 TiDB Operator 可在公有云、私有云、混合云中實現(xiàn)部署工具化、自動化。
- 兼容 MySQL 5.7 協(xié)議和 MySQL 生態(tài):兼容 MySQL 5.7 協(xié)議、MySQL 常用的功能、MySQL 生態(tài),應(yīng)用無需或者修改少量代碼即可從 MySQL 遷移到 TiDB。提供豐富的數(shù)據(jù)遷移工具幫助應(yīng)用便捷完成數(shù)據(jù)遷移。
與傳統(tǒng)的單機(jī)數(shù)據(jù)庫相比,TiDB 具有以下優(yōu)勢:
- 純分布式架構(gòu),擁有良好的擴(kuò)展性,支持彈性的擴(kuò)縮容。
- 支持 SQL,對外暴露 MySQL 的網(wǎng)絡(luò)協(xié)議,并兼容大多數(shù) MySQL 的語法,在大多數(shù)場景下可以直接替換 MySQL。
- 默認(rèn)支持高可用,在少數(shù)副本失效的情況下,數(shù)據(jù)庫本身能夠自動進(jìn)行數(shù)據(jù)修復(fù)和故障轉(zhuǎn)移,對業(yè)務(wù)透明。
- 支持 ACID 事務(wù),對于一些有強(qiáng)一致需求的場景友好,例如:銀行轉(zhuǎn)賬。
- 具有豐富的工具鏈生態(tài),覆蓋數(shù)據(jù)遷移、同步、備份等多種場景。
場景
- 對數(shù)據(jù)一致性及高可靠、系統(tǒng)高可用、可擴(kuò)展性、容災(zāi)要求較高的金融行業(yè)屬性的場景
眾所周知,金融行業(yè)對數(shù)據(jù)一致性及高可靠、系統(tǒng)高可用、可擴(kuò)展性、容災(zāi)要求較高。傳統(tǒng)的解決方案是同城兩個機(jī)房提供服務(wù)、異地一個機(jī)房提供數(shù)據(jù)容災(zāi)能力但不提供服務(wù),此解決方案存在以下缺點:資源利用率低、維護(hù)成本高、RTO (Recovery Time Objective) 及 RPO (Recovery Point Objective) 無法真實達(dá)到企業(yè)所期望的值。TiDB 采用多副本 + Multi-Raft 協(xié)議的方式將數(shù)據(jù)調(diào)度到不同的機(jī)房、機(jī)架、機(jī)器,當(dāng)部分機(jī)器出現(xiàn)故障時系統(tǒng)可自動進(jìn)行切換,確保系統(tǒng)的 RTO <= 30s 及 RPO = 0。
- 對存儲容量、可擴(kuò)展性、并發(fā)要求較高的海量數(shù)據(jù)及高并發(fā)的 OLTP 場景
隨著業(yè)務(wù)的高速發(fā)展,數(shù)據(jù)呈現(xiàn)爆炸性的增長,傳統(tǒng)的單機(jī)數(shù)據(jù)庫無法滿足因數(shù)據(jù)爆炸性的增長對數(shù)據(jù)庫的容量要求,可行方案是采用分庫分表的中間件產(chǎn)品或者 NewSQL 數(shù)據(jù)庫替代、采用高端的存儲設(shè)備等,其中性價比最大的是 NewSQL 數(shù)據(jù)庫,例如:TiDB。TiDB 采用計算、存儲分離的架構(gòu),可對計算、存儲分別進(jìn)行擴(kuò)容和縮容,計算最大支持 512 節(jié)點,每個節(jié)點最大支持 1000 并發(fā),集群容量最大支持 PB 級別。
- Real-time HTAP 場景
隨著 5G、物聯(lián)網(wǎng)、人工智能的高速發(fā)展,企業(yè)所生產(chǎn)的數(shù)據(jù)會越來越多,其規(guī)??赡苓_(dá)到數(shù)百 TB 甚至 PB 級別,傳統(tǒng)的解決方案是通過 OLTP 型數(shù)據(jù)庫處理在線聯(lián)機(jī)交易業(yè)務(wù),通過 ETL 工具將數(shù)據(jù)同步到 OLAP 型數(shù)據(jù)庫進(jìn)行數(shù)據(jù)分析,這種處理方案存在存儲成本高、實時性差等多方面的問題。TiDB 在 4.0 版本中引入列存儲引擎 TiFlash 結(jié)合行存儲引擎 TiKV 構(gòu)建真正的 HTAP 數(shù)據(jù)庫,在增加少量存儲成本的情況下,可以同一個系統(tǒng)中做聯(lián)機(jī)交易處理、實時數(shù)據(jù)分析,極大地節(jié)省企業(yè)的成本。
- 數(shù)據(jù)匯聚、二次加工處理的場景
當(dāng)前絕大部分企業(yè)的業(yè)務(wù)數(shù)據(jù)都分散在不同的系統(tǒng)中,沒有一個統(tǒng)一的匯總,隨著業(yè)務(wù)的發(fā)展,企業(yè)的決策層需要了解整個公司的業(yè)務(wù)狀況以便及時做出決策,故需要將分散在各個系統(tǒng)的數(shù)據(jù)匯聚在同一個系統(tǒng)并進(jìn)行二次加工處理生成 T+0 或 T+1 的報表。傳統(tǒng)常見的解決方案是采用 ETL + Hadoop 來完成,但 Hadoop 體系太復(fù)雜,運維、存儲成本太高無法滿足用戶的需求。與 Hadoop 相比,TiDB 就簡單得多,業(yè)務(wù)通過 ETL 工具或者 TiDB 的同步工具將數(shù)據(jù)同步到 TiDB,在 TiDB 中可通過 SQL 直接生成報表。
架構(gòu)
在內(nèi)核設(shè)計上,TiDB 分布式數(shù)據(jù)庫將整體架構(gòu)拆分成了多個模塊,各模塊之間互相通信,組成完整的 TiDB 系統(tǒng)。對應(yīng)的架構(gòu)圖如下:
- TiDB Server:SQL 層,對外暴露 MySQL 協(xié)議的連接 endpoint,負(fù)責(zé)接受客戶端的連接,執(zhí)行 SQL 解析和優(yōu)化,最終生成分布式執(zhí)行計劃。TiDB 層本身是無狀態(tài)的,實踐中可以啟動多個 TiDB 實例,通過負(fù)載均衡組件(如 LVS、HAProxy 或 F5)對外提供統(tǒng)一的接入地址,客戶端的連接可以均勻地分?jǐn)傇诙鄠€ TiDB 實例上以達(dá)到負(fù)載均衡的效果。TiDB Server 本身并不存儲數(shù)據(jù),只是解析 SQL,將實際的數(shù)據(jù)讀取請求轉(zhuǎn)發(fā)給底層的存儲節(jié)點 TiKV(或 TiFlash)。
- PD (Placement Driver) Server:整個 TiDB 集群的元信息管理模塊,負(fù)責(zé)存儲每個 TiKV 節(jié)點實時的數(shù)據(jù)分布情況和集群的整體拓?fù)浣Y(jié)構(gòu),提供 TiDB Dashboard 管控界面,并為分布式事務(wù)分配事務(wù) ID。PD 不僅存儲元信息,同時還會根據(jù) TiKV 節(jié)點實時上報的數(shù)據(jù)分布狀態(tài),下發(fā)數(shù)據(jù)調(diào)度命令給具體的 TiKV 節(jié)點,可以說是整個集群的“大腦”。此外,PD 本身也是由至少 3 個節(jié)點構(gòu)成,擁有高可用的能力。建議部署奇數(shù)個 PD 節(jié)點。
- TiKV Server:負(fù)責(zé)存儲數(shù)據(jù),從外部看 TiKV 是一個分布式的提供事務(wù)的 Key-Value 存儲引擎。存儲數(shù)據(jù)的基本單位是 Region,每個 Region 負(fù)責(zé)存儲一個 Key Range(從 StartKey 到 EndKey 的左閉右開區(qū)間)的數(shù)據(jù),每個 TiKV 節(jié)點會負(fù)責(zé)多個 Region。TiKV 的 API 在 KV 鍵值對層面提供對分布式事務(wù)的原生支持,默認(rèn)提供了 SI (Snapshot Isolation) 的隔離級別,這也是 TiDB 在 SQL 層面支持分布式事務(wù)的核心。TiDB 的 SQL 層做完 SQL 解析后,會將 SQL 的執(zhí)行計劃轉(zhuǎn)換為對 TiKV API 的實際調(diào)用。所以,數(shù)據(jù)都存儲在 TiKV 中。另外,TiKV 中的數(shù)據(jù)都會自動維護(hù)多副本(默認(rèn)為三副本),天然支持高可用和自動故障轉(zhuǎn)移。
- TiFlash:TiFlash 是一類特殊的存儲節(jié)點。和普通 TiKV 節(jié)點不一樣的是,在 TiFlash 內(nèi)部,數(shù)據(jù)是以列式的形式進(jìn)行存儲,主要的功能是為分析型的場景加速。
存儲
TiKV 沒有選擇直接向磁盤上寫數(shù)據(jù),而是把數(shù)據(jù)保存在 RocksDB 中,具體的數(shù)據(jù)落地由 RocksDB 負(fù)責(zé)。這個選擇的原因是開發(fā)一個單機(jī)存儲引擎工作量很大,特別是要做一個高性能的單機(jī)引擎,需要做各種細(xì)致的優(yōu)化,而 RocksDB 是由 Facebook 開源的一個非常優(yōu)秀的單機(jī) KV 存儲引擎,可以滿足 TiKV 對單機(jī)引擎的各種要求。這里可以簡單的認(rèn)為 RocksDB 是一個單機(jī)的持久化 Key-Value Map。
TiKV 利用 Raft 來做數(shù)據(jù)復(fù)制,每個數(shù)據(jù)變更都會落地為一條 Raft 日志,通過 Raft 的日志復(fù)制功能,將數(shù)據(jù)安全可靠地同步到復(fù)制組的每一個節(jié)點中。不過在實際寫入中,根據(jù) Raft 的協(xié)議,只需要同步復(fù)制到多數(shù)節(jié)點,即可安全地認(rèn)為數(shù)據(jù)寫入成功。
總結(jié)一下,通過單機(jī)的 RocksDB,TiKV 可以將數(shù)據(jù)快速地存儲在磁盤上;通過 Raft,將數(shù)據(jù)復(fù)制到多臺機(jī)器上,以防單機(jī)失效。數(shù)據(jù)的寫入是通過 Raft 這一層的接口寫入,而不是直接寫 RocksDB。通過實現(xiàn) Raft,TiKV 變成了一個分布式的 Key-Value 存儲,少數(shù)幾臺機(jī)器宕機(jī)也能通過原生的 Raft 協(xié)議自動把副本補全,可以做到對業(yè)務(wù)無感知。
事務(wù)
TiDB 支持分布式事務(wù),提供樂觀事務(wù)與悲觀事務(wù)兩種事務(wù)模式。TiDB 3.0.8 及以后版本,TiDB 默認(rèn)采用悲觀事務(wù)模式。TiDB 可以顯式地使用事務(wù)(通過 [BEGIN|START TRANSACTION]/COMMIT 語句定義事務(wù)的開始和結(jié)束)或者隱式地使用事務(wù) (SET autocommit = 1)。TiDB 支持語句執(zhí)行失敗后的原子性回滾。如果語句報錯,則所做的修改將不會生效。該事務(wù)將保持打開狀態(tài),并且在發(fā)出 COMMIT 或 ROLLBACK 語句之前可以進(jìn)行其他修改。由于底層存儲引擎的限制,TiDB 要求單行不超過 6 MB。可以將一行的所有列根據(jù)類型轉(zhuǎn)換為字節(jié)數(shù)并加和來估算單行大小。
TiDB 同時支持樂觀事務(wù)與悲觀事務(wù),其中樂觀事務(wù)是悲觀事務(wù)的基礎(chǔ)。由于樂觀事務(wù)是先將修改緩存在私有內(nèi)存中,因此,TiDB 對于單個事務(wù)的容量做了限制。
TiDB 中,單個事務(wù)的總大小默認(rèn)不超過 100 MB,這個默認(rèn)值可以通過配置文件中的配置項 txn-total-size-limit 進(jìn)行修改,最大支持 10 GB。單個事務(wù)的實際大小限制還取決于服務(wù)器剩余可用內(nèi)存的大小,執(zhí)行事務(wù)時 TiDB 進(jìn)程的內(nèi)存消耗相對于事務(wù)大小會存在一定程度的放大,最大可能達(dá)到提交事務(wù)大小的 6 倍以上。
在 4.0 以前的版本,TiDB 限制了單個事務(wù)的鍵值對的總數(shù)量不超過 30 萬條,從 4.0 版本起 TiDB 取消了這項限制。
兼容性
TiDB 高度兼容 MySQL 5.7 協(xié)議、MySQL 5.7 常用的功能及語法。MySQL 5.7 生態(tài)中的系統(tǒng)工具 (PHPMyAdmin、Navicat、MySQL Workbench、mysqldump、Mydumper/Myloader)、客戶端等均適用于 TiDB。但 TiDB 尚未支持一些 MySQL 功能,可能的原因如下:
- 有更好的解決方案,例如 JSON 取代 XML 函數(shù)。
- 目前對這些功能的需求度不高,例如存儲流程和函數(shù)。
- 一些功能在分布式系統(tǒng)上的實現(xiàn)難度較大。
除此以外,TiDB 不支持 MySQL 復(fù)制協(xié)議,但提供了專用工具用于與 MySQL 復(fù)制數(shù)據(jù)。
- 從 MySQL 復(fù)制:TiDB Data Migration (DM) 是將 MySQL/MariaDB 數(shù)據(jù)遷移到 TiDB 的工具,可用于增量數(shù)據(jù)的復(fù)制。
- 向 MySQL 復(fù)制:TiCDC 是一款通過拉取 TiKV 變更日志實現(xiàn)的 TiDB 增量數(shù)據(jù)同步工具,可通過 MySQL sink 將 TiDB 增量數(shù)據(jù)復(fù)制到 MySQL。