伴隨互聯(lián)網(wǎng)的高速發(fā)展,對業(yè)務(wù)系統(tǒng)的能力要求也越來越高,做為底層提供數(shù)據(jù)服務(wù)的MySQL數(shù)據(jù)庫更是如此;基本的MySQL集群模式雖提供了高可用、高并發(fā)的服務(wù)能力,但突然的高并發(fā),或流量并沒被業(yè)務(wù)架構(gòu)層層過濾,最終過載的流量流向數(shù)據(jù)庫,這時MySQL的服務(wù)能力就會降低,甚至雪崩。
高質(zhì)量的MySQL服務(wù)就是時時提供高可用、高效、高穩(wěn)定的能力,杜絕雪崩產(chǎn)生。
本文采用限流、超時SQL攔截的手段來保證MySQL服務(wù)的高質(zhì)量,但MySQL數(shù)據(jù)庫本身或現(xiàn)有集群模式并沒提供這種能力。因此需設(shè)計(jì)一個數(shù)據(jù)庫中間件來提供這種能力,事前杜絕這些隱患,保證后端MySQL服務(wù)的高質(zhì)量。下圖為數(shù)據(jù)庫中間件產(chǎn)品的主要功用模塊,簡單說明以下幾個:
1)SQL解析器:對客戶端發(fā)來的sql語句進(jìn)行解析處理,以便進(jìn)行sql的路由操作。
2)SQL攔截器:對耗時超過閥值的SQL進(jìn)行攔截,直接返回錯誤,不再路由至后端MySQL數(shù)據(jù)庫。
3)SQL路由器:對解析后的sql語句,依據(jù)讀寫分隔、分片配置信息,轉(zhuǎn)發(fā)至相應(yīng)后端MySQL節(jié)點(diǎn)。
4)限流器:限制后端MySQL節(jié)點(diǎn)的QPS能力,降低突增流量帶來的影響。
限流的方式有很多種,以下為目前常見的限流方式:
通過限制單位時間段內(nèi)調(diào)用量來限流
通過限制系統(tǒng)的并發(fā)調(diào)用程度來限流
使用漏桶(Leaky Bucket)算法來進(jìn)行限流
使用令牌桶(Token Bucket)算法來進(jìn)行限流
本產(chǎn)品采用令牌桶算法進(jìn)行業(yè)務(wù)的限流,下面簡單介紹下令牌桶算法
1)以固定頻率往桶中添加令牌,如果桶滿,則丟棄
2)請求到來時,從桶中取N個令牌
3)如果桶中現(xiàn)有令牌數(shù)>=N,則執(zhí)行請求,并銷毀N個令牌
4)如果桶中現(xiàn)有令牌數(shù)
首先程序?qū)崿F(xiàn)一個令牌桶算法模塊,以MySQL最大QPS為頻率向桶中添加令牌,以后每個數(shù)據(jù)庫請求都需訪問該模塊,以判讀該請求是否可以執(zhí)行。
1)初始化N個令牌桶
后端有多少M(fèi)ySQL節(jié)點(diǎn),則初始化多少個令牌桶,并與節(jié)點(diǎn)綁定。以相應(yīng)節(jié)點(diǎn)最大QPS為頻率,即1/QPS秒向桶中添加一個令牌
2)令牌請求
客戶端請求的SQL經(jīng)過解析后,由SQL路由器轉(zhuǎn)發(fā)至某一個后端MySQL節(jié)點(diǎn)時,請求相應(yīng)令牌桶中的令牌,請求滿足,則執(zhí)行相應(yīng)SQL
3)令牌不足
如果請求不滿足,則把SQL放入相應(yīng)節(jié)點(diǎn)隊(duì)列中等待,直到有令牌滿足或隊(duì)列滿時直接返回錯誤。
超時SQL攔截的意思是,耗時的SQL語句直接返回錯誤,不再路由轉(zhuǎn)發(fā)至后端節(jié)點(diǎn);當(dāng)某類sql運(yùn)行時長超過閥值,并達(dá)到一定次數(shù)后,記錄下該類sql的id,下次再有這類sql請求時,中間件直接攔截并返回錯誤。
程序?qū)崿F(xiàn)這種邏輯的方法有很多種,比如使用map結(jié)構(gòu),以sql的id做為key,或者以數(shù)組方式記錄下超時sql的id,但這類方式占用內(nèi)存較高,并且效率很低;再比如使用redis數(shù)據(jù)庫,以sql_id做為key來緩存這些數(shù)據(jù),雖說redis效率比較高,但每次sql請求都要訪問一次,總體來說效率還是比較低的。
本產(chǎn)品以降低內(nèi)存使用、提高效率為目的,采用的是位圖算法。
在一個結(jié)構(gòu)中,用一個比特位來描述一個數(shù)據(jù)的狀態(tài),這種結(jié)構(gòu)就稱為位圖。位圖實(shí)際上是哈希表的一種變形,它的主要使用場景為:
大數(shù)據(jù)濾重
大數(shù)據(jù)查詢、定位
大數(shù)據(jù)排序
它的主要優(yōu)點(diǎn)為:
節(jié)省內(nèi)存
位操作,效率更快
程序?qū)崿F(xiàn)一個位圖模塊,主要有設(shè)置(set)、查詢(get)、清除(clear)sqlid等方法。
1)初始化位圖模塊
初始化一個容量為2^20的byte數(shù)組為bitmap,占用內(nèi)存128K,可記錄百萬類SQL
2)SQL請求過濾
每個SQL請求到來時,生成該類sql的數(shù)字標(biāo)識符id,用該id與bitmap進(jìn)行位與運(yùn)算,如果為0,則執(zhí)行sql,否則直接返回。
3)SQL請求超時
如果sql運(yùn)行時長超過閥值,并達(dá)到固定次數(shù)后,用該sqlid 與bitmap進(jìn)行位或運(yùn)算,以達(dá)到在bitmap中記錄的目錄。
4)超時SQL入庫
超時sql異步入庫,以達(dá)到后期優(yōu)化處理的目的。
本文以限流、超時SQL攔截兩個手段來達(dá)到提高M(jìn)ySQL服務(wù)質(zhì)量的目的。限流是為了攔截突增流量,保證Mysql服務(wù)的穩(wěn)定;超時SQL攔截是為了提高M(jìn)ySQL服務(wù)效率,減低MySQL服務(wù)器資源使用率。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/129977.html
摘要:創(chuàng)立者云計(jì)算必須建在開源之上的成功是歸功于全世界成千上萬的傳道者開創(chuàng)開源公司新的盈利模式于年加入,擔(dān)任。云計(jì)算潛力的發(fā)揮,必須建立在開源之上在公司任職期間,看到云計(jì)算將成為一種新的計(jì)算趨勢。 云計(jì)算,IT行業(yè)最熱門的技術(shù)之一,開源云計(jì)算則被認(rèn)為IT的發(fā)展趨勢。Marten Mickos,作為開源數(shù)據(jù)庫MySQL創(chuàng)立者、開源云計(jì)算平臺Eucalyptus(桉樹)公司CEO,除被稱為開源軟件...
摘要:數(shù)據(jù)庫數(shù)據(jù)庫入門教程系列工具掘金工具共同編輯,修正錯誤,這里點(diǎn)擊進(jìn)去在這里持續(xù)更新由于軟件是基于模式的數(shù)據(jù)庫管理系統(tǒng)一個客戶機(jī)服務(wù)器,因此在日常各種工作中,可以通過各種客戶端軟件來與數(shù)據(jù)庫管理系統(tǒng)關(guān)聯(lián)。 MySQL入門教程系列-1.5 如何學(xué)習(xí)MySQL - 掘金 在這里持續(xù)更新 MySQL入門教程系列-1.5 如何學(xué)習(xí)MySQL 如何學(xué)習(xí) MySQL 這是一個偽命題,每個人都有適合自...
摘要:安裝使用文檔代碼質(zhì)量相信是每個團(tuán)隊(duì)的最高追求之一,質(zhì)量高的團(tuán)隊(duì),開發(fā)成本維護(hù)成本都很低同樣人數(shù)的團(tuán)隊(duì),一年內(nèi)高質(zhì)量團(tuán)隊(duì)是低質(zhì)量團(tuán)隊(duì)產(chǎn)出的倍打個比方,一個團(tuán)隊(duì)開發(fā)完產(chǎn)品,行代碼出一個和行代碼一個的團(tuán)隊(duì)。 SonarQube Scanner 安裝使用文檔 代碼質(zhì)量相信是每個團(tuán)隊(duì)的最高追求之一,質(zhì)量高的團(tuán)隊(duì),開發(fā)成本、維護(hù)成本都很低;同樣人數(shù)的團(tuán)隊(duì),一年內(nèi)高質(zhì)量團(tuán)隊(duì)是低質(zhì)量團(tuán)隊(duì)產(chǎn)出的10倍;...
閱讀 1356·2023-01-11 13:20
閱讀 1707·2023-01-11 13:20
閱讀 1215·2023-01-11 13:20
閱讀 1906·2023-01-11 13:20
閱讀 4165·2023-01-11 13:20
閱讀 2757·2023-01-11 13:20
閱讀 1402·2023-01-11 13:20
閱讀 3671·2023-01-11 13:20