
導(dǎo)讀
TiProxy 是 TiDB 官方推出的高可用代理組件,旨在替代傳統(tǒng)的負(fù)載均衡工具如 HAProxy 和 KeepAlived,為 TiDB 提供連接遷移、故障轉(zhuǎn)移、服務(wù)發(fā)現(xiàn)等核心能力。本文全面解析了 TiProxy 的設(shè)計(jì)理念、主要功能及適用場(chǎng)景,并通過(guò)實(shí)際案例展示了其在擴(kuò)縮容、故障處理和流量捕捉與回放中的強(qiáng)大能力。

TiDB 是一款典型的分布式存算分離架構(gòu)的數(shù)據(jù)庫(kù),其中計(jì)算層由多個(gè)無(wú)狀態(tài)的 TiDB Server 組成,這些 TiDB Server 同時(shí)對(duì)外承擔(dān)連接請(qǐng)求。為了可以將連接分發(fā)到多個(gè) TiDB Server 節(jié)點(diǎn)上,一般需要借助外部負(fù)載均衡組件如硬件負(fù)載均衡 F5、軟件負(fù)載均衡 HAProxy 等。
為了實(shí)現(xiàn)全鏈路的高可用架構(gòu),我們經(jīng)常也需要考慮負(fù)載均衡組件本身的高可用性,比如通過(guò) KeepAlived 來(lái)保證 HAProxy 的高可用。這無(wú)疑增加了整體的使用成本,尤其是對(duì)于使用最小規(guī)模的 TiDB 集群部署已經(jīng)能夠完全承載業(yè)務(wù)體量的系統(tǒng)而言。

如果用戶本身沒(méi)有現(xiàn)成的負(fù)載均衡設(shè)備,則必須搭建一套類似 KeepAlived+HAProxy 的高可用負(fù)載均衡層,增加了維護(hù)的成本, KeepAlived 和 HAProxy 本身也不屬于 TiDB 數(shù)據(jù)庫(kù)生態(tài)的組件,出現(xiàn)問(wèn)題也只能尋找現(xiàn)網(wǎng)的解決方法。TiProxy 是 TiDB 官方的代理組件,它為 TiDB 提供負(fù)載均衡、連接保持、服務(wù)發(fā)現(xiàn)等功能,是替換開(kāi)源的 KeepAlived+HAProxy 或其他負(fù)載均衡軟件有效的方案。


TiProxy 的主要功能包括:連接遷移、故障轉(zhuǎn)移、服務(wù)發(fā)現(xiàn)和一鍵部署。

- 連接遷移。連接遷移就是說(shuō)可以把客戶端連接從 A 計(jì)算節(jié)點(diǎn)遷移到 B 計(jì)算節(jié)點(diǎn)而不影響業(yè)務(wù)。這種通常在擴(kuò)縮容、滾動(dòng)升級(jí)、滾動(dòng)重啟場(chǎng)景使用,是一種計(jì)劃內(nèi)的動(dòng)作,如果是計(jì)算節(jié)點(diǎn)異常下線這種情況,則不屬于連接遷移的范疇。
- 故障轉(zhuǎn)移。故障轉(zhuǎn)移就是說(shuō)當(dāng)發(fā)現(xiàn)有計(jì)算節(jié)點(diǎn)故障的時(shí)候,比如 OOM 或是發(fā)現(xiàn)與 PD/TiKV 組件無(wú)法連接時(shí),TiProxy 可以發(fā)現(xiàn)故障并將連接轉(zhuǎn)移到正常的計(jì)算節(jié)點(diǎn)上。
- 服務(wù)發(fā)現(xiàn)。使用外部的負(fù)載均衡組件時(shí)無(wú)法自動(dòng)感知到有計(jì)算節(jié)點(diǎn)變化的情況,比如對(duì)計(jì)算節(jié)點(diǎn)做了擴(kuò)縮容,而使用 TiProxy 就能自動(dòng)的發(fā)現(xiàn)新增/刪除的計(jì)算節(jié)點(diǎn),不需要人工介入。
- 一鍵部署。TiProxy 被集成到 TiUP、TiOperator 管理工具中,可通過(guò) tiup 命令直接擴(kuò)容的方式安裝即可,不需要單獨(dú)下載并單獨(dú)安裝。

基于上述介紹的 TiProxy 主要能力,我們可以梳理出 TiProxy 比較適用的場(chǎng)景。

- 可用性要求高的業(yè)務(wù)。有些業(yè)務(wù)系統(tǒng)通常要求 7*24 對(duì)外提供服務(wù),這些系統(tǒng)對(duì)可用性要求極高,比如要滿足 4 個(gè) 9 或 5 個(gè) 9 之類的不停機(jī)時(shí)間。然而系統(tǒng)在長(zhǎng)時(shí)間運(yùn)行的環(huán)境中,無(wú)法避免因?yàn)闃I(yè)務(wù)變更或程序漏洞需要進(jìn)行計(jì)劃性的調(diào)整,這就要求數(shù)據(jù)庫(kù)能夠支持不影響業(yè)務(wù)的前提下進(jìn)行在線重啟、升級(jí)等操作。使用 TiProxy 的連接遷移功能結(jié)合 TiDB 數(shù)據(jù)庫(kù)的滾動(dòng)重啟功能可以完美的解決這一場(chǎng)景。
- 敏態(tài)類的業(yè)務(wù)。某些業(yè)務(wù)系統(tǒng)可能在大部分的時(shí)間段業(yè)務(wù)都處于低峰期,但在某些時(shí)間段內(nèi)業(yè)務(wù)會(huì)比平時(shí)增加 10 倍或者更多,比如電商促銷活動(dòng)期間。這要求數(shù)據(jù)庫(kù)在短時(shí)間內(nèi)能夠支持快速的擴(kuò)縮容操作,以應(yīng)對(duì)高峰時(shí)段的業(yè)務(wù)負(fù)載。TiProxy 也非常適合這樣的場(chǎng)景,可以保證在擴(kuò)縮容操作過(guò)程中對(duì)業(yè)務(wù)無(wú)影響。
- 提前規(guī)避系統(tǒng)風(fēng)險(xiǎn)。分布式系統(tǒng)由多個(gè)節(jié)點(diǎn)組成,每個(gè)節(jié)點(diǎn)都對(duì)外提供服務(wù)。無(wú)論是因?yàn)闃I(yè)務(wù)自身的原因,還是因?yàn)閿?shù)據(jù)庫(kù)內(nèi)部機(jī)制,節(jié)點(diǎn)之間出現(xiàn)不均衡的狀態(tài)是無(wú)法避免的。通過(guò)監(jiān)控節(jié)點(diǎn)的均衡狀態(tài),我們可以提前發(fā)現(xiàn)可能存在 CPU 或內(nèi)存資源嚴(yán)重不均的情況,結(jié)合 TiProxy,將異常節(jié)點(diǎn)的連接提前轉(zhuǎn)移到正常節(jié)點(diǎn),并在恢復(fù)之后再將連接均衡回來(lái)。
需要注意的是,如果系統(tǒng)對(duì)交易的 Duration 延遲要求極高,那么 TiProxy 可能不是最優(yōu)的選擇。相比 F5 或 HAProxy 這樣的外部負(fù)載均衡組件,TiProxy 性能會(huì)稍有不足,會(huì)一定程度的降低 TPS 或增加交易延遲,這在官網(wǎng)文檔中有相關(guān)說(shuō)明。

TiProxy 是 TiDB v8 版本才發(fā)布的組件(實(shí)際支持 v6.5 及以上 TiDB 版本),對(duì)很多 TiDB 用戶來(lái)說(shuō)可能還屬于一個(gè)新鮮的東西??紤]到這是一個(gè)新的組件,大部分用戶從安全穩(wěn)定的角度考慮就是否使用 TiProxy 組件還處于一個(gè)觀望階段。不過(guò)從 TiDB 的產(chǎn)品發(fā)布內(nèi)容來(lái)看,從 v8.1 到 v8.5,我們也看到 TiProxy 一直在改進(jìn)和增強(qiáng),可以在一些延遲要求不是特別敏感的系統(tǒng)中測(cè)試并使用起來(lái)。
那么如何在一個(gè) TiDB 集群中使用 TiProxy 呢,以下參考官網(wǎng)文檔 TiProxy 簡(jiǎn)介 (https://docs.pingcap.com/zh/tidb/stable/tiproxy-overview#安裝和使用 ) 做一個(gè)簡(jiǎn)單的示例說(shuō)明。
1 TiDB Server 實(shí)例配置
1. 升級(jí)并檢查 tiup 版本
如果 TiUP 版本是 v1.15.0 之前,需要為 TiDB Server 實(shí)例生成自簽名證書并配置證書的路徑,否則將無(wú)法使用 TiProxy 的連接遷移功能。鑒于為 tidb server 生成自簽名證書步驟比較繁瑣,建議直接將 tiup 升級(jí)至 v1.15.0 版本或以上,通過(guò)以下命令升級(jí)及檢查 tiup 版本。
tiupupdate--self
tiup-v|greptiup
2. 配置 tidb server 的 graceful-wait-before-shutdown
根據(jù)官網(wǎng)提示,tidb server 的 graceful-wait-before-shutdown 應(yīng)大于應(yīng)用程序最長(zhǎng)事務(wù)的持續(xù)時(shí)間,否則 tidb server 下線時(shí)客戶端可能斷連,最長(zhǎng)事務(wù)持續(xù)時(shí)間可通過(guò) grafana 監(jiān)控報(bào)表查看確認(rèn)。
server_configs:
tidb:graceful-wait-before-shutdown:15
2 安裝并配置 TiProxy
TiProxy 可以部署多個(gè),為了保證 TiProxy 的高可用,一般建議部署兩個(gè),通過(guò)配置虛擬 IP 將流量路由到 TiProxy 實(shí)例上。
1. 準(zhǔn)備 TiProxy 部署配置文件 tiproxy.toml
TiProxy 支持一系列參數(shù)配置,具體可參考文檔 TiProxy 配置文件 (https://docs.pingcap.com/zh/tidb/stable/tiproxy-configuration) 。以下是一個(gè)最基本的配置文件,它表示在兩個(gè)節(jié)點(diǎn)上分別安裝版本為 v1.3.0 的 tiproxy 組件,配置 ha.virtual-ip 及 ha.interface 指定虛擬 IP,用于對(duì)外提供連接服務(wù)。
component_versions:
tiproxy:"v1.3.0"
server_configs:
tiproxy:
ha.virtual-ip:"10.1.1.200/24"
ha.interface:"eth0"
tiproxy_servers:
-host:10.1.1.154
-host:10.1.1.155
2. 安裝 TiProxy 組件
如果是首次安裝集群,則 TiProxy 可以與集群一同完成安裝;如果是在已有集群中增加 TiProxy ,可以通過(guò) tiup scale-out 的方式擴(kuò)容 TiProxy 組件。
安裝或擴(kuò)容完成后,通過(guò) tiup display 命令可以查看到相應(yīng)的 tiproxy 組件,其默認(rèn)的連接端口為 6000。
tiupclusterdisplaytidb-test|greptiproxy
10.1.1.154:6000tiproxy10.1.1.1546000/3080linux/aarch64Up-/data1/tidb-re-deploy/tiproxy-6000
10.1.1.155:6000tiproxy10.1.1.1556000/3080linux/aarch64Up-/data1/tidb-re-deploy/tiproxy-6000
3. 驗(yàn)證連接 TiProxy
上述步驟完成后,我們便可以通過(guò)連接 TiProxy 地址及端口來(lái)驗(yàn)證是否可以正常連接到 tidb。如果配置無(wú)誤,無(wú)論是通過(guò)
:6000 還是通過(guò)
:6000,應(yīng)該都
可以正常連接到 TiDB。
3 體驗(yàn) TiProxy 連接遷移
如上面內(nèi)容所述,TiProxy 具有連接遷移的能力,對(duì)于計(jì)劃內(nèi)的操作如擴(kuò)縮容、滾動(dòng)升級(jí)、滾動(dòng)重啟,TiProxy 可以保證完全不影響業(yè)務(wù)。TiProxy 同時(shí)也具有服務(wù)發(fā)現(xiàn)能力,當(dāng)有計(jì)算節(jié)點(diǎn)增加或減少時(shí),TiProxy 能自動(dòng)感知,無(wú)須人工介入。我們通過(guò)模擬 sysbench 壓測(cè),并在壓測(cè)過(guò)程中擴(kuò)容和縮容計(jì)算節(jié)點(diǎn),觀察所有計(jì)算節(jié)點(diǎn)的連接變化以及業(yè)務(wù)影響情況。
1. 開(kāi)啟 sysbench 壓測(cè)
使用 100 并發(fā)連接開(kāi)啟 sysbench 壓力測(cè)試,場(chǎng)景為 oltp_read_only。觀察各 tidb server 連接數(shù)情況,連接數(shù)分別為33/33/34,處于相對(duì)均衡的狀態(tài)。

進(jìn)一步查看運(yùn)行時(shí) QPS,查詢 QPS 約為27.9K。

2. 在線擴(kuò)容一臺(tái) tidb server
使用 tiup scale-out 在線擴(kuò)容一臺(tái) tidb server,擴(kuò)容后 tidb server 從原來(lái)的 3 臺(tái)變成 4 臺(tái)
tiupclusterscale-outtidb-B./scale-tidb.yaml
觀察擴(kuò)容過(guò)程中 sysbench 壓測(cè)情況,發(fā)現(xiàn)運(yùn)行平穩(wěn)無(wú)任何報(bào)錯(cuò)。通過(guò)監(jiān)控查看運(yùn)行時(shí) QPS,查詢 QPS 約為30.7 K,較之前 QPS 有上升的趨勢(shì)。

觀察各 tidb server 連接數(shù)情況,連接數(shù)分別為26/26/26/22,處于相對(duì)均衡的狀態(tài),可以看到在運(yùn)行過(guò)程中連接被自動(dòng)遷移到擴(kuò)容的 tidb server 節(jié)點(diǎn),無(wú)須手工介入。

3. 在線縮容一臺(tái) tidb server
使用 tiup scale-in 在線縮容兩臺(tái) tidb server,縮容后 tidb server 從剛剛的 4 臺(tái)變成 2 臺(tái)
tiupclusterscale-intidb-B-N10.1.1.153:24000,10.1.1.154:24000
觀察擴(kuò)容過(guò)程中 sysbench 壓測(cè)情況,發(fā)現(xiàn)運(yùn)行平穩(wěn)無(wú)任何報(bào)錯(cuò)。通過(guò)監(jiān)控查看運(yùn)行時(shí) QPS,查詢 QPS 約為21.8K,較之前 QPS 有明顯下降的趨勢(shì)。

進(jìn)一步觀察各 tidb server 連接數(shù)情況,連接數(shù)分別為50/50/0/0,說(shuō)明在運(yùn)行過(guò)程中連接被自動(dòng)遷移到剩余的 2 臺(tái) tidb server 節(jié)點(diǎn),無(wú)須手工介入。

通過(guò)上述步驟的演示,無(wú)論是在線擴(kuò)容還是縮容,TiProxy 組件可以實(shí)現(xiàn)業(yè)務(wù)完全無(wú)感知,TiProxy 能自動(dòng)識(shí)別新增或移除的計(jì)算節(jié)點(diǎn),將連接自動(dòng)均衡到現(xiàn)有的節(jié)點(diǎn)上。

TiDB v8.5.0 LTS 版本中增加了 TiProxy 流量捕捉與回放的功能,作為實(shí)驗(yàn)特性。流量捕捉和回放適用于在生產(chǎn)環(huán)境捕捉流量并在測(cè)試環(huán)境回放,適用的場(chǎng)景包括:
- 數(shù)據(jù)庫(kù)版本升級(jí)前驗(yàn)證。比如某套業(yè)務(wù)生產(chǎn)環(huán)境的 TiDB 版本要進(jìn)行升級(jí),可以通過(guò)在現(xiàn)有生產(chǎn)環(huán)境捕捉一定時(shí)間段的流量并在測(cè)試環(huán)境新版本中進(jìn)行回放驗(yàn)證,判斷新版本中業(yè)務(wù)是否能平穩(wěn)運(yùn)行。
- 業(yè)務(wù)改造或應(yīng)用打版驗(yàn)證。有時(shí)候應(yīng)用可能也會(huì)進(jìn)行打版或升級(jí),可能是因?yàn)闃I(yè)務(wù)需求的變化,如果直接在生產(chǎn)環(huán)境操作存在一定的風(fēng)險(xiǎn),可以用生產(chǎn)的流量在測(cè)試環(huán)境中進(jìn)行回放驗(yàn)證。
- 擴(kuò)縮容及業(yè)務(wù)上限評(píng)估。有些生產(chǎn)環(huán)境數(shù)據(jù)庫(kù)可能長(zhǎng)期處于高壓狀態(tài),需要通過(guò)擴(kuò)容來(lái)滿足業(yè)務(wù)需求;也有些生產(chǎn)環(huán)境數(shù)據(jù)庫(kù)資源使用率極低,資源存在浪費(fèi)的情況,可以適當(dāng)縮容一些節(jié)點(diǎn)出來(lái)。使用 TiProxy 的流量捕捉回放功能,可以利用測(cè)試環(huán)境來(lái)評(píng)估生產(chǎn)的流量具體使用多少資源比較合適。
使用 TiProxy 的流量捕捉回放功能需要使用 tiproxyctl 工具,安裝 tiproxyctl 步驟如下,
tiupinstalltiproxy
ls`tiup--binarytiproxy`ctl
當(dāng)要在生產(chǎn)環(huán)境進(jìn)行流量捕捉時(shí),使用tiproxyctl traffic capture。以下命令表示捕獲指定 tiproxy 地址的流量,并保存到 /tmp/traffic 目錄下,持續(xù)時(shí)間為 10 分鐘。
tiproxyctltrafficcapture--host10.1.1.200--port3080--output="/tmp/traffic"--duration=10m
捕獲的流量將保存在 TiProxy 節(jié)點(diǎn)的對(duì)應(yīng)目錄下,包含兩個(gè)文件:meta 和 traffic.log,meta 是流量的元數(shù)據(jù)信息記錄,traffic.log 則保存了具體的業(yè)務(wù)流量信息。
tree/tmp/traffic/
/tmp/traffic/
├──meta
└──traffic.log
0directories,2files
流量捕捉完成后,使用tiproxyctl traffic replay在測(cè)試環(huán)境中回放流量。以下命令表示在測(cè)試環(huán)境中從指定位置回放流量,回放速度為 2 倍速生產(chǎn)流量。
tiproxyctltrafficreplay--host10.1.1.200--port3080--username=
--password=
--input="/tmp/traffic"--speed=2
本文僅對(duì) TiProxy 流量捕捉與回放功能做一個(gè)簡(jiǎn)要的介紹說(shuō)明,更多細(xì)節(jié)內(nèi)容請(qǐng)參考官網(wǎng) TiProxy 流量回放 (https://docs.pingcap.com/zh/tidb/stable/tiproxy-traffic-replay)。

本文對(duì) TiDB 的官方代理組件 TiProxy 進(jìn)行了一個(gè)整體的說(shuō)明與介紹,TiProxy 是 v8 版本開(kāi)始支持的可以用于代替開(kāi)源負(fù)載均衡工具的一款 TiDB 生態(tài)組件。TiProxy 不僅具有連接遷移、故障轉(zhuǎn)移、服務(wù)發(fā)現(xiàn)和一鍵部署的能力,在新版本中也支持流量捕捉與回放的功能,是替換開(kāi)源代理組件的一個(gè)極佳方案。引入 TiProxy 在延遲要求極高的場(chǎng)景下可能帶來(lái)一定的性能損失,建議以具體業(yè)務(wù)場(chǎng)景中性能測(cè)試為準(zhǔn)。
熱門跟貼