成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

就這么簡單:秒殺應用的MySQL數據庫優化

數據庫 MySQL
其實秒殺應用的數據庫層優化非常簡單,各個層面做好排隊即可,MySQL企業版提供了線程池插件,但是需要額外的費用。小伙伴們可以使用開源的MySQL版本InnoSQL,其免費提供了線程池,可以保證應用在大并發量下依舊保證應用的穩定性,特別是對于秒殺類的應用。

[[138356]]

關于秒殺

隨著雙11活動的不斷發展,小米饑餓營銷模式的興起,“秒殺”已經成為一個熱點詞匯。在一些活動中,熱銷商品會以驚人的速度售罄,比如最近筆者在搶購美圖M4手機,12點開賣,1分鐘之內就被售罄。

秒殺的實現

對于關注數據庫的筆者來說,更關心的是如何高效的實現秒殺應用。之前淘寶在2013年的數據庫大會上分享過他們的秒殺方案,修改MySQL數據庫源碼來實現高效的秒殺應用。但是,那篇分享過于高大上,沒有給出具體的實現過程。另外,從其他渠道打聽到的是這個方案并沒有在生產環境上線,不知道有沒有其他知道內幕的小伙伴,具體來說說淘寶的方案是否有上線。

當然,有多種方法來優化秒殺應用,比如使用memcached的CAS功能,但是這些方法都不能實現事務的特性。對于深受Jim Gray事務處理教育長大的一代,筆者覺得任何事情都應該事務的,不支持事務只不過能取得暫時的勝利,整個世界的哲學應該就是事務,即要么全做,要么全不做,不要處于一個中間狀態。筆者的為人哲學就是,要么不去設定一個目標,否則這個目標一定會去實現。比如,筆者決定去讀博,那么一定會完成這個學業。

筆者感覺雖然淘寶沒有給出具體的實現方式,但是拋出了秒殺應用對于數據庫壓力的問題所在,即大并發量下更新同一行數據的壓力。例如并發執行如下的SQL語句模擬秒殺場景:

  1. BEGIN; 
  2.  
  3. INSERT INTO stock_log VALUES 
  4.  
  5. SELECT count FROM stock WHERE id=1 AND count>0 FOR UPDATE; 
  6.  
  7. UPDATE stock SET count = count -1 WHERE id=1 AND count > 0
  8.  
  9. COMMIT; 

在做秒殺時,最主要是對庫存表進行操作,在操作前可能需要插入一些其他操作,比如日志等,然后就是對庫存表進行更新。下圖顯示增大并發量的情況下,事務處理的性能:

 

InsideMySQL

顯而易見的是隨著并發量的增大,事務處理的性能越差。這和淘寶之前分享的數據基本一致。導致其中的原因就是秒殺是對同一件商品進行更新,需要對同一行記錄加鎖,因此秒殺操作雖然是并行的,但是在數據庫層面是串行的。

隨著并發的不斷增大,不斷發生事務的鎖等待與喚醒操作,導致性能的急劇下降。如果通過perf工具來觀察的話,應該可以觀察到類似如下的內容:

  1.  
  2. 59.06% mysqld mysqld [.] lock_deadlock_recursive 
  3.  
  4. 16.63% mysqld libc-2.13.so [.] 0x115171 3.09% mysqld mysqld [.] lock_rec_get_prev 
  5.  
  6. 2.96% mysqld mysqld [.] my_strnncollsp_utf8 
  7.  
  8. ...... 

可以發現鎖的死鎖檢測占據了大部分的CPU時間,究其原因,就是因為鎖等待。

innodb_thread_concurrency

有小伙伴或許會知道可以通過innodb_thread_concurrency參數來控制InnoDB存儲引擎層的并發量。的確,通過這個參數可以限制進入InnoDB引擎層的事務數量,對比測試的話,性能上的確會有一定的提升:

 

可以發現,將innodb_thread_concurrency設置為16,性能的確會有一定的提升。并發線程數在128的時候,TPS從原有的4300提升為了7200,將近有65%的性能提升。但是在256線程之后,性能依舊堪憂。

導致上述的原因是雖然在InnoDB存儲引擎層做了“限流”,但是MySQL數據庫上層的線程依然需要等待喚醒。

#p#

線程池技術

業界提供了很多關于秒殺MySQL的解決方案,然而非常的定制化,并且需要應用修改相信的程序,比如通過在SQL語句中寫hint來進行排隊,而這種的排隊機制在我看來在低并發量下性能反而又會變差。因此,一個通用的解決方案是采用線程池技術。

線程池可以在MySQL上層限制住同時運行的MySQL的事務數,這樣就解決了由秒殺而導致的資源競爭問題。例如,通過前面的測試,已經得知并發16線程時,秒殺可以有***的性能,那么這時用戶將線程池的大小設置為16,這樣就能獲得用戶預期想要的性能:

 

可以發現即使在4096個并發線程下,秒殺依然可以有近10000的TPS。通過線程池技術,秒殺就是這么簡單,無需任何應用端的修改。

但是線程池這里有個參數thread_pool_oversubscribe,這個參數其實有點類似云計算中“超售”概念,即MySQL的線程池允許有額外的線程運行。該參數默認是3,之前thread_pool_size設置為16,那么總共允許16*(1+3)=64個線程同時運行。這個參數的默認值本身沒有問題,但是對于秒殺應用來說確是不需要的,因為之前已經討論過,秒殺應用是串行的。所以將參數thread_pool_oversubscribe設置為1,秒殺應用還能有進一步的提升:

可以發現在大并發的線程下,性能還能有10%~30%的提升。

總結

其實秒殺應用的數據庫層優化非常簡單,各個層面做好排隊即可,如:

  • 應用層做好對于單個商品搶購的數量限制
  • MySQL數據庫層使用線程池技術來保證大并發量下的性能
  • 調整參數thread_pool_oversubscribe用來進一步提升性能

MySQL企業版提供了線程池插件,但是需要額外的費用。小伙伴們可以使用開源的MySQL版本InnoSQL,其免費提供了線程池,可以保證應用在大并發量下依舊保證應用的穩定性,特別是對于秒殺類的應用。

點擊下方原文閱讀可以下載InnoSQL 5.5.30-v6/InnoSQL 5.6.19-v1版本,其中提供了免費的線程池,雙機高可用套件,TopSQL等插件,并行復制等功能。使用InnoSQL可以得到筆者完整的免費技術支持,還等什么呢?
 

責任編輯:Ophira 來源: InsideMySQL
相關推薦

2015-07-06 14:59:49

技術周刊

2016-05-09 10:27:36

MySQLHive數據遷移

2015-05-07 10:10:06

云應用開發開發者云平臺

2025-02-12 08:21:55

OllamaChatboxDeepSeek

2021-11-19 11:16:29

Git命令Linux

2010-05-17 10:24:44

MySQL數據庫

2011-03-08 08:49:55

MySQL優化單機

2010-04-22 14:38:24

培訓

2014-04-02 10:20:20

銳捷網絡云課堂

2019-05-13 08:24:58

數據庫MySQLInnoDB

2011-03-03 17:56:52

MySQL數據庫優化

2015-12-15 16:54:00

戴爾云計算

2015-01-05 09:35:54

云計算應用程序開發

2022-02-10 14:24:28

LinuxWindows文件

2012-11-14 16:57:37

手機刷機

2017-07-13 13:13:49

AndroidAPK反編譯

2013-01-04 10:00:12

MySQL數據庫數據庫查詢優化

2015-08-27 09:00:41

產品用戶體驗設計設計

2011-03-09 08:53:02

MySQL優化集群

2019-04-23 10:06:16

微軟Windows 10系統更新
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧美在线免费观看 | 久久久久99 | 日韩欧美三区 | 毛片网在线观看 | 亚洲精品一区中文字幕 | 正在播放国产精品 | 国产一区二区在线播放 | 欧美日韩一 | 久久亚洲天堂 | 一本色道精品久久一区二区三区 | 国产九九精品视频 | 精品美女 | 欧美日韩一区在线 | 日本一区二区三区四区 | 久草视频在线播放 | 国产日韩精品一区 | 伊人免费在线观看高清 | 亚洲一区二区三区免费视频 | 免费毛片网| 麻豆精品国产91久久久久久 | 精品国产乱码久久久久久丨区2区 | 久草中文在线 | www久久久| 欧美成人一级 | 国产色网站| 91视频免费视频 | 伊人网综合在线观看 | 日韩视频国产 | 成人福利在线 | 91精品国产综合久久久久久 | 免费看黄色片 | 97av视频在线观看 | 日韩av在线免费 | 日本激情视频在线播放 | 精品视频在线观看 | 亚洲久久一区 | 国产美女一区二区 | 亚洲永久精品国产 | 欧美视频成人 | 毛色毛片免费看 | 一二三四在线视频观看社区 |