秒殺最早來自天貓雙11各種商品的促銷活動中,現在已經有很多業務場景在使用,比如搶紅包,搶票等。其特點有三高:瞬時并發高,資料一緻性高,熱點更新頻度高。這樣三高的場景下往往給資料庫造成極大的壓力,大量更新資料庫中的同一行,這樣必然會産生鎖等待,導緻資料庫的性能急劇下降的問題,很容易出現雪崩效應。筆者記得有一年春節,一個電視台定時在整點發放紅包,結果由于壓力太高,導緻更新資料庫紅包數額的請求全部堆積,業務全部挂掉,面對這樣的情況我們當時也束手無策。
面對秒殺業務的場景,資料庫成為了底層系統中最重要的瓶頸點,阿裡經過幾年的沉澱也誕生了很多的技術手段來進行優化,這裡我們就重點講一下底層資料所做的優化。當大量的并發更新同一條記錄時,使用排隊的方式來保證高并發下熱點記錄更新依然能保持較好的性能,為threads_running設定一個硬上線,當并發超過此值是,拒絕執行sql,保護mysql,我們将這個稱之為高水位限流,這樣就給資料庫加上了一層限流的功能,使得資料庫不被瞬間的高爆發請求打爆。
高水位限流實作:
監控系統status變量threads_running,當滿足拒絕條件,拒絕執行sql,傳回使用者:mysql server is too busy,判斷邏輯在dispatch_command中,sql解析之後。
增加的系統variables:
threads_running_ctl_mode: 限流的sql類型,有兩個取值:[all | selects],預設selects,設定為all需謹慎。
threads_running_high_watermark: 限流水位值,隻有threads_running超過此值才會觸發,預設值為max_connections,當set global threads_running_high_watermark=0時自動設定為max_connections。
拒絕必要條件:
threads_running超過threads_running_high_watermark。
threads_running_ctl_mode與sql類型相符。
以下情況不拒絕:
使用者具有super權限。
sql所在事務已經開啟。
sql為commit/rollback。
阿裡雲的rds已經內建了阿裡秒殺場景下的參數優化,是以如果你的應用場景中具有大量并發更新同一行記錄的場景,你可以打開資料庫的限流參數:threads_running_ctl_mode和threads_running_high_watermark來保護資料庫,讓你的資料庫平穩過渡。下面我們來看一則生産案例。

從上圖中看到該資料庫的活躍連接配接數最高的時候到達了1w,通過show processlist可以看到大量的并發更新。
我們來看一下資料庫并發更新的tps有多大:
可以看到資料庫中的活躍連接配接數非常高,每秒的update非常不穩定。
我們在把限流開關打開後看一下性能表現:
從上圖可以明顯觀察到,通過打開資料庫的限流開關,資料庫的活躍連接配接數在300左右,同時資料庫的tps也沒有再出現很大的波動,這樣很好地保護住了db。
作者介紹 羅龍九
玄慚,阿裡雲資深dba專家;
有着豐厚的dba經驗,經曆阿裡曆年雙11考驗,保持着“無一丢單”的優異紀錄。同時積累了6年對阿裡雲資料庫使用者的運維、調優、診斷等豐富的經驗。
<b></b>
<b>本文來自雲栖社群合作夥伴"dbaplus",原文釋出時間:2016-06-01</b>