原文地址:https://alphahinex.github.io/2022/11/06/tidb-v6-pcta/
description: "本課程專為將在工作中使用 TiDB 數(shù)據(jù)庫的開發(fā)人員、DBA 和架構(gòu)師設(shè)計。 本門課側(cè)重于 TiDB 數(shù)據(jù)庫的架構(gòu)和設(shè)計原則,這是未來管理、開發(fā)、性能調(diào)整和故障排除的基礎(chǔ)。在學(xué)習(xí)本課程前,您需要具備基本的計算機(jī)、操作系統(tǒng)、網(wǎng)絡(luò)和數(shù)據(jù)庫知識。"
date: 2022.11.06 10:34
categories:
- Database
tags: [Database, TiDB]
keywords: TiDB, PD, TiDB Server, TiKV, TiFlash, Raft, RocksDB, Region, HTAP, OLTP, OLAP, MVCC
在線學(xué)習(xí)地址:https://learn.pingcap.com/learner/course/960001
TiDB 數(shù)據(jù)庫架構(gòu)
Lesson 01 TiDB 數(shù)據(jù)庫架構(gòu)概述
-
TiDB 整體架構(gòu):TiDB Server、TiKV、TiFlash、PD
- TiFlash 是 TiKV 的列存版本,并參與復(fù)制,保持?jǐn)?shù)據(jù)一致
- PD(Placement Driver) 節(jié)點記錄數(shù)據(jù)在哪些 TiKV 或 TiFlash 節(jié)點上,以及全局時間戳(TSO),還會配合 TiDB Server 生成事務(wù)的唯一 ID
- 數(shù)據(jù)分區(qū)(Region)存儲(96~144mb),默認(rèn)三副本,一個 leader 負(fù)責(zé)讀寫,另兩個讀
- 96mb 后 Region 里就不會新插入數(shù)據(jù)了,但可能會修改已有的數(shù)據(jù),所以 region 大小是 96~144mb 一個區(qū)間
- 兼容 MySQL 5.7 協(xié)議
- TiKV = Transaction + MVCC + Raft + rocksdb raft + rocksdb kv
- 分布式事務(wù)是兩階段提交。兩階段提交的鎖信息被持久化到 TiKV 中。
- PD 會收集集群信息進(jìn)行調(diào)度,達(dá)到平衡數(shù)據(jù)的效果
- TiKV 承載 OLTP 業(yè)務(wù),TiFlash 承載 OLAP 業(yè)務(wù),達(dá)到業(yè)務(wù)隔離。TiDB Server 根據(jù) SQL 進(jìn)行預(yù)測,智能選擇使用 TiKV 還是 TiFlash 進(jìn)行查詢,也可以人工指定
- TiDB Server 是無狀態(tài)的,不存儲數(shù)據(jù)。支持?jǐn)U展,緩解連接壓力
- TiDB Server 會解析,編譯,優(yōu)化 SQL 語句,生成執(zhí)行計劃;同時會負(fù)責(zé)將關(guān)系型數(shù)據(jù)轉(zhuǎn)化為 KV 存儲進(jìn)行持久化,以及將 KV 存儲轉(zhuǎn)化為關(guān)系型數(shù)據(jù)返回給客戶端
- 對于歷史版本數(shù)據(jù)的垃圾回收,是由 TiDB Server 在 TiKV 上完成的
- 數(shù)據(jù)在TiKV中是以鍵值對(KEY-VALUE)形式存儲的
Lesson 02 TiDB Server
-
TiDB Server 架構(gòu)
- TiDB Server 主要功能:
- 處理客戶端的鏈接
- SQL 語句的解析和編譯
- 關(guān)系型數(shù)據(jù)與 KV 的轉(zhuǎn)化
- SQL 語句的執(zhí)行
- Online DDL 的執(zhí)行(DDL 操作不會阻塞讀寫,但對整個 TiDB 來說,同一時刻只能有一個 TiDB Server 進(jìn)行 DDL 操作)
- 垃圾回收
- 熱點小表緩存 V6.0
- 多個 TiDB Server 輪換選舉 Owner 節(jié)點,Owner 中的 worker 負(fù)責(zé)執(zhí)行 DDL
- DDL job 會存儲在 TiKV 中進(jìn)行持久化
- TiDB 是用 Go 開發(fā)的
- TiDB Server GC 默認(rèn) 10 分鐘觸發(fā)一次,刪除當(dāng)前時間上一個 safe point 之前的歷史版本數(shù)據(jù)
- 熱點小表緩存,限制表數(shù)據(jù)需在 64m 以下,可通過
ALTER TABLE users CACHE;將 users 表放入 TiDB Server 的cache table中。 - 熱點小表緩存如何保證讀寫一致的問題:
tidb_table_cache_lease=5參數(shù)控制緩存租約。5s 之內(nèi)用戶可以從緩存中讀取數(shù)據(jù);租約到期前,任何用戶不能修改此表,租約過期后,寫數(shù)據(jù)直接寫入 TiKV,讀也是從 TiKV 讀,完成寫操作之后,緩存重新續(xù)約,緩存內(nèi)容也會刷新。所以當(dāng)租約到期時,讀性能會下降。不支持對緩存表直接做 DDL 操作,需要先關(guān)閉。 - TiDB 中的表分為兩種:聚簇表、非聚簇表。聚簇表需要有主鍵,非聚簇表可以有主鍵,也可以沒有。KV 轉(zhuǎn)換時,聚簇表使用主鍵作為 key,非聚簇表不管是否定義了主鍵,都會生成一個 key。
-
Protocol Layer 通過 PD Client 異步向 PD 請求 TSO,同時繼續(xù)進(jìn)行 SQL 解析和編譯,在實際執(zhí)行前,獲取異步請求 TSO 的結(jié)果
Lesson 03 TiKV
TiKV-持久化
-
TiKV 架構(gòu)
- RocksDB 寫入數(shù)據(jù)時,先將數(shù)據(jù)寫入到磁盤上的 WAL 文件中(可通過設(shè)置
sync_log=true將數(shù)據(jù)直接寫入到磁盤,避免先寫入到操作系統(tǒng)的緩存再批量刷到磁盤中而產(chǎn)生的故障時數(shù)據(jù)丟失的問題),再將數(shù)據(jù)寫入內(nèi)存的MemTable中(避免因斷電等故障導(dǎo)致的內(nèi)存中數(shù)據(jù)丟失),MemTable中數(shù)據(jù)寫滿后,轉(zhuǎn)為immutable MemTable,有一個immutable MemTable就會觸發(fā)向磁盤的寫入。如果寫MemTable速度遠(yuǎn)大于immutable MemTable寫入磁盤的速度,會觸發(fā) RocksDB 的流控,導(dǎo)致客戶端寫入速度降低。
- RocksDB 數(shù)據(jù)落盤后是分層組織的。
Level 0是對immutable MemTable內(nèi)容的復(fù)刻(轉(zhuǎn)儲)。每層數(shù)據(jù)達(dá)到限額時,會進(jìn)行壓縮及按 key 排序,形成下一層的文件(Level 0 不需要排序)。
- RocksDB Column Families(CF),列簇,可以將鍵值對按不同的屬性分配給不同的 CF,實現(xiàn)分片。不同列簇各有一套
MemTable、SST文件等,但共享一份WAL文件。寫入數(shù)據(jù)時可指定列簇,不指定時會使用默認(rèn)的Default列簇。
TiKV-分布式事務(wù)
- TiKV 的分布式事務(wù)主要是通過 樂觀鎖/悲觀鎖 + 兩階段提交 實現(xiàn)的,并借助了三個列簇:
Default、Lock、Write - 當(dāng)用戶寫入了一行數(shù)據(jù)時,如果該行數(shù)據(jù)長度小于 255 字節(jié),那么會被存儲到
Write列簇中,否則會被存入到Default列簇中 - 修改多行數(shù)據(jù)時,只給第一行數(shù)據(jù)加主鎖,其他行的鎖會指向主鎖
- MVCC:多版本并發(fā)控制,該機(jī)制可保證不阻塞新事務(wù)讀取正在事務(wù)中的數(shù)據(jù)的之前已提交的版本
TiKV-Raft
- Raft共識:
- Raft Group 組內(nèi)成員選舉得到Leader 節(jié)點;
- Leader 節(jié)點負(fù)責(zé)所有的讀寫 IO
- Follower只同步變化日志
- Leader + Follower 多數(shù)節(jié)點寫入成功即成功
- 一個 Region 會連同其副本,共同組成一個 raft group,多個 region 就會有多個 raft group,即 Multi Raft
- TiKV包括兩個rocksdb:rocksdb raft存放 raft 日志,rocksdb kv存放數(shù)據(jù)。
- Region 的復(fù)制是通過 Raft 日志實現(xiàn)的:Raft Leader 先將數(shù)據(jù)寫入 Raft 日志,然后將日志分發(fā)給 follower,follower 收到日志后存入 rocksdb raft,當(dāng)多數(shù) follower 已完成 raft 日志的同步后,各節(jié)點再將數(shù)據(jù)根據(jù) raft 日志存入自己節(jié)點的 rocksdb kv 中
- 通過為每個節(jié)點的選舉超時時間增加自動的隨機(jī)值,可以較大程度避免多個節(jié)點同時發(fā)起選舉
- Raft 日志復(fù)制過程:
- Propose:寫 raft 日志
- Append:持久化到 rocksdb raft
- Replicate:將 raft 日志復(fù)制到其他的 TiKV
3.1. Append:Follower 收到 raft 日志后,在自己節(jié)點持久化到 rocksdb raft - Committed:給 Leader 回應(yīng),不是用戶的 committed
- Apply:持久化到 rocksdb kv 中,用戶提交成功
TiKV-讀寫與Coprocessor
- 數(shù)據(jù)的寫入:借助
raftsotre pool和apply pool兩個線程池
- 數(shù)據(jù)的讀取方式:
- ReadIndex Read:讀取時先得到已經(jīng) commit 的 raft 日志位置,等待該日志完成 apply 后,再進(jìn)行讀取
- Lease Read:也叫 Local Read。讀取需要保證在 Leader 節(jié)點讀取,通過心跳機(jī)制保證,從 Leader 節(jié)點發(fā)出心跳后至 election timeout 之前,都能保證沒有重新選舉 Leader 節(jié)點,進(jìn)而保證在 Leader 節(jié)點完成數(shù)據(jù)讀取
- Follower Read:與 ReadIndex Read 機(jī)制類似,但可能會出現(xiàn)從 Follower 讀到 Leader 中尚未 apply 的數(shù)據(jù)(如果 Follower 的 apply 比 Leader apply 快的話)
- Coprocessor:移動計算不移動數(shù)據(jù)
- TiFlash 節(jié)點也有 Coprocessor,也可以計算
Lesson 04 Placement Driver
- PD 集成了 etcd
- PD 主要功能:
- 整個集群 TiKV 的元數(shù)據(jù)存儲
- 分配全局 ID 和事務(wù) ID
- 生成全局時間戳 TSO
- 收集集群信息進(jìn)行調(diào)度
- 提供 label,支持高可用
- 提供 TiDB Dashboard
- Region Cache的主要作用是緩存region的元數(shù)據(jù),減少訪問PD的次數(shù)。
- TSO = physical time + logical time(順序不能顛倒),int64 類型
- TSO 的分配能保證增長性,但不能保證連續(xù)性
- 只能從 PD 的 Leader 節(jié)點獲得 TSO
- TiKV 會周期性的向 PD 上報狀態(tài)
- PD 的調(diào)度功能會平衡存儲(region)和讀寫(Leader)的分布
- Label 需要在 PD 和 TiKV 上進(jìn)行配置
Lesson 05 TiDB 數(shù)據(jù)庫 SQL 執(zhí)行流程
-
DML讀流程:
- 解析 SQL 時,會區(qū)分是否是點查(Point Get,比如通過索引獲得一條記錄),如果是點查,則直接通過 KV 模塊讀取數(shù)據(jù),否則會經(jīng)過后面的過程,到 DistSQL 模塊生成執(zhí)行計劃。KV / DistSQL 模塊之后都需要通過 Executor 模塊執(zhí)行,再通過 TiKV Client 發(fā)送給 TiKV。
-
DML寫入執(zhí)行:
- 將需要修改的數(shù)據(jù)讀入TiDB Server的緩存(memBuffer),同DML讀流程
- memBuffer 是每個用戶獨享的,類似 Oracle 中的 PGA
- TiDB Server涉及寫入的三個模塊:Transaction、KV、TiKV Client
- Transaction:兩階段提交:第一個階段是修改數(shù)據(jù)和加鎖,第二步驟是commit和釋放鎖
- TiKV涉及寫入的三個模塊:Scheduler、Raftstore、Apply
- Scheduler:接收并發(fā)請求;寫入同一個key值的數(shù)據(jù)存在寫入沖突時,通過latch保證寫完一個再寫另一個。
- Raftstore:持久化raft log、向其他節(jié)點同步raft log
- Apply:從rocksdb raft讀取raft log,并寫入rocksdb kv
-
DDL語句的執(zhí)行:主要在TiDB Server
- Portocol Layer:接收DDL語句
- Pares:解析
- Compile:編譯DDL語句
- Start job:判斷自己所在的server是否owner,如果不是,將DDL持久化到TiKV的job queue中
- workers執(zhí)行DDL。
- 每一個節(jié)點都有workers,但不可以同時執(zhí)行。
- 同一時刻,只有當(dāng)TiDB Server 為owner角色時,他的workers才能執(zhí)行DDL語句。
- 角色為owner的TiDB Server,到j(luò)ob queue中獲取DDL后執(zhí)行。
- owner是由PD節(jié)點控制,輪詢選出來。
- Schema load:將最新的表的元信息載入到TiDB Server。
- 其他DDL都放在job queue,加索引的DDL有單獨的隊列,放在add index queue。
- Job queue 和 add index queue 中的語句可以并行執(zhí)行
TiDB HTAP
Lesson 06 TiDB 數(shù)據(jù)庫 HTAP 概述
- HTAP:混合事務(wù) / 分析處理,具體要求:
- 可擴(kuò)展性:分布式事務(wù)、分布式存儲
- 同時支持OLTP與OLAP:同時支持行存和列存,實現(xiàn)OLTP與OLAP業(yè)務(wù)隔離
- 實時性:行存與列存數(shù)據(jù)實時同步
- 整體特性
- 列存支持基于主鍵的實時更新
- 具備智能選擇:TiDB server根據(jù)sql特性自動選擇到TiKV還是到TiFlash
- MPP(Massively Parallel Processing)架構(gòu)
- 大量數(shù)據(jù)的join聚合查詢:根據(jù)sql中關(guān)聯(lián)的表先做交換,將相關(guān)的表交換到一個TiFlash節(jié)點上進(jìn)行計算
- 所有MPP的計算都在TiFlash節(jié)點內(nèi)存中完成
- 只支持等值連接
- Enforce_mpp,幫助驗證是否可以使用MPP
- TiDB MPP 過程:過濾(并行) => 數(shù)據(jù)交換(目的是只在本節(jié)點進(jìn)行表連接) => 表連接(并行) => 數(shù)據(jù)交換(只在本節(jié)點進(jìn)行聚合) => 聚合
- 核心技術(shù)
- 利用各個TiFlash節(jié)點過濾數(shù)據(jù)
- 利用各個TiFlash節(jié)點交換數(shù)據(jù):保證表連接發(fā)生在各個TiFlash上、聚合發(fā)生在各個TiFlash上
- 充分發(fā)揮每一個TiFlash并行計算作用,減少TiDB Server的壓力
- 典型應(yīng)用場景
- 混合負(fù)載場景:在線業(yè)務(wù)、報表應(yīng)用
- 流式計算:在線應(yīng)用,對在線數(shù)據(jù)庫產(chǎn)生的數(shù)據(jù)進(jìn)行實時分析。傳統(tǒng)方案的問題:(1)后端需要維護(hù)多個不同類型的數(shù)據(jù)庫;(2)實時性難以滿足要求。
Lesson 07 TiFlash
- TiFlash保存TiKV上數(shù)據(jù)的列存版本,region完全對應(yīng)、分區(qū)一致。region也會隨著TiKV上的region分裂與合并
- TiFlash兼容TiDB Server和TiSpark
- TiFlash使用Raft Learner與TiKV進(jìn)行數(shù)據(jù)復(fù)制
- TiFlash承載OLAP業(yè)務(wù),承載能力不高,qps <50
- 主要功能:
- 異步復(fù)制:learner不參與Raft投票和選舉,只需要獲取日志,對線上業(yè)務(wù)影響??;基于主鍵快速更新
- 一致性讀取:存儲多個時間戳的版本,根據(jù)讀取時間,篩選多個版本中符合的記錄
- 引擎智能選擇:自動選擇使用TiKV或TiFlash,或混合使用。可以是一個 SQL 的不同表,CBO 基于成本選擇在 TiFlash 或者 TiKV 上執(zhí)行 SQL,之后將結(jié)果匯總到 TiDB Server 進(jìn)行連接。
- 計算加速:列存、計算下推
TiDB 6.0 新功能
Lesson 08 TiDB 6.0 新特性
-
1、Placement Rules in SQL:實現(xiàn)分布式數(shù)據(jù)庫中精細(xì)化指定數(shù)據(jù)放置位置
- 使用步驟
- 設(shè)計業(yè)務(wù)拓?fù)洌瑸椴煌腡iKV實例設(shè)置標(biāo)簽
server.labels:{zone:"BeiJing", rack:"Rack-1", host: "TiKV-1"}- 創(chuàng)建PLACEMENT POLICY:設(shè)置leader、follower角色的region位置,以及副本數(shù)量。
CREATE PLACEMENT POLICY P1 PRIMARY_REGION="TiKV-5" REGIONS="BeiJing, Tokyo, ShangHai, London" FOLLOWERS=4;- 設(shè)定數(shù)據(jù)對象的PLACEMENT POLICY:創(chuàng)建表、schema、分區(qū)等對象并指定遵守的PLACEMENT POLICY。
CREATE TABLE T5 (id INT) PLACEMENT POLICY=P1; - 應(yīng)用
- 精細(xì)化數(shù)據(jù)放置,控制本地訪問與跨區(qū)域訪問
- 指定副本數(shù),提高重要業(yè)務(wù)的可用性和數(shù)據(jù)可靠性(調(diào)整單表副本數(shù)量)
- 將業(yè)務(wù)按照等級、資源需求或數(shù)據(jù)生命周期進(jìn)行隔離
- 業(yè)務(wù)數(shù)據(jù)整合,降低運維成本與復(fù)雜度:將業(yè)務(wù)隔離開
- 使用步驟
-
2、小表緩存:解決分布式數(shù)據(jù)庫的熱點問題
- 數(shù)據(jù)量不大,只讀或修改不頻繁,但訪問很頻繁的表
- 緩存在TiDB Server 的內(nèi)存(cache table)中
- 命令:
ALTER TABLE users CACHE; -
tidb_table_cache_lease,用于設(shè)置緩存租約,默認(rèn)為5s,租約內(nèi)只能讀不能寫。租約到期,內(nèi)存中的版本過期,此時可以在TiKV中直接寫。 - 不管租約內(nèi)還是租約外,都不會阻塞讀
- 應(yīng)用
- 緩存表的大小限制64M
- 適用于查詢頻繁、數(shù)據(jù)量不大、極少修改的場景
- 租約時間內(nèi),寫操作會被阻塞
- 租約到期時,讀性能會下降
- 緩存表不支持DDL,需要先關(guān)閉緩存表
- 對于表加載較慢或極少修改的表,可以適當(dāng)延長租約設(shè)置,保持讀性能穩(wěn)定
-
3、內(nèi)存悲觀鎖:在悲觀鎖的基礎(chǔ)上,提升了事務(wù)的執(zhí)行效率
- 概念
- 在commit的時候,才做prewrite,加鎖,在此之前其他事務(wù)不知道這個數(shù)據(jù)上有鎖,這是樂觀鎖。
- 悲觀鎖在事務(wù) commit 之前就可以讓其他事務(wù)感知到對這條數(shù)據(jù)的修改(先將所信息寫入 TiKV 的存儲)。
- 將悲觀鎖只寫到TiKV的緩存(內(nèi)存)中,就叫內(nèi)存悲觀鎖。寫入Leader 角色region所在的節(jié)點的緩存,不進(jìn)行 Follower 的同步。寫入內(nèi)存不寫入磁盤,數(shù)據(jù)只寫入 Leader 節(jié)點,不進(jìn)行 Follower 的同步,所以能夠提升事務(wù)的執(zhí)行效率。
- 內(nèi)存悲觀鎖存在的問題:如果節(jié)點宕機(jī),鎖丟失,會造成事務(wù)失敗
- 可以用命令在線開啟內(nèi)存悲觀鎖,也可以通過配置設(shè)置后重新啟動
> set config tikv pessimistic-txn.pipelined='true'; > set config tikv pessimistic-txn.in-memory='true';- 優(yōu)點:減少事務(wù)的延時;降低磁盤和網(wǎng)絡(luò)帶寬;降低TiKV的CPU消耗。
- 概念
-
4、Top SQL:針對性能可觀測性的亮眼功能
- 6.0之前只能通過slow query和SQL Statements,但這兩個命令針對的是整個集群,不能通過指定單個TiKV。
- 解決的問題:
- 個別TiKV實例的CPU非常高
- CPU占用率突然發(fā)生了顯著變化
- TOP SQL可以
- 指定TiDB及TiKV實例
- 正在執(zhí)行的SQL語句
- CPU開銷最多的Top 5類SQL
- 每秒請求數(shù)、平均延遲等信息
- TOP SQL的使用
- TiDB Dashboard集成了Top SQL
- 步驟1:選擇需要觀察負(fù)載的具體TiDB Server或TiKV實例,可以指定刷新時間
- 步驟2:觀察Top 5類SQL,目前根據(jù)CPU的使用率統(tǒng)計,不支持內(nèi)存和IO
- 步驟3:查看某語句的執(zhí)行情況:Call/sec、Scan Indexes/sec
- 作用
- 可視化地展示CPU開銷最多的5類SQL語句
- 支持指定TiDB及TiKV實例進(jìn)行查詢
- 支持統(tǒng)計所有正在執(zhí)行的SQL語句
- 支持每秒請求數(shù)、平均延遲、查詢計劃等詳細(xì)執(zhí)行信息
-
5、TiDB Enterprise Manager(TiEM):集成、規(guī)范化、流程化大部分運維操作
- 解決企業(yè)中TiDB集群管理的問題
- 數(shù)量增長:集群數(shù)量、節(jié)點數(shù)量、組件數(shù)量、工具數(shù)量
- 復(fù)雜度增長:配置參數(shù)復(fù)雜度、命令行復(fù)雜度、管理接口復(fù)雜
- 簡化、流程化集群管理中的任務(wù),降低出錯的幾率
- 部署集群、升級集群、參數(shù)管理、組件管理、備份恢復(fù)與高可用管理、集群監(jiān)控與告警、集群日志收集、審計與安全
- TiEM功能
- 一鍵部署集群&多套集群一站式管理
- 集群原地升級
- 參數(shù)管理
- 克隆集群&主備集群切換
- 解決企業(yè)中TiDB集群管理的問題
TiDB Cloud
Lesson 09 TiDB Cloud 簡介

- TiDB Cloud 是一個功能齊全的數(shù)據(jù)庫即服務(wù)或 DBaaS
- https://en.pingcap.com/tidb-cloud
- https://tidbcloud.com
- 分成 Developer Tier 和 Dedicated Tier 兩種方案,Developer Tier 一年免費,不支持 VPC Peer,不支持橫向擴(kuò)縮容,不具備高可用性




