從馬車到電動車,TiDB 部署工具變形記

做者:Heng Long

打造優秀產品的信念滲透在每個 TiDB 開發者的血液中,衡量產品的優秀有多個維度:易用性、穩定性、性能、安全性、開放性、拓展性等等。**在部署易用性方面,TiDB 開發者們通過諸多探索和嘗試,通過了命令行時代、Ansible 時代,終於在 TiDB 4.0 發佈了新一代具備里程碑意義的解決方案——TiUP。linux

TiUP 的意義不只僅在於提供了里程碑式的解決方案,更是對 TiDB 開源社區活力的有力證實。TiUP 從 3 月立項進入 PingCAP Incubator 進行孵化,從零開發到最終發佈 TiUP 1.0 GA 僅僅只花了兩個月。兩個月內 40+ 位 Contributor 新增了 690+ 次提交,最終沉澱接近 40k 行代碼。git

本文會描述整個演進過程,並介紹 TiUP 設計過程當中的一些理念和實現細節。github

以史爲鑑

TiUP 的誕生並不是一蹴而就,而是有一個演變過程。簡要描述這個演變過程,有助於你們更加深刻理解 TiUP 的設計和取捨。json

純命令行

在沒有 TiDB Ansible 的時代,要運行一個 TiDB 集羣只能經過命令行的方式。TiDB 集羣包含 TiDB/TiKV/PD 三個核心組件, 和 Promethues/Grafana/Node Exporter 監控組件。手動構建一個集羣運行須要的全部命令行參數和配置文件比較複雜的。好比,咱們想要搭建一個集羣,其中啓動三個 PD 的命令行參數就有下面這麼複雜(能夠忽略命令行,僅演示覆雜性):bootstrap

$ bin/pd-server --name=pd-0
--data-dir=data/Rt1J27k/pd-0/data
--peer-urls=http://127.0.0.1:2380
--advertise-peer-urls=http://127.0.0.1:2380 --client-urls=http://127.0.0.1:2379 --advertise-client-urls=http://127.0.0.1:2379 --log-file=data/Rt1J27k/pd-0/pd.log --initial-cluster=pd-0=http://127.0.0.1:2380,pd-1=http://127.0.0.1:2381,pd-2=http://127.0.0.1:2383

$ bin/pd-server --name=pd-1
--data-dir=data/Rt1J27k/pd-1/data
--peer-urls=http://127.0.0.1:2381 --advertise-peer-urls=http://127.0.0.1:2381 --client-urls=http://127.0.0.1:2382 --advertise-client-urls=http://127.0.0.1:2382 --log-file=data/Rt1J27k/pd-1/pd.log --initial-cluster=pd-0=http://127.0.0.1:2380,pd-1=http://127.0.0.1:2381,pd-2=http://127.0.0.1:2383

$ bin/pd-server --name=pd-2
--data-dir=data/Rt1J27k/pd-2/data
--peer-urls=http://127.0.0.1:2383 --advertise-peer-urls=http://127.0.0.1:2383 --client-urls=http://127.0.0.1:2384 --advertise-client-urls=http://127.0.0.1:2384 --log-file=data/Rt1J27k/pd-2/pd.log --initial-cluster=pd-0=http://127.0.0.1:2380,pd-1=http://127.0.0.1:2381,pd-2=http://127.0.0.1:2383
注:以 $ 開頭的表示在命令行執行的命令

以上僅僅是啓動 PD 就能夠發現這種方式顯然太複雜、使用門檻過高。儘管咱們能夠經過把這些東西腳本化,在腳本構建好這些內容,每次執行對應腳原本簡化這個過程,可是對於第一次構建腳本的用戶來講,也是不小的挑戰。vim

另外在生產環境部署時還須要在多個主機上分發下載對應組件,以及初始化環境,對於擴容又須要各類初始化,至關繁瑣。安全

TiDB Ansible

第二代方案 TiDB Ansible 基於 Ansible playbook 功能編寫的集羣部署工具,簡化以後,只須要用戶提供拓撲文件,便可提供集羣部署和運維功能(啓動、關閉、升級、重啓、擴容、縮容)。可是 TiDB Ansible 的使用依然很是繁瑣,提供的錯誤消息也不友好,同時只能串行處理,對於大集羣的運維和管理尤爲不方便。app

$ vim hosts.ini                                                
$ ansible-playbook -i hosts.ini create_users.yml -u root -k   
$ vim inventory.ini                                        
$ ansible-playbook local_prepare.yml 
$ ansible-playbook bootstrap.yml
$ ansible-playbook deploy.yml
$ ansible-playbook start.yml

以上是部署啓動一個集羣,擴縮容操做更加繁瑣。而且因爲 Ansible 自身命令執行的特色,整個部署過程的時間較長。運維

TiUP

TiUP 在 TiDB Ansible 的基礎上進一步對整個集羣的部署和運維操做進行了簡化。因爲 TiUP 從零開發,能夠掌控全部實現細節,針對部署 TiDB 集羣的須要定製、避免非必需的動做,內部作到最大程度的並行化,同時提供更加友好錯誤提示。curl

利用 TiUP 部署集羣經過簡單的命令便可完成,且執行速度較 TiDB Ansible 大幅提升:

$ tiup cluster deploy <cluster-name> <version> <topology.yaml> [flags]   # 部署集羣
$ tiup cluster start prod-cluster                                        # 啓動集羣

其餘經常使用的運維操做也一樣能夠經過一個命令完成:

$ tiup cluster scale-in prod-cluster -N 172.16.5.140:20160               # 縮容節點
$ tiup cluster scale-out tidb-test scale.yaml                            # 擴容節點
$ tiup cluster upgrade tidb-test v4.0.0-rc                               # 升級集羣

深刻 TiUP

首先使用下面這行腳本安裝 TiUP:

$ curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh

你會發現,使用 tiup help 命令時,咱們並無 tiup cluster 這個子命令,這是怎麼回事兒呢?這就要從 TiUP 的設計理念聊起。

TiUP 理念

以上雖然演示了經過 TiUP 快速部署運維集羣,可是 TiUP 的定位歷來就不是一個運維工具,而是 TiDB 組件管理器。TiUP 之於 TiDB,相似 yum 之於 CentOS,Homebrew 之於 MacOS。

TiUP 的理念爲:簡單易用、可擴展、開放、安全。

簡單易用

TiUP 自己只包含不多幾個命令,幾乎不用專門學習、記憶,徹底依靠經驗和肌肉記憶就能正確使用:

命令 解釋
tiup install <component> 安裝一個組件
tiup uninstall <component> 卸載一個組件
tiup update 更新組件
tiup list 顯示組件列表
tiup status 運行的組件狀態
tiup clean 清理組件運行數據

可擴展

TiUP 最核心之處就是高度可擴展、可定製,除了自帶的幾個命令以外,還能夠經過安裝不一樣的組件,對 TiUP 進行定製,一千我的就有一千種 TiUP,將 TiUP 打形成一把屬於本身的瑞士軍刀。以上演示 集羣部署運維 就是經過 TiUP-Cluster 組件提供的功能完成的,除了 TiUP-Cluster 組件以後,還有很是多有用的組件,例如如下兩個開發中最經常使用的組件:

1. TiUP-Playground 組件,能夠一條命令直接運行一個本地 TiDB 集羣:

$ tiup playground                  # 運行最新穩定版 TiDB 集羣
$ tiup playground v3.0.15          # 運行版本爲 v3.0.15 TiDB 集羣
$ tiup playground --kv 3           # 啓動三個 TiKV 節點
$ tiup playground --monitor        # 啓動 Prometheus 監控
$ ...

2. TiUP-Bench 組件,能夠快速進行基準測試:

$ tiup bench tpcc                         # 進行 TPC-C 性能基準測試
$ tiup bench tpch prepare
$ tiup bench tpch run                     # 進行 TPC-H 性能基準測試

開放

TiUP 的組件模式不只僅爲可擴展性設計的,也但願構建一個開放生態,用戶能夠根據本身的使用場景,編寫本身的組件,而且將組件提交到 TiUP 的鏡像倉庫。也能夠在鏡像倉庫中根據本身的需求選擇由社區開發的組件。

目前 TiUP 鏡像倉庫已經包含 20+ 組件,但願經過開放的生態基因和 TiDB 龐大的開發者生態創意碰撞,能爲 TiUP 提交愈來愈多優質的組件。

爲此,TiUP 提供了一個命令 tiup mirror publish 可以將本地組件經過一個命令發佈到 TiUP 的鏡像倉庫。

$ tiup mirror publish -h
Publish a component to the repository

Usage:
  tiup mirror publish <comp-name> <version> <tarball> <entry> [flags]

Flags:
      --arch string       the target system architecture (default "amd64")
      --desc string       description of the component
      --endpoint string   endpoint of the server (default "https://tiup-mirrors.pingcap.com/")
  -h, --help              help for publish
  -k, --key string        private key path
      --os string         the target operation system (default "linux")

Global Flags:
      --repo string          Path to the repository
      --skip-version-check   Skip the strict version check, by default a version must be a valid SemVer string

安全

安全是軟件分發系統(組件管理器)的基石,若是分發的組件沒有安全保障,那麼上面提到簡單易用、可擴展、開放都會爲惡意軟件提供便利。TiUP 做爲 TiDB 生態的入口,好比提供企業級安全保障,須要防範在軟件分發各個環節中可能出現的各類攻擊。

要防範組件分發過程當中的各類攻擊,須要很是謹慎和精細的設計,得益於 TUF 規範的優良設計,咱們在 TUF 規範的基礎上設計了 TiUP 的軟件分發方案,詳細的設計文檔超過 10 頁,本文不會詳細討論全部細節,有興趣的朋友能夠參考 設計文檔

如下是對軟件分發過程一個簡要的描述(如何在各個環節防範不一樣類型的攻擊,能夠參考 TUF 規範和 TiUP 設計文檔):

  1. 元信息分級:

    a. root 保存對元信息簽名的公鑰信息;

    b. index 保存各個組件信息和組件 Owner 的公鑰信息;

    c. component 保存組件的版本信息;

    d. snapshot 保存其餘元信息的最新版本號和 Hash 值;

    e. timestamp 保存最新 snapshot 的版本號和 Hash 值。

  2. 全部的元信息和組件包在 CDN 是不可變的,不一樣版本的元信息使用 ${version}.${name}.json 的文件名保存。
  3. 全部組件包的的 Hash 值保存在組件的元信息文件中 (sha256/sha512)
  4. 全部的元信息文件都包含該被簽名內容和簽名信息。
  5. 根證書使用 5 個密鑰簽名,5 個密鑰分別由 5 位不一樣的 TiDB 開發者離線保存。
  6. 初始分發的 TiUP 中包含一份由 5 位 TiDB 開發者簽名的 root.json,後續信息校驗會保證 root.json 中至少有三個簽名是正確的。
  7. index/snashot/timestamp 的不可篡改性由 root.json 中的對應的密鑰信息保證。
  8. component 的不可篡改性由 index.json 中對應的 Owner 密鑰保證(社區經過 tiup mirror publish 發佈的組件,只有做者擁有私鑰)。
  9. 各個組件包的不可篡改性由元信息中的 sha256/sha512 Hash 值保證(目前的算力狀況下是安全的)。

經過上面的機制,咱們能保證用戶下載的組件不會通過任何中間環節篡改,從而提供安全的組件分發機制。

但願上面的介紹能讓你們對 TiUP 的演進和理念有初步的認識,同時 TiUP 開源在 Github 而且隨着 TiDB 4.0 GA 版本一塊兒發佈,對於 TiUP 有興趣的小夥伴能夠閱讀源碼,有任何問題均可以經過 Issue 提問或直接在 Slack 的 #sig-tiup 中提問。

附:TiUP 貢獻者名單

序號 GitHub ID
1 5kbpers
2 AstroProfundis
3 baurine
4 birdstorm
5 bobotu
6 breeswish
7 BusyJay
8 c4pt0r
9 chenlx0
10 fewdan
11 flowbehappy
12 fredchenbj
13 hhkbp2
14 HunDunDM
15 ilovesoup
16 JaySon-Huang
17 july2993
18 King-Dylan
19 kissmydb
20 kolbe
21 lhy1024
22 lichunzhu
23 liubo0127
24 lonng
25 lucklove
26 mahjonp
27 mapleFU
28 marsishandsome
29 nrc
30 overvenus
31 qinzuoyan
32 rleungx
33 siddontang
34 sticnarf
35 Win-Man
36 wjhuang2016
37 YangKeao
38 yeya24
39 yikeke
40 zhangjinpeng1987
41 zyguan

原文閱讀:https://pingcap.com/blog-cn/t...

若對 TiDB 使用上有疑問,能夠在 https://asktug.com 上搜索or發帖提問~

相關文章
相關標籤/搜索