TiDB 數(shù)據(jù)庫核心原理與架構(gòu) [TiDB v6](101)筆記

原文地址: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 主要功能:
  1. 處理客戶端的鏈接
  2. SQL 語句的解析和編譯
  3. 關(guān)系型數(shù)據(jù)與 KV 的轉(zhuǎn)化
  4. SQL 語句的執(zhí)行
  5. Online DDL 的執(zhí)行(DDL 操作不會阻塞讀寫,但對整個 TiDB 來說,同一時刻只能有一個 TiDB Server 進(jìn)行 DDL 操作)
  6. 垃圾回收
  7. 熱點小表緩存 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、LockWrite
  • 當(dāng)用戶寫入了一行數(shù)據(jù)時,如果該行數(shù)據(jù)長度小于 255 字節(jié),那么會被存儲到 Write 列簇中,否則會被存入到 Default 列簇中
  • 修改多行數(shù)據(jù)時,只給第一行數(shù)據(jù)加主鎖,其他行的鎖會指向主鎖
  • MVCC:多版本并發(fā)控制,該機(jī)制可保證不阻塞新事務(wù)讀取正在事務(wù)中的數(shù)據(jù)的之前已提交的版本

TiKV-Raft

  • Raft共識:
  1. Raft Group 組內(nèi)成員選舉得到Leader 節(jié)點;
  2. Leader 節(jié)點負(fù)責(zé)所有的讀寫 IO
  3. Follower只同步變化日志
  4. 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ù)制過程:
  1. Propose:寫 raft 日志
  2. Append:持久化到 rocksdb raft
  3. Replicate:將 raft 日志復(fù)制到其他的 TiKV
    3.1. Append:Follower 收到 raft 日志后,在自己節(jié)點持久化到 rocksdb raft
  4. Committed:給 Leader 回應(yīng),不是用戶的 committed
  5. Apply:持久化到 rocksdb kv 中,用戶提交成功

TiKV-讀寫與Coprocessor

  • 數(shù)據(jù)的寫入:借助 raftsotre poolapply pool 兩個線程池
  • 數(shù)據(jù)的讀取方式:
  1. ReadIndex Read:讀取時先得到已經(jīng) commit 的 raft 日志位置,等待該日志完成 apply 后,再進(jìn)行讀取
  2. Lease Read:也叫 Local Read。讀取需要保證在 Leader 節(jié)點讀取,通過心跳機(jī)制保證,從 Leader 節(jié)點發(fā)出心跳后至 election timeout 之前,都能保證沒有重新選舉 Leader 節(jié)點,進(jìn)而保證在 Leader 節(jié)點完成數(shù)據(jù)讀取
  3. 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 主要功能:
  1. 整個集群 TiKV 的元數(shù)據(jù)存儲
  2. 分配全局 ID 和事務(wù) ID
  3. 生成全局時間戳 TSO
  4. 收集集群信息進(jìn)行調(diào)度
  5. 提供 label,支持高可用
  6. 提供 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ù)放置位置
    • 使用步驟
      1. 設(shè)計業(yè)務(wù)拓?fù)洌瑸椴煌腡iKV實例設(shè)置標(biāo)簽
      server.labels:{zone:"BeiJing", rack:"Rack-1", host: "TiKV-1"}
      
      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;
      
      1. 設(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ù)管理
      • 克隆集群&主備集群切換

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ò)縮容,不具備高可用性
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容