打開網(wǎng)易新聞 查看精彩圖片

導(dǎo)讀

資源隔離是數(shù)據(jù)庫性能優(yōu)化的重要環(huán)節(jié),TiDB 在當(dāng)前版本已經(jīng)實現(xiàn)了從數(shù)據(jù)級隔離到流控隔離的全面升級,無論是多系統(tǒng)共享集群、復(fù)雜負(fù)載隔離,還是小型系統(tǒng)整合和 SQL 精細(xì)化控制,TiDB 都提供了靈活且高效的解決方案。

本文以實際案例為切入點,詳細(xì)解讀了 Placement Rules in SQL、Resource Control 等關(guān)鍵功能,以及 7.2+ 版本新增的 Runaway Queries 管理機制,幫助各位開發(fā)者和管理員選擇最適合自己的 TiDB 資源隔離方案。

打開網(wǎng)易新聞 查看精彩圖片

1. 你需要什么樣的隔離?

2. 基于數(shù)據(jù)的隔離方案

2.1 中大型系統(tǒng)之間隔離

2.2 系統(tǒng)內(nèi)不同負(fù)載隔離

3. 基于流控的的隔離方案

3.1 數(shù)據(jù)庫用戶隔離

3.2 SQL 語句級別隔離

3.3 后臺任務(wù)級別隔離

4. 總結(jié)

打開網(wǎng)易新聞 查看精彩圖片

時至今日,TiDB 提供的隔離能力愈發(fā)完善,上到不同系統(tǒng)、下到 SQL 語句,均能實現(xiàn)良好的隔離效果。本文旨在幫助大家了解:你需要什么層面的資源隔離,以及各種層面隔離如何使用。

打開網(wǎng)易新聞 查看精彩圖片
打開網(wǎng)易新聞 查看精彩圖片

2.1 中大型系統(tǒng)之間隔離

在提及資源隔離時,大家往往想到的是:多個系統(tǒng)共用一套集群,如何限制每個系統(tǒng)所用的資源。在之前版本中,TiDB 提供了基于 K8s的 Cloud TiDB 方案,但企業(yè) DBA 很少同時具備 K8s和數(shù)據(jù)庫兩種技能;另外企業(yè)中 K8S 大部分也非原生,不一定滿足 Cloud TiDB 的部署需求。

從 6.5 版本開始,TiDB 提供了 Placement Rules in SQL 功能,一種基于 SQL 規(guī)則的數(shù)據(jù)放置策略,可以輕松實現(xiàn)數(shù)據(jù)級別的物理隔離,使得多個系統(tǒng)共用一套 TiDB 集群時,滿足物理層面隔離的需求。

2.1.1 典型場景:多系統(tǒng)共用集群并完全獨占資源

打開網(wǎng)易新聞 查看精彩圖片

典型客戶案例:TiDB x 云盛海宏丨加速精細(xì)化運營,云海零售系統(tǒng)的架構(gòu)演進(jìn)

示例:Placement Rules in SQL 規(guī)則(適合中大型系統(tǒng))

createplacementpolicypolicy_orderconstraints="[+zone=order]";
createplacementpolicypolicy_invconstraints="[+zone=inventory]";
alterdatabaseretail_orderplacementpolicypolicy_order;
alterdatabaseretail_inventoryplacementpolicypolicy_inv;

2.1.2 典型場景:每個系統(tǒng)僅獨占一個實例、單點故障時共享

打開網(wǎng)易新聞 查看精彩圖片

典型客戶案例:某領(lǐng)先零售企業(yè) TiDB 生產(chǎn)集群架構(gòu)

示例:Placement Rules in SQL 規(guī)則(適合中型系統(tǒng))

createplacementpolicypolicy_server1leader_constraints="[+host=host1]";
createplacementpolicypolicy_server2leader_constraints="[+host=host2]";
createplacementpolicypolicy_server3leader_constraints="[+host=host3]";
alterdatabaseDB1placementpolicypolicy_server1;
alterdatabaseDB2placementpolicypolicy_server2;
alterdatabaseDB3placementpolicypolicy_server3;

2.2 系統(tǒng)內(nèi)不同負(fù)載隔離

以上是多個系統(tǒng)之間的隔離,在一個業(yè)務(wù)系統(tǒng)內(nèi),同樣也會有基于負(fù)載的隔離需求(如 OLTP 和 ETL/報表兩種負(fù)載);也就是過去常提及的讀寫分離,在一套數(shù)據(jù)庫內(nèi),實現(xiàn)兩種負(fù)載的隔離。

在使用 TiDB 時,由于一套集群已經(jīng)由多臺服務(wù)器組成,如再建設(shè)一套配置相同的備集群來實現(xiàn),此時成本相對是比較高的。從 6.5 版本開始,也可以輕松使用 Placement Rule/Placement Rules in SQL + Follower 副本讀取策略來實現(xiàn),同時與傳統(tǒng)主備/主從讀寫分離相比:TiDB 的只讀區(qū)域(含 TiKV/TiFlash)可提供與聯(lián)機完全一致的查詢能力。

2.2.1 典型場景:聯(lián)機事務(wù)處理+ETL|BI 隔離

打開網(wǎng)易新聞 查看精彩圖片

典型客戶案例:HTAP 還可以這么玩?丨TiDB 在 IoT 智慧園區(qū)的應(yīng)用

示例:

  • Placement Rules in SQL 規(guī)則(針對業(yè)務(wù)數(shù)據(jù),Leader 分布在前兩臺 TiKV);

createplacementpolicypolicy_eyasleader_constraints="[-zone=zone3]";
alterdatabaseeyasplacementpolicypolicy_eyas;

  • Placement Rules in SQL 規(guī)則(針對運營數(shù)據(jù),Leader 分布在第三臺 TiKV);

createplacementpolicypolicy_bileader_constraints="[+zone=zone3]"follower_constraints='{"+zone=zone1":1,"+zone=zone2":1}';
alterdatabasebi_eyasplacementpolicypolicy_bi;
alterdatabaseda_pingplacementpolicypolicy_bi;
alterdatabaseeyasbiplacementpolicypolicy_bi;

  • 業(yè)務(wù)庫+運營庫均增加列存副本;
  • TiDB 設(shè)置就近讀。

setglobaltidb_replica_read='closest-replicas';

2.2.2 典型場景:聯(lián)機事務(wù)處理+復(fù)雜查詢隔離

打開網(wǎng)易新聞 查看精彩圖片

典型案例:2 機房雙活+1 機房就近只讀

注:zone 是 tikv 中一個 label 的定義,可以代表一個真實的機房,也可以單機房集群中設(shè)計一個 zone

示例:

  • Placement Rule 規(guī)則(設(shè)置全局 Leader 和 Follower 分布策略),機房 q03 不分布任何 Leader,同時 q03 機房進(jìn)行本地讀?。?/li>

[
{
"group_id":"pd",
"id":"q01",
"start_key":"",
"end_}
]

setglobal

打開網(wǎng)易新聞 查看精彩圖片

基于數(shù)據(jù)隔離的方案雖然能夠有效地實現(xiàn) CPU、內(nèi)存、磁盤等資源的物理隔離,但也存在一定的靈活性問題:

為了解決以上不足,TiDB 自 7.1 版本起引入了基于流控的隔離方案 - Resource Control,目的是簡化分布式架構(gòu)中資源管理的復(fù)雜度:

總的來說,Resource Control 是一種更靈活高效的資源管理方式,不僅能夠?qū)崿F(xiàn)多系統(tǒng)、多負(fù)載的隔離,還可以進(jìn)行 SQL 語句和后臺任務(wù)層面更精細(xì)化的控制。

3.1 數(shù)據(jù)庫用戶隔離

3.1.1 典型場景 - 小型系統(tǒng)整合

在我過去的經(jīng)歷中,我發(fā)現(xiàn)小型數(shù)據(jù)庫系統(tǒng)普遍存在資源利用率較低的情況。實際上,我們在申請數(shù)據(jù)庫資源時,往往基于直覺或者標(biāo)準(zhǔn)化配置來選擇資源,背后可能并沒有一個明確的依據(jù)。另外,多個系統(tǒng)通常負(fù)載峰值時間各不相同,在使用傳統(tǒng)方案時也只能根據(jù)最大峰值+冗余的方式來申請資源,不可避免會出現(xiàn)較多資源閑置。

TiDB 的 Resource Control 方案,使得我們能夠在較小的配置下實現(xiàn)更高效的資源利用率。將多個小型數(shù)據(jù)庫系統(tǒng)整合到 TiDB 后,每個系統(tǒng)的資源分配可以根據(jù)其實際負(fù)載峰值、QPS 等需求進(jìn)行精細(xì)化管理;如果在這些系統(tǒng)中存在一個消耗資源較高的系統(tǒng),還可考慮分配單獨的 TiDB 計算實例供其使用。

打開網(wǎng)易新聞 查看精彩圖片

典型客戶案例:TiDB 7.1 多租戶在中泰證券中的應(yīng)用

3.1.2 典型場景 - SaaS 場景

打開網(wǎng)易新聞 查看精彩圖片

在以上第三種多租戶架構(gòu)中,多個租戶共用一個庫、同時共用一套表,表內(nèi)通過分區(qū)來存儲不同 SaaS 租戶的數(shù)據(jù),或直接使用單表(通過表內(nèi)的 tenant_id 字段來區(qū)分),此時 TiDB Resource Control 可以輕松通過數(shù)據(jù)庫用戶來為不同租戶進(jìn)行資源控制。

而面對 SaaS 動輒數(shù)千個租戶的需求,TiDB Resource Control 是極其有幫助的,無需劃分 CPU/內(nèi)存/節(jié)點數(shù)量,可創(chuàng)建數(shù)據(jù)庫用戶級別的資源組,輕松管理不同租戶的資源需求和彈性需求:

打開網(wǎng)易新聞 查看精彩圖片

示例:

  • 假設(shè)租戶 1 是體量非常大,可為其單獨創(chuàng)建數(shù)據(jù)庫用戶 user1,并為該用戶創(chuàng)建獨立資源組,優(yōu)先級高,且允許超用;

CREATERESOURCEGROUPrg_tenant1RU_PER_SEC=1000000PRIORITY=HIGHBURSTABLE;
alteruser'user1'RESOURCEGROUPrg_tenant1;

  • 其他租戶由于體量較小,共用一個資源池;

CREATERESOURCEGROUPrg_tenant_defaultRU_PER_SEC=500000PRIORITY=MEDIUM;
alteruser'user_default'RESOURCEGROUPrg_tenant_default;

  • 擴容。

ALTERRESOURCEGROUPrg_tenant_defaultRU_PER_SEC=900000PRIORITY=MEDIUM;

3.1.3 典型場景 - 系統(tǒng)內(nèi)批量負(fù)載隔離

典型客戶案例:MySQL 到 TiDB 遷移實踐:云盛海宏零售業(yè)海量場景下 ToC 系統(tǒng)的選型思考與經(jīng)驗分享

在一個系統(tǒng)中往往會存在聯(lián)機和批量兩種負(fù)載,如聯(lián)機的峰值在白天,到凌晨基本上是業(yè)務(wù)低峰期,此時可以安全的運行系統(tǒng)內(nèi)的大型批量作業(yè),進(jìn)行大規(guī)模、高密度的讀寫,以盡快完成批量作業(yè),進(jìn)而不影響白天的聯(lián)機業(yè)務(wù)。

但有些情況下,批量可能會跑到第二天業(yè)務(wù)高峰期,此時停止這個批量顯然是不太合適的,但放任它繼續(xù)消耗大量資源執(zhí)行,顯然也是不合適的。

在過去其實缺乏一些庫內(nèi)的管控手段的,只能在調(diào)度層、應(yīng)用層進(jìn)行有限控制。而 TiDB Resource Control 也可以輕松管理這種情況。

示例:為批量作業(yè)單獨創(chuàng)建用戶,并綁定資源組:

CREATEUSER'USER_BATCH'IDENTIFIEDBY'******';
CREATERESOURCEGROUPrg_batchRU_PER_SEC=UNLIMITEDPRIORITY=HIGH;
alteruser'USER_BATCH'RESOURCEGROUPrg_batch;
--假設(shè)批量任務(wù)超時運行到第二天白天,只需執(zhí)行如下SQL即可立即將其限速
ALTERRESOURCEGROUPrg_batchRU_PER_SEC=100000PRIORITY=LOW;

3.2 SQL 語句級別隔離

自 7.2 版本以來,TiDB Resource Control 引入了對 Runaway Queries(即執(zhí)行時間或消耗資源超出預(yù)期的查詢)的管理功能:

  • QUERY_WATCH(手動處理):對發(fā)現(xiàn)的 SQL 進(jìn)行限流或熔斷
  • QUERY_LIMIT(自動處理):當(dāng)不符合預(yù)期的 SQL 出現(xiàn)時,數(shù)據(jù)庫可自己識別、并自適應(yīng)處理

3.2.1 典型場景 - SQL 限流與熔斷(QUERY_WATCH)

有一些 SQL 語句可能存在這種情況:編寫不規(guī)范或需要查詢大量數(shù)據(jù)(如抽數(shù)),它們在運行時可能會消耗大量的資源,我們希望它們跑慢一點沒關(guān)系,但不要消耗太多資源影響正常業(yè)務(wù)請求。在 TiDB 中,可以輕松通過 Resource Control 來對它們進(jìn)行限流:

--該SQL執(zhí)行時,單獨使用rg1資源組執(zhí)行(rg1是一個100RU的資源)
SELECT/*+RESOURCE_GROUP(rg1)*/*FROMtwhereis_delete=0andcreate_time>='2023-01-01';
--將default資源組中的這條SQL進(jìn)行降低優(yōu)先級,讓其限速執(zhí)行
QUERYWATCHADDRESOURCEGROUPDEFAULTACTIONCOOLDOWNSQLTEXTEXACTTO'select*FROMtwhereis_delete=0andcreate_time>='2023-01-01';

另外也可能存在一種情況,系統(tǒng)內(nèi)突然出現(xiàn)一條之前從未運行過的大 SQL,它來歷不明,我希望先直接將其熔斷,不讓其執(zhí)行:

--根據(jù)SQLDIGEST維度進(jìn)行攔截,并終止
QUERYWATCHADDRESOURCEGROUPdefaultACTIONKILLSQLDIGEST'd08bc323a934c39dc41948b0a073725be3398479b6fa4f6dd1db2a9b115f7f57';
--另外還可以使用SQLTEXT維度(可單獨攔截某一特定條件值的SQL)
--以及PLANDIGEST維度(可攔截SQL中某一很差的計劃出現(xiàn))

3.2.2 典型場景 - 超出預(yù)期的查詢自適應(yīng)管理(QUERY_LIMIT)

基于 QUERY_WATCH 的限流和熔斷方案,屬于事中或事后的人工處理手段。從問題的出現(xiàn)、發(fā)現(xiàn)到最終解決,這一過程往往需要一定的時間;即便是經(jīng)驗豐富、對系統(tǒng)非常熟悉的管理員,在解決完問題時,往往已經(jīng)過去了數(shù)分鐘,甚至更長時間。這意味著,業(yè)務(wù)可能受的影響時間也會與之相關(guān)。

而 QUERY_LIMIT 則提供了更加靈活的自適應(yīng)處理手段,讓數(shù)據(jù)庫可以自動發(fā)現(xiàn)異常并處理異常,我們只需要定義異常即可:

示例:

  • 創(chuàng)建 rg_auto_cooldown 資源組,限額是 100000 RU,我們可以定義該資源組中執(zhí)行時間超過 60 秒的查詢?yōu)?Runaway Query,并讓系統(tǒng)自動對 Runaway Query 進(jìn)行降低優(yōu)先級限流處理;

CREATERESOURCEGROUPrg_auto_cooldownRU_PER_SEC=100000QUERY_LIMIT=(EXEC_ELAPSED='60s',ACTION=COOLDOWN);

  • 創(chuàng)建 rg_over_10000資源組,限額是 100000 RU,我們可以定義該資源組中每秒超過 10000 RU 的查詢?yōu)?Runaway Query,并讓系統(tǒng)自動對他們進(jìn)行降低優(yōu)先級限流處理;

CREATERESOURCEGROUPrg_colldownRU_PER_SEC=100000QUERY_LIMIT=(RU=10000,ACTION=COOLDOWN);

  • 還可以在當(dāng)前資源組,將大型查詢隔離到其他資源組執(zhí)行:定義 default資源組中處理數(shù)據(jù)行數(shù)超過 1000000 的查詢?yōu)?Runaway Query,并讓系統(tǒng)自動將他放到 rg_bigquery資源組中執(zhí)行,避免與當(dāng)前資源組中的請求發(fā)生爭用。

CREATERESOURCEGROUPrg_bigqueryRU_PER_SEC=10000PRIORITY=LOW;
--假設(shè)我當(dāng)前資源組為default
ALTERRESOURCEGROUPdefaultQUERY_LIMIT=(PROCESSED_KEYS=1000000,ACTION=SWITCH_GROUP(rg_bigquery));

3.3 后臺任務(wù)級別隔離

在日常運維過程中創(chuàng)建索引是一個常見的工作,雖然在 TiDB 中所有 DDL 均是在線的,但我們也不能忽視創(chuàng)建索引時資源消耗帶來的風(fēng)險。自 7.4 版本開始,TiDB Resource Control 引入了對后臺任務(wù)的管理。

示例:

以創(chuàng)建索引這一 DDL 任務(wù)為例,可以設(shè)置 ddl 為后臺任務(wù),并且限制其最多可使用 TiKV 節(jié)點總資源的 30%。此時系統(tǒng)便會動態(tài)地限制該任務(wù)的資源使用,以盡量避免此類任務(wù)在執(zhí)行時對其他前臺任務(wù)的性能產(chǎn)生影響:

ALTERRESOURCEGROUP`default`BACKGROUND=(TASK_TYPES='ddl',UTILIZATION_LIMIT=30);

目前 TiDB 支持如下幾種后臺任務(wù)的類型:lightning、br、ddl、stats 等。

打開網(wǎng)易新聞 查看精彩圖片

通過本文的學(xué)習(xí),相信大家對 TiDB 的資源隔離能力有了更全面的理解;大家可以根據(jù)不同的場景需求,選擇合適的資源隔離方案。

打開網(wǎng)易新聞 查看精彩圖片

如果您有新的資源隔離需求或場景,歡迎與我們聯(lián)系。