TIDB的基本使用
1、TIDB基本介紹
TiDB 是 PingCAP 公司自主設計、研發的開源分布式關系型數據庫,是一款同時支持在線事務處理與在線分析處理 (Hybrid Transactional and Analytical Processing, HTAP) 的融合型分布式數據庫產品,具備水平擴容或者縮容、金融級高可用、實時 HTAP、云原生的分布式數據庫、兼容 MySQL 5.7 協議和 MySQL 生態等重要特性。目標是為用戶提供一站式 OLTP (Online Transactional Processing)、OLAP (Online Analytical Processing)、HTAP 解決方案。
TiDB 適合高可用、強一致要求較高、數據規模較大等各種應用場景。
- OLTP(Online Transactional Processing):強調支持短時間內大量并發的事務操作(增刪改查)能力,每個操作涉及的數據量都很小(比如幾十到幾百字節)。強調事務的強一致性。
- OLAP(Online Analytical Processing):偏向于復雜的只讀查詢,讀取海量數據進行分析計算,查詢時間往往較長。
2、TIDB整體架構
與傳統的單機數據庫相比,TiDB 具有以下優勢:
- 純分布式架構,擁有良好的擴展性,支持彈性的擴縮容
- 支持 SQL,對外暴露 MySQL 的網絡協議,并兼容大多數 MySQL 的語法,在大多數場景下可以直接替換 MySQL
- 默認支持高可用,在少數副本失效的情況下,數據庫本身能夠自動進行數據修復和故障轉移,對業務透明
- 支持 ACID 事務,對于一些有強一致需求的場景友好,例如:銀行轉賬
- 具有豐富的工具鏈生態,覆蓋數據遷移、同步、備份等多種場景
在內核設計上,TiDB 分布式數據庫將整體架構拆分成了多個模塊,各模塊之間互相通信,組成完整的 TiDB 系統。
客戶端連接 TIDB 過程架構圖如下:

- Application via mysql protocol:協議,客戶端使用 mysql 協議發出 SQL 請求。
-
TiDB Server(TIDB cluster):SQL 層,對外暴露 MySQL 協議的連接 endpoint,負責接受客戶端的連接,執行 SQL 解析和優化,最終生成分布式執行計劃。TiDB 層本身是無狀態的,實踐中可以啟動多個 TiDB 實例,通過負載均衡組件(如 LVS、HAProxy 或 F5)對外提供統一的接入地址,客戶端的連接可以均勻地分攤在多個 TiDB 實例上以達到負載均衡的效果。TiDB Server 本身并不存儲數據,只是解析 SQL,將實際的數據讀取請求轉發給底層的存儲節點 TiKV(或 TiFlash)。
-
PD (Placement Driver) Server:整個 TiDB 集群的元信息管理模塊,負責存儲每個 TiKV 節點實時的數據分布情況和集群的整體拓撲結構,提供 TiDB Dashboard 管控界面,并為分布式事務分配事務 ID。PD 不僅存儲元信息,同時還會根據 TiKV 節點實時上報的數據分布狀態,下發數據調度命令給具體的 TiKV 節點,可以說是整個集群的“大腦”。此外,PD 本身也是由至少 3 個節點構成,擁有高可用的能力。建議部署奇數個 PD 節點。(即每條SQL具體在哪個存儲節點執行是由 PD 決定的)
-
存儲節點
- TiKV Server:負責存儲數據,從外部看 TiKV 是一個分布式的提供事務的 Key-Value 存儲引擎。存儲數據的基本單位是 Region,每個 Region 負責存儲一個 Key Range(從 StartKey 到 EndKey 的左閉右開區間)的數據,每個 TiKV 節點會負責多個 Region。TiKV 的 API 在 KV 鍵值對層面提供對分布式事務的原生支持,默認提供了 SI (Snapshot Isolation) 的隔離級別,這也是 TiDB 在 SQL 層面支持分布式事務的核心。TiDB 的 SQL 層做完 SQL 解析后,會將 SQL 的執行計劃轉換為對 TiKV API 的實際調用。所以,數據都存儲在 TiKV 中。另外,TiKV 每個節點中的數據都會自動維護多副本(即在不同的region里。默認為三副本,主副本加起來三份,即實際每份數據都會存三份),天然支持高可用和自動故障轉移。
- TiFlash:TiFlash 是一類特殊的存儲節點。和普通 TiKV 節點不一樣的是,在 TiFlash 內部,數據是以列式的形式進行存儲,主要的功能是為分析型的場景加速。
Region 是Tikv存儲數據的基本單位(也是節點間同步數據的最小單位,Region實際上是一個邏輯上的單位),每個Region承載一段特定的數據,并分布在TiKV集群的不同節點上。Region的ID、范圍、所在的節點信息等元信息會存儲在PD中,TiKV Client通過查詢PD獲取Region的元信息,從而確定數據所在的節點。
2.1、TIDB行記錄映射到KV
每行數據按照一定規則進行編碼成 key-value 形式,key 格式:t + tableId + _ + r + rowID
Key: tablePrefix{tableID}_recordPrefixSep{rowID}
Value: [col1,col2,col3,col4]
示例如下:

3、TIDB的五大核心特性
TiDB 具備如下眾多特性,其中兩大核心特性為:水平擴展與高可用
-
一鍵水平擴容或者縮容
得益于 TiDB 存儲計算分離的架構的設計,可按需對計算、存儲分別進行在線擴容或者縮容,擴容或者縮容過程中對應用運維人員透明。通過簡單地增加新節點即可實現 TiDB 的水平擴展,按需擴展吞吐或存儲,輕松應對高并發、海量數據場景。
-
金融級高可用
數據采用多副本存儲,數據副本通過 Multi-Raft 協議同步事務日志,多數派寫入成功事務才能提交,確保數據強一致性且少數副本發生故障時不影響數據的可用性。可按需配置副本地理位置、副本數量等策略滿足不同容災級別的要求。相比于傳統主從 (M-S) 復制方案,基于 Raft 的多數派選舉協議可以提供金融級的 100% 數據強一致性保證,且在不丟失大多數副本的前提下,可以實現故障的自動恢復 (auto-failover),無需人工介入。
-
實時 HTAP
提供行存儲引擎 TiKV、列存儲引擎 TiFlash 兩款存儲引擎,TiFlash 通過 Multi-Raft Learner 協議實時從 TiKV 復制數據,確保行存儲引擎 TiKV 和列存儲引擎 TiFlash 之間的數據強一致。TiKV、TiFlash 可按需部署在不同的機器,解決 HTAP 資源隔離的問題。
-
云原生的分布式數據庫
TiDB 是為云而設計的數據庫,支持公有云、私有云和混合云,配合 TiDB Operator 項目 可實現自動化運維,使部署、配置和維護變得十分簡單。
-
兼容 MySQL 5.7 協議和 MySQL ?態大多數情況下,無需修改代碼即可從 MySQL 輕松遷移至 TiDB,分庫分表后的 MySQL 集群亦可通過 TiDB 工具進行實時遷移。 對于用戶使用的時候,可以透明地從MySQL切換到TiDB 中,只是“新MySQL”的后端是存儲“無限的”,不再受制于Local的磁盤容量。在運維使用時也可以將TiDB當做一個從庫掛到MySQL主從架構中。
6、TIDB安裝
6.1、部署本地測試集群(playground安裝,不推薦使用)
軟硬件配置要求可參考:https://docs.pingcap.com/zh/tidb/v6.5/hardware-and-software-requirements
下面我們只是使用 playground 安裝單機版的一個測試集群用于驗證基本功能。(實際上不太建議使用該方式部署,跟實際生產情況差別挺大)
TIDB 目前未支持直接安裝在 window 系統上,我們可以安裝在虛擬機上。TIDB 安裝需要內存比較高,下面我們以 4G 的 CentOS7 操作系統為例。

安裝 tidb 可參考官方文檔:https://docs.pingcap.com/zh/tidb/stable/quick-start-with-tidb
示例如下:

出現下圖則安裝完成:

重新開啟一個會話訪問 TiDB 數據庫,直接輸入 tiup client 即可訪問數據庫,也可使用 MySQL 客戶端連接 TiDB(前提是Linux上已經安裝了mysql,否則可能會報找不到mysql命令):mysql --host 127.0.0.1 --port 4000 -u root

6.1.1、外部無法連接tidb數據庫解決方法(如dbeaver無法連接)
TiUP Playground 默認監聽 127.0.0.1,服務僅本地可訪問,即只有在安裝了 tidb 的服務器上才能訪問(假設安裝在虛擬機上則只有虛擬機上才能訪問)。若需要使服務可被外部訪問,可使用 --host 參數指定綁定外部可訪問的 IP(這樣安裝在虛擬機上時外部也能訪問到該 tidb 服務)
例如可使用命令:
// host 后面為虛擬機 IP tiup playground v6.5.4 --db 2 --pd 3 --kv 3 --host 192.168.118.159
可參考:https://asktug.com/t/topic/1003354/2
6.1.2、tiup playground停止后如何保留數據
Playground 集群在命令行退出時,會默認清空所有的集群數據。如果想要啟動一個數據不被自動刪除的 Playground 集群,需要在啟動時指定集群 tag,指定后可以在 ~/.tiup/data 路徑下找到該集群的數據。
在集群啟動時指定 tag 的方法如下:
// tag 后面為指定存儲數據的目錄,且為相對路徑,該目錄存儲在 ~/.tiup/data 目錄下 tiup playground v6.5.4 --db 2 --pd 3 --kv 3 --host 192.168.118.159 --tag tidbfile
此時在關閉 tiup playground 會話后,該集群數據會被保留,再次啟動時只需指定相同的 tag 目錄即可。
參考:https://asktug.com/t/topic/1020688
6.2、部署單機集群(推薦)
下面我們用一臺虛擬機部署集群,模擬生產環境下的部署步驟。
操作步驟跟官網基本差不多,具體可參考:https://docs.pingcap.com/zh/tidb/v6.5/quick-start-with-tidb#在單機上模擬部署生產環境集群
第1-3步:

修改修改 /etc/ssh/sshd_config:


重啟 sshd 服務,查看當前支持部署的 TiDB 版本,這里我選擇了部署 v6.5.4 版本。

編輯配置文件,命名為 topo.yaml,配置文件實際只需修改對應部署的服務器的 ip即可,實際內容如下:
# # Global variables are applied to all deployments and used as the default value of
# # the deployments if a specific deployment value is missing.
global:
user: "tidb"
ssh_port: 22
deploy_dir: "/tidb-deploy"
data_dir: "/tidb-data"
# # Monitored variables are applied to all the machines.
monitored:
node_exporter_port: 9100
blackbox_exporter_port: 9115
server_configs:
tidb:
instance.tidb_slow_log_threshold: 300
tikv:
readpool.storage.use-unified-pool: false
readpool.coprocessor.use-unified-pool: true
pd:
replication.enable-placement-rules: true
replication.location-labels: ["host"]
tiflash:
logger.level: "info"
pd_servers:
- host: 192.168.118.160
tidb_servers:
- host: 192.168.118.160
tikv_servers:
- host: 192.168.118.160
port: 20160
status_port: 20180
config:
server.labels: { host: "logic-host-1" }
- host: 192.168.118.160
port: 20161
status_port: 20181
config:
server.labels: { host: "logic-host-2" }
- host: 192.168.118.160
port: 20162
status_port: 20182
config:
server.labels: { host: "logic-host-3" }
tiflash_servers:
- host: 192.168.118.160
monitoring_servers:
- host: 192.168.118.160
grafana_servers:
- host: 192.168.118.160
- 執行集群部署命令:tiup cluster deploy wentidb v6.5.4 ./topo.yaml --user root -p

- 啟動集群,執行以下命令后,稍等段時間可能會自動彈出密碼被自動修改的提示,請記住密碼。
(使用 --init 后綴時是以安全方式啟動集群。推薦在集群第一次啟動時使用該命令,該命令會在啟動時自動生成 TiDB root 用戶的密碼,并在命令行界面返回密碼。使用安全啟動方式后,不能通過無密碼的 root 用戶登錄數據庫,你需要記錄命令行返回的密碼進行后續操作。)


此時即已完成部署,可通過 mysql 或者 外部也可通過 dbeaver 等工具連接 tidb 數據庫,如果連接不上,則可能是防火墻未關閉,可關閉防火墻再試試。

這種部署方式跟 playground 部署不同,重啟集群并不會清空數據,而且只需重啟虛擬機則 TIDB 也會自動啟動。

浙公網安備 33010602011771號