對於企業級和雲資料庫,除了效能、可用性和功能等常規維度外,一個重要維度就是可管理性,可管理性維度會很深地影響使用者實際使用資料庫的隱性成本。在最新版本中,TiDB 引入了資料放置框架(Placement Rules In SQL),增加了企業級叢集管理元件 TiDB Enterprise Manager ,開放了智慧診斷服務 PingCAP Clinic 的預覽,大幅度加強了作為企業級產品的可管理性,與此同時也加入了諸多雲原生資料庫所需的基礎設施。
溫故而知新,本文主要介紹構成 TiDB 可管理性的重要元件之一:TiUP,一款從 TiDB 4.0 版本開始投入使用的 TiDB 部署工具。
TiUP 對於 TiDBer 來說是日常必備工具,所以這篇文章歸類為“溫故知新”系列,如果您剛接觸 TiDB,請先參閱這篇文章:《從馬車到電動車,TiDB 部署工具變形記》。
環境說明
本文所涉及到的環境、元件版本資訊如下:
TiDB v5.4.0
TiUP v1.9.3 (2022-03-24 Release)
CentOS 7.9
TiUP 簡介
在各種系統軟體和應用軟體的安裝管理中,包管理器均有著廣泛的應用,包管理工具的出現大大簡化了軟體的安裝和升級維護工作。例如,幾乎所有使用 RPM 的 Linux 都會使用 Yum 來進行包管理,而 Anaconda 則可以非常方便地管理 python 的環境和相關軟體包。
從 TiDB 4.0 版本開始,TiUP 作為新的工具,承擔著包管理器的角色,管理著 TiDB 生態下眾多的元件,如 TiDB、PD、TiKV 等。使用者想要執行 TiDB 生態中任何元件時,只需要執行 TiUP 一行命令即可,相比以前,極大地降低了管理難度。
圖 2-tiup 原始碼行數統計(2022-03-24)
TiUP 已釋出兩年有餘,版本迭代若干次,程式碼總量翻倍,由上圖可以看出程式碼更新已放緩,TiDBer 可放心地在生產環境使用。
再論 TiUP 元件
作為 Ti 利器,TiUP 可是日常工作必備。下面再來討論下 TiUP 的經典元件和常用命令。先將 tiup 重要命令列舉如下,然後再著重討論。
tiup
main/cmd/root
- tiup env
- tiup status
- tiup mirror
- tiup list --all --verbose
- tiup install hello
- tiup update
- tiup playground
- tiup client
- tiup cluster
- tiup bench ch(CH-benCHmark)/TPCC(TPC-C)/TPCH(TPC-H)/YCSB(Yahoo! Cloud Serving Benchmark)
- tiup dm
- tiup clean
tiup mirror
不是每個公司都會把資料庫部在公有云上的,即便是在公有云,為了便於版本統一管理,大都會選擇自建一個倉庫,是為生產庫基準版本管理。而對於金融業務更不用多說,那麼,如何在內網快速、簡潔、有效地搭建和維護倉庫,下面做個簡單的示例。
首先需要在能連線外網的機器安裝 TiUP,並克隆官方 TiUP 倉庫:
- 下載 tiup 檔案,並新增環境變數
mkdir -pv ~/.tiup/bin
wget https://tiup-mirrors.pingcap.com/tiup-linux-amd64.tar.gz
tar zxf tiup-linux-amd64.tar.gz -C ~/.tiup/bin/
echo 'export PATH=~/.tiup/bin:$PATH' >> ~/.bash_profile
source ~/.bash_profile
tiup -v
輸出的 TiUP 版本資訊:
1.9.3 tiup
Go Version: go1.17.7
Git Ref: v1.9.3
GitHash: f523cd5e051d0001e25d5a8b2c0d5d3ff058a5d5
- 克隆官方庫
先將倉庫映象指向官方庫:
tiup mirror set https://tiup-mirrors.pingcap.com
# 螢幕輸出日誌> Successfully set mirror to https://tiup-mirrors.pingcap.com
只克隆適合當前作業系統的最新版本,這裡只需指定TiDB v5.4.0
版本,其他元件會自動識別最新版本,並下載。
tiup mirror clone ~/.tiup/package -a amd64 -o linux v5.4.0
- 將 package 資料夾打包複製到內網機器:
# current server
tar zcf package.tgz package/
# new server
cd ~/.tiup
tar zxvf package.tgz
./package/local_install.sh
source ~/.bash_profile
tiup list
此時,新的本地倉已建好,建立一個hello
元件進行測試:
# test mirror
CMP_TMP_DIR=`mktemp -d -p ~/.tiup`
cat > $CMP_TMP_DIR/hello.sh << EOF
#! /bin/sh
echo -e "\033[0;36m<<< Hello, TiDB! >>>\033[0m"
EOF
chmod 755 $CMP_TMP_DIR/hello.sh
tar -C $CMP_TMP_DIR -czf $CMP_TMP_DIR/hello.tar.gz hello.sh
- 將
hello
元件釋出到本地倉:
tiup mirror genkey
tiup mirror grant admin
tiup mirror publish hello v0.0.1 $CMP_TMP_DIR/hello.tar.gz hello.sh --desc 'Hello, TiDB'
檢視已釋出的元件,並執行元件:
tiup list hello
tiup hello
圖 3-hello 元件執行輸出
此時的本地倉以可以管理自發布元件,但仍無法對外提供服務,下面用tiup server
一鍵搭建私有庫:
# 執行tiup server
tiup server ~/.tiup/package --addr 0.0.0.0:8000 --upstream=""
# 修改映象指向
tiup mirror set 'http://127.0.0.1:8000'
注:由於版本差異,當前版本已不建議使用環境變數TIUP_MIRRORS
,而是建議使用命令tiup mirror set <mirror-addr>
。
tiup playground
對於分散式資料庫來說,如何在本地快速搭建原型,以進行基本功能驗證、測試,這是作為 DBA 的基本能力。於是,tiup playground
應運而生,一鍵搭建最小可用叢集,並可以指定初始 TiDB 每個元件啟動的個數,以及擴縮容。
例如,啟動一個標籤為mydb1
的叢集,包含一個 TiDB 例項,一個 TiKV 例項,一個 PD 例項,一個 TiFlash 例項,不啟動監控元件:
$ tiup playground v5.4.0 --host 127.0.0.1 --tag mydb1 --db 1 --kv 1 --pd 1 --tiflash 1 --without-monitor
127.0.0.1:4000 ... Done
127.0.0.1:3930 ... Done
CLUSTER START SUCCESSFULLY, Enjoy it ^-^
To connect TiDB: mysql --comments --host 127.0.0.1 --port 4000 -u root -p (no password)
To view the dashboard: http://127.0.0.1:2379/dashboard
PD client endpoints: [127.0.0.1:2379]
檢視各元件程式 id:
$ tiup playground display
Pid Role Uptime
--- ---- ------
4321 pd 10m39.092616075s
4322 tikv 10m39.087748551s
4353 tidb 10m37.765844216s
4527 tiflash 9m50.16054123s
連線 tidb server,並查詢版本:
$ mysql -uroot -h127.1 -P4000 -e 'select version()\G'
*************************** 1. row ***************************
version(): 5.7.25-TiDB-v5.4.0
再例如,啟動一個標籤為mydb2
的叢集,只啟動 TiKV 例項,和 3 個 PD 例項:
$ tiup playground v5.4.0 --host 127.0.0.1 --tag mydb2 --mode tikv-slim --pd 3 --without-monitor
Playground Bootstrapping...
Start pd instance:v5.4.0
Start pd instance:v5.4.0
Start pd instance:v5.4.0
Start tikv instance:v5.4.0
PD client endpoints: [127.0.0.1:2379 127.0.0.1:2382 127.0.0.1:2384]
通過 PD API 檢視當前 PD 有幾個成員,以及 TiKV 例項資訊:
$ curl -s http://127.0.0.1:2379/pd/api/v1/members | jq .members[].name
"pd-1"
"pd-0"
"pd-2"
$ curl -s http://127.0.0.1:2379/pd/api/v1/stores | jq .stores[].store
{
"id": 1,
"address": "127.0.0.1:20160",
"version": "5.4.0",
"status_address": "127.0.0.1:20180",
"git_hash": "b5262299604df88711d9ed4b84d43e9c507749a2",
"start_timestamp": 1648110516,
"deploy_path": "/data/tiup/components/tikv/v5.4.0",
"last_heartbeat": 1648112496884914000,
"state_name": "Up"
}
Misc
效能測試也是必要環節,所以看到 TiUP 已經整合了 tpcc,tpch,ycsh,ch 四種測試工具集。可通過下面命令進行一鍵測試。
tiup bench ch/tpcc/tpch/ycsb
一鍵清理資料的命令如下:
tiup clean --all
這裡需要強調的是,在生產環境需要慎重執行下面的指令,除非你知道你在做什麼:
tiup cluster clean mydb3 --all
tiup cluster destroy mydb3
tiup cluster prune mydb3
圖 4-檢視所有可用元件
其他元件另行討論,或請先參閱官方文件。
TiUP v1.9.3 Release
2022-03-24,TiUP 釋出了 v1.9.3 版本,從變更日誌中我們可以清晰地瞭解到,本次更新修復了 5 個 bug,做了 2 點改進。
修復:
- 修復了主機名存在
-
時,tiup-cluster
的exec
子命令無法使用的錯誤。 (#1794, @nexustar) - 修復了使用
tiup-cluster
命令時,TiFlash 例項的埠(服務埠、代理埠、代理狀態埠)衝突檢測問題。 (#1805, @AstroProfundis) - 修復了下一代監控(
ng-monitor
)在 Prometheus 不可用的問題。 (#1806, @nexustar) - 修復了在主機只部署 Prometheus 的情況下,node_exporter 度量指標無法收集的問題。(與上個問題一同修復。) (#1806, @nexustar)
- 修復了
tiup-playground
在指定--host 0.0.0.0
時,無法工作的問題。 (#1811, @nexustar)
改進:
tiup cluster audit cleanup
tiup dm audit cleanup
- 在 Grafana 配置模板中增加匿名登陸示例。(這裡需要確保 DM 元件版本在 v1.9.0 之上 =>
tiup dm -v
) (#1785@sunzhaoyang)
引申思考
雲資料庫時代,或者說分散式資料庫時代下,DBA 角色該如何進行自我調整?我們是否還需要一個只會某種資料庫運維的 DBA,比如只會 DB2、Oracle、MySQL、PostgreSQL 等傳統關係型資料庫,或者進階的將,是否需要懂業務,有開發功底的業務型 DBA。其實,現在這些都沒有過時,且不應該被拋棄,而應該作為基礎功,變成 DBA 知識結構的底層模組,DBA 需要以此為基,向更高階段進化,猶如諸位前輩經歷那般,寫得了資料庫原始碼,懂得前端客戶真正所需,才能開發、調校出適合業務場景的高效能資料庫,以及一套好上手、易管理的資料庫生態工具。
毋庸置疑,TiUP 就是符合這種特質的工具。一鍵搭建私有庫、一鍵執行最小叢集、一鍵管理整個 TiDB 叢集,並可對 TiDB 叢集進行一鍵擴、縮容。不過,看似簡單的背後也是有功能取捨的,比如,tiup mirror
只能是在命令列進行操作,而沒有類似 Nexus 這種可在瀏覽器進行釋出、刪除包的介面工具。又如,TiUP 最常用的場景還是執行在普通機器上,對於 k8s 環境有TiDB Operator
工具,但是對於批量操作 ECS 的功能或案例,還是很少的。總之,希望 TiUP 在保持實用的前提下,功能更強勁。
延展閱讀:瞭解更多 TiUP 內容,請查閱 TiUP 文件地圖