動態

詳情 返回 返回

【趙渝強老師】TiDB的底層存儲機制 - 動態 詳情

在內核設計上,TiDB分佈式數據庫將整體架構拆分成了多個模塊,各模塊之間互相通信,組成完整的TiDB系統。對應的架構圖如下:
image.png

與傳統的單機數據庫相比,TiDB具有以下優勢:

  • 純分佈式架構,擁有良好的擴展性,支持彈性的擴縮容
  • 支持SQL,對外暴露MySQL的網絡協議,併兼容大多數MySQL的語法,在大多數場景下可以直接替換MySQL
  • 默認支持高可用,在少數副本失效的情況下,數據庫本身能夠自動進行數據修復和故障轉移,對業務透明
  • 支持ACID事務,對於一些有強一致需求的場景友好,例如:銀行轉賬
  • 具有豐富的工具鏈生態,覆蓋數據遷移、同步、備份等多種場景

視頻講解如下:
https://www.bilibili.com/video/BV1T6nRzTEQw/?aid=115280596508...

一、 TiDB與RocksDB

TiDB最終將數據寫入底層的RocksDB中。RocksDB是由Facebook基於LevelDB開發的一款提供鍵值存儲與讀寫功能的LSM-tree架構引擎。用户寫入的鍵值對會先寫入磁盤上的WAL(Write Ahead Log),然後再寫入內存中的跳錶(Skip List,這部分結構又被稱作MemTable)。LSM-tree引擎由於將用户的隨機修改(插入)轉化為了對WAL文件的順序寫,因此具有比B樹類存儲引擎更高的寫吞吐。內存中的數據達到一定閾值後,會刷到磁盤上生成SST文件(Sorted String Table),SST又分為多層(默認至多6層),每一層的數據達到一定閾值後會挑選一部分SST合併到下一層,每一層的數據是上一層的10倍(因此90%的數據存儲在最後一層)。
image.png

每個TiKV實例中有兩個RocksDB實例,一個用於存儲Raft日誌(通常被稱為raftdb),另一個用於存儲用户數據以及MVCC信息(通常被稱為kvdb)。kvdb中有四個Column Family:raft、lock、default和write,具體説明如下表所示。
image.png

二、 使用二進制包離線部署TiDB數據庫集羣

在一些企業的生產環境中無法訪問外部的網絡,此時如果部署TiDB數據庫集羣就需要使用二進制包方式進行部署。在TiDB的官方網站上提供不同版本的二進制包,如下圖所示。
image.png

從這裏可以看出,目前TiDB最新的版本是v8.5.1。需要下載以下兩個安裝包文件:

tidb-community-server-v8.5.1-linux-amd64.tar.gz
tidb-community-toolkit-v8.5.1-linux-amd64.tar.gz

TiDB的離線部署與在線部署類型非常類似,唯一的區別就是:離線部署模式下需要將TiDB的鏡像源設置為本地目錄;而在線部署模式下TiDB的鏡像源為官方倉庫地址。下面命令的輸出信息展示了在線部署模式下TiDB的鏡像源地址。

tiup mirror show

# 輸出信息如下:
https://tiup-mirrors.pingcap.com

下表展示了TiDB全分佈式集羣中包含的實例信息。
image.png

與偽分佈集羣部署類似,在部署全分佈集羣時需要配置中控節點與其餘各節點的免密碼登錄。以下步驟均在中控節點上執行。
(1)將離線包發送到目標集羣的中控機後,執行以下命令安裝TiUP組件。

tar xzvf tidb-community-server-v8.5.1-linux-amd64.tar.gz && \
sh tidb-community-server-v8.5.1-linux-amd64/local_install.sh && \
source /root/.bash_profile

local_install.sh 腳本會自動執行命令:
tiup mirror set tidb-community-server-v8.5.1-linux-amd64
將當前鏡像地址設置為 tidb-community-server-v8.5.1-linux-amd64。

(2)執行命令確定TiDB鏡像地址是否為本地目錄。

tiup mirror show

# 輸出信息如下:
/root/tools/tidb-community-server-v8.5.1-linux-amd64

(3)執行下面的命令將tidb-community-toolkit-v8.5.1-linux-amd64.tar.gz合併到本地鏡像地址中。

tar xf tidb-community-toolkit-v8.5.1-linux-amd64.tar.gz
ls -ld tidb-community-server-v8.5.1-linux-amd64 tidb-community-toolkit-v8.5.1-linux-amd64
cd tidb-community-server-v8.5.1-linux-amd64/
cp -rp keys ~/.tiup/
tiup mirror merge ../tidb-community-toolkit-v8.5.1-linux-amd64

(4)部署TiDB集羣的yaml文件如下:

# # 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.79.11
 - host: 192.168.79.12
 - host: 192.168.79.13

tidb_servers:
 - host: 192.168.79.11
   port: 4000
   status_port: 10080
   
 - host: 192.168.79.12 
   port: 4001
   status_port: 10081

tikv_servers:
 - host: 192.168.79.11
   config:
     server.labels: { host: "Beijing" }   

 - host: 192.168.79.12
   config:
     server.labels: { host: "Shanghai" }   

 - host: 192.168.79.13
   config:
     server.labels: { host: "Chongqing" }   

tiflash_servers:
 - host: 192.168.79.14

monitoring_servers:
 - host: 192.168.79.14
   port: 7788

grafana_servers:
 - host: 192.168.79.14

(5)當準備好了topo.yaml文件後,執行下面的命令部署TiDB數據庫集羣。

tiup cluster deploy mytidb-cluster v8.5.1 ./topo.yaml --user root
user avatar yichenliu 頭像 lanyiyun666 頭像
點贊 2 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.