現(xiàn)象
今日贬芥,數(shù)據(jù)庫服務(wù)器連接數(shù)出現(xiàn)突然激增靠益?導致有些應(yīng)用拿不到數(shù)據(jù)庫鏈接,數(shù)據(jù)庫各種DML和DDL大面積超時穿挨,而各個web應(yīng)用對應(yīng)同一個數(shù)據(jù)庫(微服務(wù)不拆封數(shù)據(jù)庫就是坑)月弛,每個應(yīng)用的數(shù)據(jù)庫連接池最大連接數(shù)總和遠遠大于數(shù)據(jù)庫服務(wù)器的max_connections(連接池總數(shù)設(shè)置不合理)。
- 數(shù)據(jù)庫服務(wù)器
- SQL語句層面:DML語句在某個時刻出現(xiàn)指數(shù)級增長科盛,DDL語句出現(xiàn)大面積超時(大部分語句的open-table特別慢)帽衙。
- 操作系統(tǒng)層面:IO壓力很大,計算壓力基本沒有贞绵。
分析
- IO對于數(shù)據(jù)庫而言就是讀寫磁盤壓力變大厉萝,而數(shù)據(jù)庫的操作來源與SQL語句。DML語句和DDL語句可能都會讓數(shù)據(jù)庫Server進行IO的操作榨崩。
- DML語句一般會進行數(shù)據(jù)的落盤操作谴垫,這里就會引起數(shù)據(jù)的IO,而數(shù)據(jù)庫DML的突然增加會增大數(shù)據(jù)庫服務(wù)器的IO母蛛,從而出現(xiàn)IO被拉高翩剪。
- 對于DDL語句,一般會進行相關(guān)緩存溯祸,不會太多的IO操作肢专,我們發(fā)現(xiàn)很多DDL語句的open-table操作很慢。因為DML語句占據(jù)了大量IO焦辅,而DDL的open-table操作會進行IO博杖。那么,自然會很慢筷登。
方案
- 將突增的DML語句進行分散剃根,以降低數(shù)據(jù)庫IO的負載。
- 優(yōu)化DDL語句的open-table參數(shù)設(shè)置前方。在Mysql中table_open_cache參數(shù)就是用來設(shè)置對DDL語句對打開表的緩存狈醉。對于table_open_cache = max_connections * N ( the count of tables ) / 0.85