1 TiDB Server 的架構
TiDB Server是無狀態的,可在一個TiDB數據庫中啟動多個TiDB Server,可通過負載均衡軟件如LVS、HAProxy、F5等提供統一的接入地址,客戶端可將連接均勻分攤到多個TiDB Server上。
TiDB Server 不存儲數據。

- Protocol Layer、Parse、Compile:SQL的解析和編譯,生成SQL語句的執行計划,交給Executor
- Executor、DistSQL、KV:分批執行SQL的執行計划
- Transaction、KV:事務的執行
- PD Client、TiKV Client:與PD、TiKV交互
- schema load、worker、start job:online DDL(DDL語句不阻塞讀寫)
- memBuffer:緩存讀取的數據及元數據、登錄的認證信息、統計信息等
- GC:垃圾回收
2 TiDB Server 的主要功能
- 處理客戶端的連接——Protocol Layer(協議層)完成
- SQL 語句的解析和編譯——由Parse、Compile完成,生成執行計划,交給Executor執行
- 關系型數據與KV的轉化
- SQL語句的執行——普通SQL:Executor、DistSQL、KV;事務:Transaction、KV
- 在線DDL的執行——schema load、worker、start job
- 垃圾回收——GC
3 SQL 語句的解析和編譯 - Parse
Parse模塊:通過詞法分析(lex)、語法分析(yacc) 生成 AST抽象語法樹
給Compile模塊

4 SQL 語句的解析和編譯 - Compile
Compile模塊:根據AST抽象語法樹,生成可執行計划。
-
驗證:語法驗證,如要查詢的表在數據庫中是否存在等合法性驗證。
-
邏輯優化:依據關系型代數的一些等價交換的規則,做邏輯變化。(在SQL語句層面上的優化)
-
物理優化:根據邏輯優化的結果,考慮數據的物理分布、大小,決定用哪個算子。(走索引還是全表掃描?等)

5 關系型數據與KV的轉化
將關系型數據(表)轉化為鍵值對(key-value):
- 聚簇表(使用表名+表的主鍵)
- 非聚簇表(不用表的主鍵,自己生成rowId)
Region是key-value的一個存儲單位,一個Region達到96MB后會分裂為兩個,就能分布式的存儲在不同TiKV結點。
6 SQL讀寫相關模塊
- 對於較復雜的SQL(e.g.,范圍查詢、表連接、嵌套查詢)
- 為避免較復雜的SQL與TiKV存取的耦合度太高,通過DistSQL將對TiKV的請求封裝,提供一個單表的select方法。
- DistSQL涉及單張表,但可能涉及多個Region。
- 簡單的SQL請求(點查如利用主鍵索引或唯一索引進行等值查詢等)通過KV模塊完成。
- 涉及事務的SQL,由Transaction負責二階段提交。需要PD Client向PD獲取時間戳TSO。
TiKV Client 接收KV的row kv request、處理DistSQL的復雜sql的投影、過濾等。向TiKV集群發送讀寫請求。

7 在線DDL相關模塊

-
Start job接收用戶的DDL,並將此DDL作為一個job放在TiKV中的任務隊列中。
-
多個TiDB Server中只有Owner的workers能取任務隊列中的一個job執行,執行完成后放在歷史隊列中。
-
schema load將最新的所有表的schema信息同步到Owner緩存中。
多個TiDB Server可同時接收多個用戶的在線DDL,但同一時刻只能有一個TiDB Server進行DDL操作。
TiDB Server中的Owner有任期,由選舉產生。
why要將DDL放到TiKV?為了防止宕機后DDL丟失
8 GC機制與相關模塊
TiDB Server回收事務,因為它實現了MVCC(多版本並發控制),所以是異地更新的。
被選為GC Leader的TiDB Server控制GC:
計算時間戳safe_point,GC保留 GC_life_time(當前時間到safe_point)內的數據。

9 TiDB Server的緩存
默認使用整個TiDB數據庫的全部內存。
TiDB Server 緩存的組成部分:SQL的中間結果,線程緩存,元數據、統計信息
TiDB Server 緩存管理:tidb_mem_quota_query(控制查詢默認使用的緩存閾值),oom-action(當SQL查詢的內存使用超過閾值后怎么操作,停止執行還是記錄日志)