1. 程式人生 > 其它 >2. TiDB Server架構原理

2. TiDB Server架構原理

目錄

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 的主要功能

  1. 處理客戶端的連線——Protocol Layer(協議層)完成
  2. SQL 語句的解析和編譯——由Parse、Compile完成,生成執行計劃,交給Executor執行
  3. 關係型資料與KV的轉化
  4. SQL語句的執行——普通SQL:Executor、DistSQL、KV;事務:Transaction、KV
  5. 線上DDL的執行——schema load、worker、start job
  6. 垃圾回收——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讀寫相關模組

  1. 對於較複雜的SQL(e.g.,範圍查詢、表連線、巢狀查詢)
    • 為避免較複雜的SQL與TiKV存取的耦合度太高,通過DistSQL將對TiKV的請求封裝,提供一個單表的select方法。
    • DistSQL涉及單張表,但可能涉及多個Region。
  2. 簡單的SQL請求(點查如利用主鍵索引或唯一索引進行等值查詢等)通過KV模組完成。
  3. 涉及事務的SQL,由Transaction負責二階段提交。需要PD Client向PD獲取時間戳TSO。

TiKV Client 接收KV的row kv request、處理DistSQL的複雜sql的投影、過濾等。向TiKV叢集傳送讀寫請求。

2.6 線上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查詢的記憶體使用超過閾值後怎麼操作,停止執行還是記錄日誌)