日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

2017双11技术揭秘—TDDL/DRDS 的类 KV 查询优化实践

發(fā)布時(shí)間:2024/8/23 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2017双11技术揭秘—TDDL/DRDS 的类 KV 查询优化实践 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

摘要: 性能優(yōu)化是企業(yè)級(jí)應(yīng)用永恒的話題,關(guān)系型數(shù)據(jù)庫(kù)查詢優(yōu)化更是如此。在前臺(tái)核心業(yè)務(wù)場(chǎng)景中,類 KeyValue 查詢(以下簡(jiǎn)稱類 KV 查詢)是非常常見的,并且在應(yīng)用總 SQL 流量占比很高,如果僅在SQL層面進(jìn)行進(jìn)一步優(yōu)化會(huì)非常困難,因此針對(duì)這類場(chǎng)景,TDDL/DRDS 配合 AliSQL 提出了全新的解決方案。

作者:勵(lì)強(qiáng)(君瑜)

場(chǎng)景介紹
性能優(yōu)化是企業(yè)級(jí)應(yīng)用永恒的話題,關(guān)系型數(shù)據(jù)庫(kù)查詢優(yōu)化更是如此。在前臺(tái)核心業(yè)務(wù)場(chǎng)景中,類 KeyValue 查詢(以下簡(jiǎn)稱類 KV 查詢)是非常常見的(例如,SELECT id, name FROM users WHERE id=1002),并且在應(yīng)用總 SQL 流量占比很高,例如,天貓某核心業(yè)務(wù)的類 KV 查詢占比近90%,商品某系統(tǒng)中占比近80%,交易訂單系統(tǒng)中占比也有50%左右,菜鳥等其他核心業(yè)務(wù)場(chǎng)景中這個(gè)現(xiàn)象也是相當(dāng)普遍。

這類 SQL 已經(jīng)非常簡(jiǎn)單,如果僅在SQL層面進(jìn)行進(jìn)一步優(yōu)化會(huì)非常困難,因此針對(duì)這類場(chǎng)景,TDDL/DRDS 配合 AliSQL 提出了全新的解決方案。

產(chǎn)品簡(jiǎn)介
在進(jìn)入正題前,簡(jiǎn)單介紹下 TDDL/DRDS 產(chǎn)品,TDDL 是阿里巴巴集團(tuán)為了解決淘寶電商數(shù)據(jù)庫(kù)單機(jī)瓶頸,在2008年研制的中間件產(chǎn)品,以分庫(kù)分表為核心理念,基于 MySQL 存儲(chǔ)簡(jiǎn)單有效解決數(shù)據(jù)存儲(chǔ)和訪問容量問題,該產(chǎn)品支撐了歷屆天貓雙十一核心交易鏈路的數(shù)據(jù)庫(kù)流量,并且在此期間逐步成長(zhǎng)為阿里巴巴集團(tuán)訪問關(guān)系型數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)。

2014年,TDDL 團(tuán)隊(duì)和阿里云 RDS 團(tuán)隊(duì)合作,在云上輸出這款產(chǎn)品,取名DRDS(Distributed Relational Database Service),專注于解決單機(jī)關(guān)系型數(shù)據(jù)庫(kù)擴(kuò)展性問題,目前該產(chǎn)品在公共云上具有超過 1000 家企業(yè)用戶,并且在私有云輸出,支撐多家大型企業(yè)和政府部門的核心業(yè)務(wù),并且隨著業(yè)務(wù)的擴(kuò)大和業(yè)界技術(shù)的進(jìn)展,DRDS 產(chǎn)品也會(huì)逐步給大家?guī)砀痈咝Ш蛣?wù)實(shí)的分布式數(shù)據(jù)庫(kù)功能和解決方案。

新的思路
TDDL/DRDS 的類 KV 查詢優(yōu)化是怎么做的?這得從尋找基于 MySQL 的新優(yōu)化思路說起。2015年,我們注意到社區(qū)版 MySQL 在5.6支持了 InnoDB memcached 插件,該插件允許應(yīng)用的類 KV 查詢走 Memcached 協(xié)議來直接訪問 MySQL InnoDB 引擎的Buffer(走 Memcached 協(xié)議與走 MySQL SQL 協(xié)議都能訪問 InnoDB 上的同一份數(shù)據(jù))。這樣讓類 KV 查詢直接繞開 MySQL Server 層的解析器、優(yōu)化器與執(zhí)行器等過程,從而大大降低應(yīng)用類 KV 查詢的 MySQL CPU 開銷,擴(kuò)大類似雙十一極端場(chǎng)景下數(shù)據(jù)庫(kù)容量,并且有效降低數(shù)據(jù)庫(kù)響應(yīng)時(shí)間。

MySQL Memcahced Plugin 的類KV查詢?nèi)萘恐阅茏龅酱蠓忍嵘?#xff0c;是因?yàn)椴樵兺耆@開了 SQL 在 MySQL Server 層的各項(xiàng)開銷,查詢鏈路被極致縮短,事實(shí)上,這樣的優(yōu)化思路對(duì) TDDL/DRDS 也同樣適用。

TDDL/DRDS 目前作為阿里巴巴集團(tuán)關(guān)系型數(shù)據(jù)庫(kù)的接入標(biāo)準(zhǔn),為應(yīng)用屏蔽了底層眾多的水平拆分及主備庫(kù)技術(shù)細(xì)節(jié),然而,為業(yè)務(wù)帶來便捷的分布式 SQL 入口同時(shí),付出的代價(jià)也是有的。在 TDDL/DRDS 中,每一條 SQL,從入口到返回結(jié)果,需要經(jīng)過 SQL 語(yǔ)法解析、查詢優(yōu)化、分布式執(zhí)行計(jì)劃生成,以及分布式執(zhí)行、連接處理、類型處理等一系列過程,這些動(dòng)作需要消耗大量應(yīng)用端 CPU ( TDDL 客戶端模式),因此如果類 KV 查詢能在執(zhí)行過程中完全繞開上述處理過程,直接走 Memcached 協(xié)議去查 MySQL 數(shù)據(jù),那么整個(gè)鏈路將被進(jìn)一步精簡(jiǎn),從而提升應(yīng)用的業(yè)務(wù)吞吐量和 DB 查詢?nèi)萘俊?/p>

沿著這個(gè)優(yōu)化思路,TDDL/DRDS 在阿里巴巴集團(tuán)內(nèi)提供了 KV 功能,專門針對(duì)此類查詢場(chǎng)景實(shí)現(xiàn)極致的性能優(yōu)化。

壓測(cè)驗(yàn)證效果
為了專門驗(yàn)證 TDDL/DRDS 的這一項(xiàng)優(yōu)化在具體業(yè)務(wù)場(chǎng)景中的實(shí)際效果,我們與天貓某核心業(yè)務(wù)團(tuán)隊(duì)共同在今年雙11的全鏈路壓測(cè)中進(jìn)行 SQL 與 KV 的流量切換驗(yàn)證。


在這次壓測(cè)的過程中,應(yīng)用層通過開關(guān)將集群QPS穩(wěn)定在30w/s左右。然后,我們?cè)?t1 時(shí)刻,將業(yè)務(wù)流量從走 KV 協(xié)議切回到走 SQL 協(xié)議,應(yīng)用集群的 CPU 從 t1 時(shí)刻之后開始出現(xiàn)飆升,CPU從 46% 迅速升高到 63%,然后在 t2 時(shí)刻前后,業(yè)務(wù)再將流量從SQL切回KV,應(yīng)用的 CPU 開始下降,整個(gè)過程持續(xù)5分鐘,對(duì)比切換前后,同等QPS的流量,走 KV 比走 SQL 能節(jié)省 17% 左右的CPU,這個(gè)對(duì)于動(dòng)則以萬臺(tái)來計(jì)算節(jié)點(diǎn)數(shù)量的核心應(yīng)用而言,節(jié)省成本是明顯的。

此外,TDDL/DRDS還做了更為純粹的 KV 基準(zhǔn)性能測(cè)試。在單純的 KV 查詢場(chǎng)景下,由于排除了業(yè)務(wù)處理邏輯的 CPU 開銷,類 KV 查詢走 KV 協(xié)議比走 SQL 協(xié)議吞吐提升會(huì)更為明顯。

技術(shù)的創(chuàng)新點(diǎn)
在技術(shù)原理上,TDDL/DRDS 的類 KV 查詢優(yōu)化實(shí)現(xiàn)需要要依賴于 MySQL InnoDB Memcached 插件的特性。目前阿里巴巴集團(tuán) AliSQL 5.6 基于開源的 Memcached 插件代碼支持了這一特性。

在 TDDL/DRDS 中,一個(gè)類 KV 查詢走 SQL 接口與走 KV 接口卻有著本質(zhì)的不同,它們分別使用不同的端口來與MySQL進(jìn)行通信。因此,這使TDDL在內(nèi)部要維護(hù)兩套不同的連接池,以及要處理兩種不同的查詢鏈路。

動(dòng)態(tài)的分布式 KV 連接池
TDDL/DRDS 為保證 SQL 執(zhí)行的穩(wěn)定可靠,沉淀了各種成熟的保障機(jī)制,包括FailFast、主備切換、備庫(kù)分流與連接池動(dòng)態(tài)管理等等。這些機(jī)制為 TDDL/DRDS 的穩(wěn)定性發(fā)揮著不可替代的作用。

同樣為了保障 KV 優(yōu)化功能在雙11核心業(yè)務(wù)場(chǎng)景中穩(wěn)定可靠,TDDL/DRDS 引入分布式 KV 連接池以及動(dòng)態(tài)管理機(jī)制。

該機(jī)制的核心實(shí)現(xiàn)思想是 KV 連接池管理器會(huì)定時(shí)拉取相關(guān)配置信息,然后核對(duì)配置信息,如果發(fā)現(xiàn)有變更,自動(dòng)對(duì)池中各個(gè)KV連接狀態(tài)的進(jìn)行相應(yīng)的調(diào)整操作,例如完成KV的主備切換、備庫(kù)分流、替換DB機(jī)器IP等等等。

TDDL/DRDS 采用這樣的實(shí)現(xiàn)方案,一方面是為了保證 KV 連接池與 SQL 連接池的相互獨(dú)立,另一方面是為保證 KV 連接池的變更能夠與 SQL 連接池的變更保持協(xié)同。這樣一旦 KV 連接池存在穩(wěn)定性的風(fēng)險(xiǎn),允許應(yīng)用將流量及時(shí)切回 SQL 連接池并做到快速恢復(fù),從而很好地管控風(fēng)險(xiǎn)。

此外,TDDL/DRDS 為 KV功能在穩(wěn)定性上還做其它一些很有用的工作,例如,支持按分庫(kù)灰度 KV ,這個(gè)特性允許單獨(dú)對(duì)某個(gè)分庫(kù)的查詢流量在 SQL 協(xié)議與 KV 協(xié)議之間進(jìn)行對(duì)應(yīng)用透明的動(dòng)態(tài)切換,這非常適合在 TDDL/DRDS 這種管理眾多數(shù)據(jù)分片的場(chǎng)景下做流量的灰度驗(yàn)證。

優(yōu)化的KV通信協(xié)議
原生的Memcached協(xié)議的查詢結(jié)果默認(rèn)使用“|”符號(hào)對(duì)一行記錄的各個(gè)列進(jìn)行分隔,使用這樣的方式雖然簡(jiǎn)單,但缺點(diǎn)也顯而易見。假如用戶記錄中含有“|”這種字符串或者因?yàn)橹形膩y碼導(dǎo)致一些奇怪的字符,Memcached協(xié)議的結(jié)果的傳輸就會(huì)錯(cuò)亂,導(dǎo)致查詢結(jié)果不正確。

TDDL/DRDS 為了解決這個(gè)問題,在原生 Memcached 協(xié)議的基礎(chǔ)上進(jìn)行了優(yōu)化,設(shè)計(jì)了新的 KV 協(xié)議。新 KV 協(xié)議采用了更加普遍的通信協(xié)議設(shè)計(jì)方案,不再使用分隔符,而是改為固定長(zhǎng)度字節(jié)的header描述一行記錄中各個(gè)列值的長(zhǎng)度,有效解決原生協(xié)議存在的問題。

KV 協(xié)議本身很簡(jiǎn)單,返回的數(shù)據(jù)包中只有數(shù)據(jù)本身,協(xié)議開銷很低,并不像SQL協(xié)議,返回的數(shù)據(jù)包中除了含有結(jié)果集的數(shù)據(jù)外,還有相當(dāng)部分是含有查詢結(jié)果對(duì)應(yīng)Meta信息(如每列的數(shù)據(jù)類型、列名、別名、表名和庫(kù)名等等)。這些Meta信息會(huì)給SQL協(xié)議帶來額外的CPU開銷與網(wǎng)絡(luò)開銷,更嚴(yán)重的是,這些開銷在KV查詢的場(chǎng)景下會(huì)被放大,因?yàn)镵V查詢的返回結(jié)果通常是1~2條的記錄,Meta的數(shù)據(jù)包在返回的數(shù)據(jù)包中的比重會(huì)明顯增大,這并不太適全 KV 查詢場(chǎng)景。因此,KV 協(xié)議更適合 KV 查詢場(chǎng)景,這也是 TDDL/DRDS 的KV查詢能做到吞吐優(yōu)化的原因之一。

KV結(jié)果的自動(dòng)類型轉(zhuǎn)換
TDDL/DRDS 通過 KV 協(xié)議獲取的數(shù)據(jù)都是字符串類型,直接返回給業(yè)務(wù)字符串類型數(shù)據(jù)不符合需求。因此,TDDL/DRDS 必須具備對(duì)查詢結(jié)果各個(gè)列的字符串值進(jìn)行自動(dòng)類型轉(zhuǎn)換的能力。與此同時(shí),這個(gè)類型轉(zhuǎn)換過程,必須嚴(yán)格遵循 MySQL 規(guī)范,才能良好適配 JDBC ResultSet 接口規(guī)范。

但是 KV 協(xié)議返回的數(shù)據(jù)包里并不含有列的元信息。因此,TDDL/DRDS 在解析 KV 返回結(jié)果之前,需要自己去獲取表相關(guān)的Meta信息并進(jìn)行緩存,這樣,在解析過程中,就可以對(duì)結(jié)果按Meta進(jìn)行類型轉(zhuǎn)換。

后續(xù)的規(guī)劃
TDDL/DRDS 目前還未在阿里云公共云或者私有云產(chǎn)品上輸出這一特性,后續(xù)隨著產(chǎn)品發(fā)展,我們慢慢會(huì)開放這種能力。另外產(chǎn)品層面,我們將會(huì)使用類Plan Cached方案,進(jìn)一步優(yōu)化性能,從而達(dá)到使用SQL轉(zhuǎn)KV的鏈路如同直接使用KV一樣損耗的效果。

總結(jié)

以上是生活随笔為你收集整理的2017双11技术揭秘—TDDL/DRDS 的类 KV 查询优化实践的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。