在內核設計上,TiDB分佈式數據庫將整體架構拆分成了多個模塊,各模塊之間互相通信,組成完整的TiDB系統。對應的架構圖如下:
與傳統的單機數據庫相比,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%的數據存儲在最後一層)。
每個TiKV實例中有兩個RocksDB實例,一個用於存儲Raft日誌(通常被稱為raftdb),另一個用於存儲用户數據以及MVCC信息(通常被稱為kvdb)。kvdb中有四個Column Family:raft、lock、default和write,具體説明如下表所示。
二、 使用二進制包離線部署TiDB數據庫集羣
在一些企業的生產環境中無法訪問外部的網絡,此時如果部署TiDB數據庫集羣就需要使用二進制包方式進行部署。在TiDB的官方網站上提供不同版本的二進制包,如下圖所示。
從這裏可以看出,目前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全分佈式集羣中包含的實例信息。
與偽分佈集羣部署類似,在部署全分佈集羣時需要配置中控節點與其餘各節點的免密碼登錄。以下步驟均在中控節點上執行。
(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