摘要:阿里云分布式關(guān)系型數(shù)據(jù)庫服務(wù),于月號發(fā)布了版本,這是一個年度大更新。無需額外付費或者開通,不依賴第三方組件,即可執(zhí)行分布式事務(wù)。確保分布式執(zhí)行代價的最小化。柔性事務(wù)提供的最終一致方式執(zhí)行的分布式事務(wù)稱為柔性事務(wù)。
摘要: DRDS (阿里云分布式關(guān)系型數(shù)據(jù)庫服務(wù),https://www.aliyun.com/produc...)于 4 月 30 號發(fā)布了 5.3 版本,年度更新,具備眾多新特性,歡迎品鑒。
DRDS (阿里云分布式關(guān)系型數(shù)據(jù)庫服務(wù),https://www.aliyun.com/produc...)于 4 月 30 號發(fā)布了 5.3 版本,這是一個年度大更新。主要帶來了以下特性:
性能提升。在大多數(shù)場景下(拆分鍵上的等值查詢、讀寫分離等),同規(guī)格的吞吐量(最大 QPS)可以提升到之前的300%。
原生分布式事務(wù)。無需額外付費或者開通,不依賴第三方組件,即可執(zhí)行分布式事務(wù)。提供柔性事務(wù)與 XA 兩種實現(xiàn)。
Outline。在無需改動程序的情況下,即可通過創(chuàng)建 Outline 的形式改變 SQL 的執(zhí)行計劃,例如指定索引、指定走主庫或者備庫等。
明確的 SQL 邊界文檔。在 SQL 邊界內(nèi),進行了大量的隨機測試,確保功能的穩(wěn)定可靠。
更強大的分布式查詢優(yōu)化器。確保分布式 SQL 執(zhí)行代價的最小化。
簡潔易讀的執(zhí)行計劃。提供一種新的執(zhí)行計劃顯示格式,可以非常方便的看出 SQL 的執(zhí)行策略。
性能
DRDS 5.3,使用了 Plan Cache、協(xié)程、FastSQL 等技術(shù),大幅提升了吞吐量,在同規(guī)格下,最大 QPS 提升到了之前的 300%。
例如,對于之前的版本,8C16G 的 DRDS 最大可以提供 2W/s 的 QPS;對于 DRDS 5.3,8C16G 的 DRDS 最大可以提供 6W+/s 的 QPS。
測試場景:
1.實例規(guī)格為入門版 8C16G
2.測試工具為 sysbench
3.后端 RDS 不存在瓶頸
4.測試 SQL:單表拆分鍵上的等值查詢
SELECT * FROM t1 WHERE partition_key=?
5.持續(xù)加大并發(fā),直至 DRDS CPU 接近 100%,并且 rt 在5ms左右
Plan Cache
DRDS 5.3 中,引入了 Plan Cache,大幅降低了 SQL 解析與查詢優(yōu)化的代價。DRDS 5.3 中,針對不同類型的 SQL,分成了多級 Plan Cache,其中,性能最高的是命中了一級 Plan Cache 的 SQL。無論參數(shù)取值如何,一定可以被下推到單分片執(zhí)行的 SQL 會命中一級 Plan Cache,常見的形式有以下幾種:
1.單表拆分鍵上的等值查詢,例如:
SELECT * FROM t1 WHERE partition_key=?
2.拆分鍵上的等值 JOIN 查詢,并且至少其中一個表帶了拆分鍵上的等值條件,例如:
SELECT * FROM t1 JOIN t2 ON t1.partition_key = t2.partition_key WHERE t1.partition_key=?
3.拆分鍵上的等值關(guān)聯(lián)子查詢,并且其中內(nèi)表或者外表帶了拆分鍵上的等值條件,例如:
SELECT * FROM t1 WHERE EXSITS (SELECT 1 FROM t2 WHERE t1.partition_key = t2.partition_key) AND t1.partition_key=?
在應(yīng)用中,更多的使用能夠命中一級 Plan Cache 的 SQL,能更高的提升系統(tǒng)容量。
協(xié)程
DRDS 5.3 使用了 AliJDK 的 Wisp 協(xié)程。在業(yè)務(wù)邏輯相同的情況下,使用協(xié)程模型與使用線程模型相比,系統(tǒng)容量提升了 30% 左右。
更快的 Parser:FastSQL
DRDS 5.3 中的 Parser 部分,換成了從 Druid(https://github.com/alibaba/druid)剝離出來的 FastSQL。相對于老的 Parser,F(xiàn)astSQL 在 SQL 解析方面,比 antlr、javacc 等自動生成的 Parser 快了數(shù)十倍至數(shù)百倍,相對 DRDS 老版本的 Parser 帶來了一倍的性能提升。FastSQL 近期會開源。
原生分布式事務(wù)
DRDS 5.3 提供原生的分布式事務(wù)功能,有以下特點:
提供 柔性事務(wù) 與 XA 事務(wù) 兩種事務(wù)方案供用戶在不同的場景下進行選擇。
不依賴任何第三方組件,能力集成在 DRDS Server 中,專有云無需額外資源進行部署。
無熱點情況下性能線性可擴,無單點瓶頸。
無需額外開通,公有云上購買的實例即可立即使用,不產(chǎn)生額外費用。
DRDS 5.3 提供柔性事務(wù)和 XA 事務(wù)兩種方案,一般情況下,當 DRDS 后端的 MySQL 為 5.7 及以上版本時,推薦使用 XA 事務(wù)。
柔性事務(wù)
DRDS 5.3 提供的最終一致方式執(zhí)行的分布式事務(wù)稱為柔性事務(wù)(Flexible Transactions)。
柔性事務(wù)放棄了隔離性,減小了事務(wù)中鎖的粒度,使得應(yīng)用能夠更好的利用數(shù)據(jù)庫的并發(fā)性能,實現(xiàn)吞吐量的線性擴展。異步執(zhí)行方式可以更好的適應(yīng)分布式環(huán)境,在網(wǎng)絡(luò)抖動、節(jié)點故障的情況下能夠盡量保障服務(wù)的可用性(Availability)。
DRDS 5.3 中開啟柔性事務(wù)只需要一行代碼:
SET drds_transaction_policy = "flexible"; SHOW VARIABLES LIKE "drds_transaction_policy"; +-------------------------+----------+ | VARIABLE_NAME | VALUE | +-------------------------+----------+ | drds_transaction_policy | FLEXIBLE | +-------------------------+----------+ 1 row in set (0.07 sec)
除此之外,DRDS 柔性事務(wù)的使用方法和普通事務(wù)完全相同:應(yīng)用首先用 SET autocommit = 0 和 SET drds_transaction_policy = "flexible" 開啟柔性事務(wù);然后在同一個會話中執(zhí)行事務(wù)的 SQL 語句 —— 最后當應(yīng)用發(fā)起 commit 或 rollback 后,DRDS 將保證這些 SQL 語句執(zhí)行的原子性:全部成功,或者全部失敗。
XA 事務(wù)
DRDS 5.3 也支持 XA 事務(wù),在柔性事務(wù)的基礎(chǔ)上提供了強一致能力。由于 MySQL XA 實現(xiàn)機制的限制,我們要求只有在 DRDS 后端是 MySQL 5.7 版本以上才啟用 XA 事務(wù)功能。
SET drds_transaction_policy = "XA"; SHOW VARIABLES LIKE "drds_transaction_policy"; +-------------------------+-------+ | VARIABLE_NAME | VALUE | +-------------------------+-------+ | drds_transaction_policy | XA | +-------------------------+-------+ 1 row in set (0.07 sec)
DRDS XA 事務(wù)使用兩階段提交協(xié)議(XA Protocol)保護子事務(wù)的提交與回滾,消除了柔性事務(wù)的異步回滾問題。由于 XA Protocol 在提交與回滾階段始終加鎖,避免了事務(wù)結(jié)束前的臟讀和覆蓋,但是對性能有較大影響。
Outline
DRDS 5.3 提供 Outline 機制,允許用戶在不修改程序與 SQL 的情況下,對特定類型的 SQL 的行為進行定制。簡單說,Outline 可以將一個類型的源 SQL 在執(zhí)行時動態(tài)的替換成另一個目標 SQL,目標 SQL 中可以帶一些 HINT。
一些典型的應(yīng)用場景:
使用 SLAVE HINT 將特定的SQL路由到只讀實例執(zhí)行:
CREATE OUTLINE O1 ON SELECT * FROM T1 WHERE ID=? TO SELECT /*+TDDL:SLAVE()*/ * FROM T1 WHERE ID=?
使用 MySQL 原生的 FORCE INDEX 為特定的 SQL 指定需要選擇的索引:
CREATE OUTLINE O2 ON SELECT * FROM T1 WHERE ID=? TO SELECT * FROM T1 FORCE INDEX(index_xxx) WHERE ID=?
使用 DRDS 的 HINT 將特定的 SQL 路由到指定分片上執(zhí)行:
CREATE OUTLINE O3 ON SELECT * FROM T1 WHERE ID=? TO SELECT /*+TDDL:node("0")*/ * FROM T1 WHERE ID=?
DRDS 中的 Outline,可以對參數(shù)化的 SQL 進行匹配,也可以對特定參數(shù)的 SQL 進行匹配。例如,對于 SQL:
SELECT * FROM T1 WHERE ID=?
當 ID 取 1 時,需求到只讀實例執(zhí)行;當 ID 取其他值時,需求到主實例執(zhí)行,則可以創(chuàng)建以下兩個 Outline:
CREATE OUTLINE O1 ON SELECT * FROM T1 WHERE ID=1 TO SELECT /*+TDDL:SLAVE()*/ * FROM T1 WHERE ID=1; CREATE OUTLINE O2 ON SELECT * FROM T1 WHERE ID=? TO SELECT /*+TDDL:MASTER()*/ * FROM T1 WHERE ID=?;
DRDS 會優(yōu)先匹配帶具體參數(shù)的 Outline。
DRDS Outline 的詳細說明:https://help.aliyun.com/docum...
DRDS Hint 說明:https://help.aliyun.com/docum...
SQL 支持
SQL 兼容性方面,DRDS 5.3 最大的特點在于明確了 SQL 的邊界,也即能夠明確的說明哪些 SQL 支持、哪些 SQL 不支持。
DRDS 5.3 SQL 邊界文檔:https://help.aliyun.com/docum...。
一些重要的 SQL 類型:
子要查詢方面,支持 Correlated Subqueries(不要求關(guān)聯(lián)項一定是拆分鍵)、Derived Tables,暫不支持列子查詢。更多子查詢的支持范圍參考:https://help.aliyun.com/docum...。
支持分布式 JOIN(不要求一定要帶拆分鍵,不要求必須是拆分鍵上的 JOIN),暫不支持 STRAIGHT_JOIN 和 NATURAL JOIN。
支持大部分 MySQL 函數(shù),主要暫不支持的為:全文檢索函數(shù)、XML 函數(shù)、空間分析函數(shù)與 JSON 函數(shù)。
UPDATE/DELETE 語句僅支持單表操作,不支持 UPDATE/DELETE 中包含 JOIN 以及子查詢。
聚合函數(shù)支持 COUNT/SUM/MAX/MIN/AVG,GROUP BY 不要求FULL_GROUP_BY(https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sqlmode_only_full_group_by)。
支持邏輯 SQL 的 KILL 與 SHOW PROCESSLIST:https://help.aliyun.com/docum...。
支持 CREATE USER 創(chuàng)建更多用戶,并使用 GRANT 語句對用戶權(quán)限進行授權(quán):https://help.aliyun.com/docum...。
支持 PREPARE 協(xié)議、多語句與壓縮協(xié)議。
Optimizer 與執(zhí)行計劃
DRDS 5.3 中,提供了非常豐富的分布式 SQL 優(yōu)化策略,一些重要的例如:
對 Filter 的上拉、下壓、推導(dǎo)等優(yōu)化,確保 DRDS 可以準確的識別出 SQL 中可以下推的部分,這個能很大程度上提升 JOIN、子查詢的性能,避免應(yīng)該能下推卻無法下推帶來的性能損耗。
子查詢的 SEMI-JOIN 優(yōu)化。DRDS中,子查詢會被改寫為 SEMI-JOIN 進行優(yōu)化,從而使其能夠復(fù)用大量針對的 JOIN 的優(yōu)化策略,提升性能和功能穩(wěn)定性。
提供了一系列 Hint,允許調(diào)整執(zhí)行計劃的任意一個節(jié)點,結(jié)合 Outline 機制,達到不更改 SQL 也能對 SQL 進行性能優(yōu)化的目的。
針對不同的場景,對排序與 Limit 進行優(yōu)化,確保能將排序與 Limit 盡可能多的下推到存儲節(jié)點上,保證傳輸?shù)臄?shù)據(jù)量最小。
DRDS 5.3 設(shè)計了全新的執(zhí)行計劃顯示格式,相對老版本,具有以下特征:
收縮了分片的顯示,執(zhí)行計劃不會因為涉及多個分片而臃腫龐大。
執(zhí)行計劃中包含了完整的執(zhí)行策略,不存在二義性。
執(zhí)行計劃使用了標準的算子的語義,易于將標準的數(shù)據(jù)庫知識應(yīng)用到 DRDS 的查詢優(yōu)化中。
執(zhí)行計劃中將同時包含分布式執(zhí)行計劃以及存儲分片上的執(zhí)行計劃(此特性 6 月份上線)。
提供 Optimizer Tracing 功能,能一步一步的展示出執(zhí)行計劃的優(yōu)化過程,方便進行 SQL 調(diào)優(yōu)。
通過執(zhí)行計劃可以清晰的判斷出:
SQL 需要在哪些分片上執(zhí)行,是否跨分片
JOIN、子查詢、聚合、排序等操作是否能夠下推
JOIN、排序等所使用的算法是什么
例如,針對以下 SQL 的執(zhí)行計劃:
mysql> explain SELECT count(*), name FROM drds GROUP BY name ORDER BY count(*); +-----------------------------------------------------------------------------------------------------------------------------------------------------------+ | LOGICAL PLAN | +-----------------------------------------------------------------------------------------------------------------------------------------------------------+ | Project(count(*)="count(*)", name="name") | | MemSort(sort="count(*) ASC") | | Aggregate(group="name", count(*)="SUM(count(*))") | | MergeSort(sort="name ASC") | | LogicalView(tables="[00-03].drds", shardCount=4, sql="SELECT `name`, COUNT(*) AS `count(*)` FROM `drds` GROUP BY `name` ORDER BY `name`") | +-----------------------------------------------------------------------------------------------------------------------------------------------------------+ 5 rows in set (0.13 sec)
從此執(zhí)行計劃中,我們可以獲得以下信息:
需要在 00-03 供 4 個分片上執(zhí)行物理 SQL (LogicalView 算子):SELECT name, COUNT() AS count() FROM drds GROUP BY name ORDER BY name。
Group By 操作基于排序?qū)崿F(xiàn),需要對 name 進行排序。由于每個分片上已經(jīng)完成了 Order By 操作,因此分布式層需要對各個分片的數(shù)據(jù)做歸并排序(MergeSort 算子)。
每個分組內(nèi),對 COUNT() 的結(jié)果做 SUM 操作,以匯總每個分片 COUNT() 的結(jié)果(Aggregate 算子)。
使用內(nèi)存排序,對 Aggregate 節(jié)點輸出的 count(*) 進行排序(MemSort 算子)。
最終結(jié)果集輸出的是 count(*) 與 name 兩列(Project 算子)。
更多關(guān)于 DRDS 5.3 執(zhí)行計劃的介紹,請關(guān)注后續(xù)的文章。
What"s NEXT
6 月底,DRDS 將發(fā)布 5.3.2,將會提供以下特性:
帶計算能力的 DRDS 只讀實例??梢灾苯釉赗DS主實例或者只讀實例上,進行最高可提供 READ COMMITTED 級別的復(fù)雜 SQL(例如千萬級的表的 JOIN 等)執(zhí)行能力,并且隨規(guī)格的提升,響應(yīng)時間能進行近線性的擴展。
回收站,可對 DROP TABLE 操作進行閃回,方便在誤刪表的場景下快速對數(shù)據(jù)進行恢復(fù)。
基于事務(wù)的廣播表寫入。廣播表將不再依賴任何第三方組件,可自行創(chuàng)建使用。
跨實例、機房、單元依然能保證全局唯一的主鍵服務(wù)。
原文鏈接
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/17757.html
摘要:近日,阿里云正式對外發(fā)布了全新一代自研關(guān)系型數(shù)據(jù)庫。而他認為,在未來年內(nèi),沒有自研數(shù)據(jù)庫的云計算廠商將會被逐漸淘汰出局。 近日,阿里云正式對外發(fā)布了全新一代自研關(guān)系型數(shù)據(jù)庫POLARDB。值得注意的是,POLARDB并不是基于開源數(shù)據(jù)庫MySQL之上研發(fā)的分支,而且基于第三代分布式共享存儲架構(gòu),創(chuàng)新實現(xiàn)企業(yè)級...
摘要:近日,阿里云正式對外發(fā)布了全新一代自研關(guān)系型數(shù)據(jù)庫。而他認為,在未來年內(nèi),沒有自研數(shù)據(jù)庫的云計算廠商將會被逐漸淘汰出局。 近日,阿里云正式對外發(fā)布了全新一代自研關(guān)系型數(shù)據(jù)庫POLARDB。值得注意的是,POLARDB并不是基于開源數(shù)據(jù)庫MySQL之上研發(fā)的分支,而且基于第三代分布式共享存儲架構(gòu),創(chuàng)新實現(xiàn)企業(yè)級OLTP與OLAP一體化數(shù)據(jù)庫系統(tǒng)整體設(shè)計。這意味著,在行業(yè)還在使用第一代,第二代架...
閱讀 3271·2021-09-23 11:55
閱讀 2614·2021-09-13 10:33
閱讀 1670·2019-08-30 15:54
閱讀 3099·2019-08-30 15:54
閱讀 2367·2019-08-30 10:59
閱讀 2374·2019-08-29 17:08
閱讀 1807·2019-08-29 13:16
閱讀 3590·2019-08-26 12:25