通過(guò) Placement Rules In SQL 能力,設(shè)置放置策略將區(qū)域數(shù)據(jù)的所有副本指定到特定區(qū)域的特定機(jī)房?jī)?nèi),所有的數(shù)據(jù)存儲(chǔ),管理在本地區(qū)內(nèi)完成,減少了數(shù)據(jù)跨地區(qū)復(fù)制延遲,降低流量成本。需要做的僅僅是,為不同數(shù)據(jù)中心的節(jié)點(diǎn)打上標(biāo)簽,并創(chuàng)建對(duì)應(yīng)的放置規(guī)則:
CREATE PLACEMENT POLICY 'east_cn' CONSTRAINTS = "[+region=east_cn]";
CREATE PLACEMENT POLICY 'north_cn' CONSTRAINTS = "[+region=north_cn]";
并通過(guò) SQL 語(yǔ)句控制數(shù)據(jù)的放置,這里以不同城市分區(qū)為例:
ALTER TABLE orders PARTITION p_hangzhou PLACEMENT POLICY = 'east_cn';
ALTER TABLE orders PARTITION p_beijing PLACEMENT POLICY = 'north_cn';
這樣,歸屬不同城市的訂單數(shù)據(jù)副本將會(huì)被「固定」在對(duì)應(yīng)的數(shù)據(jù)中心。
業(yè)務(wù)隔離
假設(shè)一個(gè)人負(fù)責(zé)大型互聯(lián)網(wǎng)企業(yè)的數(shù)據(jù)平臺(tái),內(nèi)部業(yè)務(wù)有 2000 多種,相關(guān)業(yè)務(wù)采用一套或多套 MySQL 來(lái)管理,但是因?yàn)闃I(yè)務(wù)數(shù)量太多,MySQL 實(shí)例數(shù)接近 1000 個(gè),日常的監(jiān)控、診斷、版本升級(jí)、安全防護(hù)等工作對(duì)運(yùn)維團(tuán)隊(duì)造成了巨大的壓力,且隨著業(yè)務(wù)規(guī)模越來(lái)越大,運(yùn)維成本逐年上升。他希望通過(guò)減少數(shù)據(jù)庫(kù)實(shí)例數(shù)量來(lái)減少運(yùn)維管理成本,但是業(yè)務(wù)間的數(shù)據(jù)隔離、訪問(wèn)安全、數(shù)據(jù)調(diào)度的靈活性和管理成本成為面臨的嚴(yán)峻挑戰(zhàn)。
借助 TiDB 6.0,通過(guò)數(shù)據(jù)放置規(guī)則的配置,可以很容易靈活的集群共享規(guī)則,例如業(yè)務(wù) A,B 共享資源,降低存儲(chǔ)和管理成本,而業(yè)務(wù) C 和 D 獨(dú)占資源,提供最高的隔離性。由于多個(gè)業(yè)務(wù)共享一套 TiDB 集群,升級(jí)、打補(bǔ)丁、備份計(jì)劃、擴(kuò)縮容等日常運(yùn)維管理頻率可以大幅縮減,降低管理負(fù)擔(dān)提升效率。
CREATE PLACEMENT POLICY 'shared_nodes' CONSTRAINTS = "[+region=shared_nodes]";
CREATE PLACEMENT POLICY 'business_c' CONSTRAINTS = "[+region=business_c]";
CREATE PLACEMENT POLICY 'business_d' CONSTRAINTS = "[+region=business_d]";
ALTER DATABASE a POLICY=shared_nodes;
ALTER DATABASE b POLICY=shared_nodes;
ALTER DATABASE c POLICY=business_c;
ALTER DATABASE d POLICY=business_d;
基于 SQL 接口的數(shù)據(jù)放置規(guī)則,僅僅使用少數(shù) TiDB 集群管理大量的 MySQL 實(shí)例,不同業(yè)務(wù)的數(shù)據(jù)放置到不同的 DB,并通過(guò)放置規(guī)則管理將不同 DB 下的數(shù)據(jù)調(diào)度到不同的硬件節(jié)點(diǎn)上,實(shí)現(xiàn)業(yè)務(wù)間數(shù)據(jù)的物理資源隔離,避免因資源爭(zhēng)搶?zhuān)布收系葐?wèn)題造成的相互干擾。通過(guò)賬號(hào)權(quán)限管理避免跨業(yè)務(wù)數(shù)據(jù)訪問(wèn),提升數(shù)據(jù)質(zhì)量和數(shù)據(jù)安全。在這種部署方式下,集群數(shù)量大大減小,原本的升級(jí),監(jiān)控告警設(shè)置等日常運(yùn)維工作將大幅縮減,在資源隔離和性價(jià)比上達(dá)到平衡,大幅減少日常的 DBA 運(yùn)維管理成本。
主從多機(jī)房 + 低延遲讀取
一個(gè)互聯(lián)網(wǎng)架構(gòu)師,希望通過(guò) TiDB 構(gòu)建本地多數(shù)據(jù)中心架構(gòu)。通過(guò)數(shù)據(jù)放置規(guī)則管理,得以將 Follower 副本調(diào)度到備中心,實(shí)現(xiàn)同城高可用。
CREATE PLACEMENT POLICY eastnwest PRIMARY_REGION="us-east-1" REGIONS="us-east-1,us-east-2,us-west-1" SCHEDULE="MAJORITY_IN_PRIMARY" FOLLOWERS=4;
CREATE TABLE orders (order_id BIGINT PRIMARY KEY, cust_id BIGINT, prod_id BIGINT) PLACEMENT POLICY=eastnwest;
與此同時(shí),讓對(duì)于一致性和新鮮度不高的歷史查詢通過(guò)基于時(shí)間戳的方式讀?。⊿tale Read),這樣避免了跨中心數(shù)據(jù)同步造成的訪問(wèn)延遲,同時(shí)也提高對(duì)從機(jī)房的硬件利用率。
SELECT * FROM orders WHERE order_id = 14325 AS OF TIMESTAMP '2022-03-01 16:45:26';
總結(jié)
TiDB 6.0 的 Placement Rules in SQL 是一個(gè)很有趣的功能:它暴露了以往用戶無(wú)法控制的內(nèi)部調(diào)度能力,并提供了方便的 SQL 接口。可以通過(guò)它對(duì)分區(qū) / 表 / 庫(kù)不同級(jí)別的數(shù)據(jù)進(jìn)行基于標(biāo)簽的自由放置,這開(kāi)啟了諸多以往不可能實(shí)現(xiàn)的場(chǎng)景。除了上述可能性,期望一起探索更多有趣的應(yīng)用。