摘要:?前言 CloudDBA是阿里云數(shù)據(jù)庫(kù)團(tuán)隊(duì)開(kāi)發(fā)的智能診斷和優(yōu)化平臺(tái),可以幫助用戶更好使用阿里云數(shù)據(jù)庫(kù)。CloudDBA不斷提升算法和規(guī)則,更好的匹配更多用戶場(chǎng)景,剛剛上線了SQL過(guò)濾功能,用來(lái)解決某類SQL給系統(tǒng)帶來(lái)的沖擊。
1 前言
CloudDBA是阿里云數(shù)據(jù)庫(kù)團(tuán)隊(duì)開(kāi)發(fā)的智能診斷和優(yōu)化平臺(tái),可以幫助用戶更好使用阿里云數(shù)據(jù)庫(kù)。
CloudDBA不斷提升算法和規(guī)則,更好的匹配更多用戶場(chǎng)景,剛剛上線了SQL過(guò)濾功能,用來(lái)解決某類SQL給系統(tǒng)帶來(lái)的沖擊。
2 功能描述
匹配用戶設(shè)置的關(guān)鍵字和并發(fā)數(shù),對(duì)某類SQL(SELECT/UPDATE/DELETE)進(jìn)行按并發(fā)數(shù)限流,當(dāng)這一類SQL的并發(fā)小于并發(fā)數(shù)的進(jìn)到Server層,大于并發(fā)數(shù)的丟棄。
該功能只能用來(lái)救急,不適合長(zhǎng)時(shí)間運(yùn)行。
3 對(duì)業(yè)務(wù)的影響
3.1 收益
限制了問(wèn)題SQL后,保障DB Server端能正常響應(yīng)正常業(yè)務(wù)的語(yǔ)句,保障大部分的業(yè)務(wù)正常運(yùn)轉(zhuǎn)
3.2 弊端
如果設(shè)置了SQL防火墻,該SQL被限制后,應(yīng)用端會(huì)收到1317錯(cuò)誤,即
query?execution?was?interrupted
4 適用場(chǎng)景
如果業(yè)務(wù)方能夠接受舍小(小部分業(yè)務(wù)損失)保大(大部分業(yè)務(wù)正常運(yùn)轉(zhuǎn)),可以進(jìn)行限流;
如果不能接受上述報(bào)錯(cuò),就要接受整個(gè)業(yè)務(wù)被拖垮的可能。
4.1 能解決的場(chǎng)景
4.1.1 某類SQL并發(fā)急劇上升,影響正常業(yè)務(wù)
比如緩存穿透,或者異常調(diào)用,可能會(huì)造成原來(lái)并發(fā)不大的SQL語(yǔ)句,并發(fā)量突然上升
4.1.2 有數(shù)據(jù)傾斜SQL,影響正常業(yè)務(wù)
比如大促時(shí)拉取某個(gè)特別大的數(shù)據(jù),造成整體系統(tǒng)繁忙
4.1.3 未創(chuàng)建索引SQL,影響正常業(yè)務(wù)
比如新上線SQL調(diào)用量特別大,又沒(méi)有創(chuàng)建索引,造成整體系統(tǒng)繁忙
4.2 處理誤區(qū)
4.2.1 切換主備
以前碰到上述情況,見(jiàn)有的運(yùn)維人員是切換主備嘗試解決上述問(wèn)題,主備的配置是一樣的,如果主庫(kù)有問(wèn)題,同樣的請(qǐng)求到備庫(kù)也是同樣的問(wèn)題,所以切換是解決不了問(wèn)題的。
4.2.2 kill問(wèn)題語(yǔ)句
kill語(yǔ)句是可以減少系統(tǒng)壓力,未嘗不是一種處理手段。但是,請(qǐng)求是不斷進(jìn)來(lái)的,不停kill語(yǔ)句手都酸了吧?
4.3 可以嘗試的解決方法
上面提到這個(gè)功能只是應(yīng)急手段那么如何才能解決該類問(wèn)題呢?
提高緩存命中率
使用只讀實(shí)例
快速加索引
5 使用方式
5.1 路徑
RDS控制臺(tái)->找到具體實(shí)例->CloudDBA->問(wèn)題診斷->SQL過(guò)濾
5.2 找到要限制的SQL語(yǔ)句
通過(guò)"問(wèn)題診斷"里面,觀察到某類SQL執(zhí)行特別慢,并發(fā)又特別多時(shí),這條語(yǔ)句可能就是問(wèn)題SQL,經(jīng)過(guò)再三確認(rèn)(根據(jù)經(jīng)驗(yàn),跟業(yè)務(wù)開(kāi)發(fā),跟老板)后就可以限制并發(fā)啦。
例如:
想限制下面這類語(yǔ)句:
SELECT?*?FROM?sbtest4?WHERE?top_cmt_id=99738?AND?status?in?(1,3)??and?parent_cmt_id?>=?0?order?by?add_time?desc?limit?0,20
就要執(zhí)行下面的步驟
5.3 創(chuàng)建過(guò)濾規(guī)則
5.3.1 SQL類型
是限制SELECT語(yǔ)句還是限制UPDATE語(yǔ)句還是限制DELETE語(yǔ)句,安全起見(jiàn)默認(rèn)支持SELECT語(yǔ)句,建議您也優(yōu)先設(shè)置SELECT語(yǔ)句
5.3.2 最大并發(fā)度
該次限制的SQL最大允許在Server端跑多少個(gè)
5.3.3 限流時(shí)間
允許SQL過(guò)濾最大執(zhí)行時(shí)間;超過(guò)了指定時(shí)間,就會(huì)自動(dòng)終止該限制
5.3.4 SQL關(guān)鍵詞
SQL過(guò)濾的匹配關(guān)鍵詞,多個(gè)關(guān)鍵詞之間以~分隔,不要有空格之類的特殊字符
接著上面的例子,SQL關(guān)鍵詞我可以這樣拼寫(xiě)
SELECT~FROM~sbtest4~WHERE~top_cmt_id~status~parent_cmt_id~order~add_time~desc
5.4 重置/終止過(guò)濾規(guī)則
當(dāng)遇到設(shè)置規(guī)則錯(cuò)誤,或者想提前終止SQL過(guò)濾,可以執(zhí)行該操作。
5.5 查看過(guò)濾歷史記錄
凡是對(duì)該實(shí)例執(zhí)行過(guò)SQL過(guò)濾功能的,都可以在這里查到記錄,方便排查問(wèn)題。
6 注意事項(xiàng)
該功能只能用來(lái)救急,不適合長(zhǎng)時(shí)間運(yùn)行
安全起見(jiàn)默認(rèn)支持SELECT語(yǔ)句,建議您也優(yōu)先限制SELECT語(yǔ)句
該功能只能運(yùn)行在MySQL 5.6版本
該功能是內(nèi)核層面上的改進(jìn),無(wú)論是使用高安全鏈路還是普通鏈路都可以使用
可以設(shè)置多個(gè)SQL過(guò)濾(根據(jù)不同的關(guān)鍵詞)
如果同一類型的SQL關(guān)鍵詞設(shè)置了多次,限制的并發(fā)按這幾個(gè)并發(fā)的和限制
要限制的SQL語(yǔ)句匹配越嚴(yán)格越精準(zhǔn),對(duì)業(yè)務(wù)影響最小
如果設(shè)置的不夠精準(zhǔn),例如SQL關(guān)鍵詞是
SELECT~FROM~sbtest4
那匹配上述規(guī)則的SQL語(yǔ)句,哪怕是正常業(yè)務(wù)的,也可能被限制掉了
被限制后的SQL在應(yīng)用端會(huì)出現(xiàn)
1317?query?execution?was?interrupted
該限制只對(duì)被設(shè)置的實(shí)例生效,不影響主賬號(hào)下面的其他實(shí)例
該限制規(guī)則只對(duì)新鏈接有效,如果想使用該規(guī)則,在設(shè)置過(guò)規(guī)則后,需要把老鏈接手動(dòng)kill(在CloudDBA里可做)
如果您在使用CloudDBA過(guò)程中有什么問(wèn)題,或者好建議,歡迎進(jìn)群
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
評(píng)論