過(guò)載保護(hù)
本文介紹了過(guò)載保護(hù)功能的原理和使用方法。
背景
在促銷活動(dòng)等高并發(fā)場(chǎng)景下,數(shù)據(jù)庫(kù)主節(jié)點(diǎn)的CPU資源容易出現(xiàn)負(fù)載過(guò)高的情況。為應(yīng)對(duì)這一狀況,通常需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行變配(升級(jí))。然而,在規(guī)格變更過(guò)程中可能會(huì)出現(xiàn)閃斷或性能跌至0的情況,此時(shí)所有請(qǐng)求可能會(huì)被路由至主節(jié)點(diǎn),從而導(dǎo)致主節(jié)點(diǎn)的CPU資源超負(fù)載,進(jìn)而影響業(yè)務(wù)的連續(xù)性和穩(wěn)定性。為了緩解此種情況的發(fā)生,PolarDB MySQL版在數(shù)據(jù)庫(kù)代理層引入了過(guò)載保護(hù)功能。該功能能夠在所有只讀節(jié)點(diǎn)異常時(shí),通過(guò)限制并發(fā)請(qǐng)求的數(shù)量來(lái)保護(hù)主節(jié)點(diǎn),確保其不會(huì)因過(guò)載而影響整體服務(wù)的可用性。
使用限制
該功能要求數(shù)據(jù)庫(kù)代理的版本為2.8.1或以上,支持PolarDB MySQL版 5.6,5.7,8.0。
該功能當(dāng)前只支持可讀可寫類型的Endpoint。
當(dāng)前只有在所有只讀節(jié)點(diǎn)異常(宕機(jī)或者與主庫(kù)的復(fù)制中斷)的情況下,才會(huì)觸發(fā)過(guò)載保護(hù),其它場(chǎng)景暫時(shí)未支持。
使用說(shuō)明
在控制臺(tái)基本信息的集群地址區(qū)域,單擊編輯配置,打開(kāi)編輯地址配置頁(yè)面,可開(kāi)啟過(guò)載保護(hù)。
基于漏桶原理,當(dāng)代理端檢測(cè)到集群中的所有RO節(jié)點(diǎn)均異常時(shí),開(kāi)始主動(dòng)對(duì)集群的并發(fā)請(qǐng)求進(jìn)行限制以達(dá)到保護(hù)主庫(kù)的目的。當(dāng)RO節(jié)點(diǎn)正常或者超出限制時(shí)間后(默認(rèn)60s),取消限制。
對(duì)于限流的上限,PolarDB MySQL版集群是通過(guò)歷史數(shù)據(jù)來(lái)選取合適的區(qū)間。在集群正常服務(wù)期間,代理會(huì)記錄該實(shí)例主節(jié)點(diǎn)最近24小時(shí)的采樣并發(fā)請(qǐng)求數(shù)。
當(dāng)觸發(fā)過(guò)載保護(hù)后,目前代理會(huì)使用歷史數(shù)據(jù)的中位數(shù)作為上限對(duì)用戶的活躍連接數(shù)進(jìn)行限流。
示例
測(cè)試過(guò)程中所有只讀節(jié)點(diǎn)復(fù)制中斷,進(jìn)入過(guò)載保護(hù)。在這期間流量還可以持續(xù)進(jìn)來(lái),但是不會(huì)進(jìn)一步飆升。
在只讀節(jié)點(diǎn)恢復(fù)后,過(guò)載保護(hù)結(jié)束,流量可以正常進(jìn)行轉(zhuǎn)發(fā)。