1. 程式人生 > >讓天下沒有難用的資料庫 » 一個價值“千萬”的秒殺場景引數優化

讓天下沒有難用的資料庫 » 一個價值“千萬”的秒殺場景引數優化

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

1

從上圖中看到該資料庫的活躍連線數最高的時候到達了1W,通過show processlist可以看到大量的併發更新

2

我們來看一下資料庫併發更新的TPS有多大:

3

可以看到資料庫中的活躍連線數非常高,每秒的update非常不穩定。
我們在把限流開關開啟後看一下效能表現:
mysql> set global rds_threads_running_high_watermark=300;
Query OK, 0 rows affected (0.00 sec)

mysql> set global rds_threads_running_ctl_mode=’all’;
Query OK, 0 rows affected (0.00 sec)

4

從上圖可以明顯的觀察到,通過開啟資料庫的限流開關,資料庫的活躍連線數在300左右,同時資料庫的TPS也沒有再出現很大的波動,這樣很好的保護住了DB。

5

6

使用阿里雲RDS就可以獲得阿里的秒殺優化技術,還可獲得阿里雲DBA的技術服務,趕快來使用吧。
https://www.aliyun.com/product/rds/?spm=5176.7960203.237031.32.YoWkko
加入我們:
http://duang.alicdn.com/html/HJutlATe