數(shù)據(jù)庫(kù)“炸了”谱俭,加CPU加內(nèi)存奉件?或許還有更好的解決方法!

01?概述

之前在做業(yè)務(wù)應(yīng)用系統(tǒng)壓力測(cè)試項(xiàng)目的時(shí)候昆著,發(fā)現(xiàn)大部分性能不達(dá)標(biāo)的應(yīng)用县貌,問(wèn)題都出在數(shù)據(jù)庫(kù)上。數(shù)據(jù)庫(kù)壓力過(guò)大是每個(gè)業(yè)務(wù)經(jīng)理都多多少少面臨過(guò)的問(wèn)題凑懂,那么解決的辦法除了縱向提高數(shù)據(jù)庫(kù)配置之外煤痕,是否還有其他更高效的途徑呢?


02?原因分析

眾所周知接谨,單臺(tái)數(shù)據(jù)庫(kù)實(shí)例的配置是有瓶頸的摆碉,特別是關(guān)系型數(shù)據(jù)庫(kù),當(dāng)CPU和內(nèi)存配置提高到一定程度后脓豪,性能就不再提升了巷帝,即使對(duì)數(shù)據(jù)庫(kù)的內(nèi)核進(jìn)行優(yōu)化,也只能稍微抬高這個(gè)瓶頸線扫夜。

在我經(jīng)歷過(guò)的應(yīng)用系統(tǒng)壓力測(cè)試工作中發(fā)現(xiàn)楞泼,大廠提供的應(yīng)用產(chǎn)品通常服務(wù)器壓力和數(shù)據(jù)庫(kù)壓力是基本持平的,小的開(kāi)發(fā)商提供的應(yīng)用系統(tǒng)往往是服務(wù)器還沒(méi)有明顯壓力历谍,CPU现拒、內(nèi)存使用率都很低,數(shù)據(jù)庫(kù)卻已經(jīng)“炸了”望侈。

所以印蔬,底層代碼邏輯上是否與數(shù)據(jù)庫(kù)合理交互是原因之一,有經(jīng)驗(yàn)的開(kāi)發(fā)工程師會(huì)思考如何盡可能地少與數(shù)據(jù)庫(kù)交互脱衙,把推拉數(shù)據(jù)庫(kù)完成的功能模塊轉(zhuǎn)化為通過(guò)服務(wù)器計(jì)算來(lái)完成侥猬,從而將數(shù)據(jù)庫(kù)壓力轉(zhuǎn)移到服務(wù)器上。

我們還可以有效利用Redis捐韩、MQ等中間件退唠,分擔(dān)數(shù)據(jù)庫(kù)壓力。當(dāng)已經(jīng)無(wú)法通過(guò)上面方案降低數(shù)據(jù)庫(kù)壓力后荤胁,還可以采用分布式數(shù)據(jù)庫(kù)瞧预、主從讀寫(xiě)分離數(shù)據(jù)庫(kù)來(lái)橫向擴(kuò)展數(shù)據(jù)庫(kù)性能。從原理上分析仅政,橫向擴(kuò)展數(shù)據(jù)庫(kù)性能是可以無(wú)限提高數(shù)據(jù)庫(kù)承壓能力的垢油。

所以,我準(zhǔn)備從產(chǎn)品代碼圆丹、中間件滩愁、讀寫(xiě)分離三塊來(lái)講解如何優(yōu)化應(yīng)用對(duì)數(shù)據(jù)庫(kù)的使用,提升應(yīng)用系統(tǒng)性能辫封。


03?在代碼層面消化數(shù)據(jù)庫(kù)壓力

在代碼層面可以通過(guò)創(chuàng)建索引轉(zhuǎn)移壓力兩種方式給數(shù)據(jù)庫(kù)減壓硝枉。

索引是MySQL和Oracle數(shù)據(jù)庫(kù)本身提供的功能廉丽,合理創(chuàng)建索引可以提高數(shù)據(jù)檢索效率,降低數(shù)據(jù)庫(kù)IO和CPU的消耗妻味。

在開(kāi)發(fā)初期正压,我們就應(yīng)該根據(jù)數(shù)據(jù)庫(kù)模型表和字段的作用來(lái)決定是否為該表建立索引,因?yàn)樗饕矔?huì)降低更新表的速度弧可,所以我們可以為數(shù)據(jù)記錄較多的表中蔑匣,頻繁作為查詢(xún)條件的字段建立索引,而經(jīng)常增刪改的表或字段則不適合創(chuàng)建索引棕诵。

轉(zhuǎn)移壓力則要求我們?cè)诰帉?xiě)代碼的時(shí)候裁良,時(shí)刻留意代碼中是否過(guò)多的與數(shù)據(jù)庫(kù)進(jìn)行交互,這些交互是否可以減少或者甚至可以不交互校套,以其他方式就能夠達(dá)到相同的輸入輸出价脾。

例如一個(gè)功能模塊的代碼寫(xiě)下來(lái),發(fā)現(xiàn)多次調(diào)用了同一條數(shù)據(jù)笛匙,就可以將數(shù)據(jù)存為參數(shù)侨把,供函數(shù)多次使用。


04?給數(shù)據(jù)庫(kù)請(qǐng)個(gè)保姆——中間件

能否合理利用中間件是考驗(yàn)一個(gè)開(kāi)發(fā)技術(shù)經(jīng)理的標(biāo)準(zhǔn)之一妹孙,合理利用各種中間件的優(yōu)勢(shì)秋柄,可以有效提高產(chǎn)品性能。在數(shù)據(jù)讀取壓力大的場(chǎng)景中蠢正,往往會(huì)引入RedisMQ中間件骇笔。


Redis緩存數(shù)據(jù)庫(kù)是將數(shù)據(jù)以鍵值對(duì)的形式緩存在內(nèi)存中的高效數(shù)據(jù)庫(kù)。

在開(kāi)發(fā)中嚣崭,我們可以將一些頻繁讀取的數(shù)據(jù)放到Redis中笨触,例如中簽公告、人員名單雹舀、產(chǎn)品清單等芦劣,用戶(hù)在訪問(wèn)這些數(shù)據(jù)的時(shí)候,如果發(fā)現(xiàn)緩存中有數(shù)據(jù)说榆,直接取用虚吟,不僅減輕了數(shù)據(jù)庫(kù)的壓力,讀取速度還特別快签财,因?yàn)閮?nèi)存的讀寫(xiě)速率是普通機(jī)械硬盤(pán)的幾百倍稍味。

MQ消息隊(duì)列中間件常用于流量消峰和消息分發(fā)。

利用MQ將同一時(shí)刻的大量請(qǐng)求分散成一段時(shí)間來(lái)處理荠卷,可以有效減輕數(shù)據(jù)庫(kù)負(fù)擔(dān);另外把消息發(fā)布到MQ中供多個(gè)服務(wù)監(jiān)聽(tīng)烛愧,也能達(dá)到減少數(shù)據(jù)查詢(xún)的次數(shù)的效果油宜。


05?忍法——數(shù)據(jù)庫(kù)分身術(shù)

上面幾種方法只是在應(yīng)用系統(tǒng)的軟實(shí)力上做文章掂碱,為數(shù)據(jù)庫(kù)減壓,但面對(duì)真正龐大的流量襲來(lái)時(shí)慎冤,還是得下硬功夫——提升數(shù)據(jù)庫(kù)自身的讀寫(xiě)性能疼燥。


縱向提高數(shù)據(jù)庫(kù)配置

加CPU、加內(nèi)存蚁堤,性能提升也是有限的醉者,幸運(yùn)的是,目前大部分?jǐn)?shù)據(jù)庫(kù)都支持分布式架構(gòu)披诗,或主從讀寫(xiě)分離架構(gòu)撬即。


分布式架構(gòu)

分布式架構(gòu)可以讓多個(gè)計(jì)算機(jī)系統(tǒng)設(shè)備共同組成一個(gè)數(shù)據(jù)庫(kù),提供完整的數(shù)據(jù)庫(kù)服務(wù)呈队,例如Oracle剥槐、MongoDB、TDSQL等宪摧,增加計(jì)算機(jī)系統(tǒng)的數(shù)量粒竖,就能提高數(shù)據(jù)庫(kù)性能,理論上可以無(wú)限提高几于,這也是天貓雙十一能承受幾十億并發(fā)壓力的秘訣之一蕊苗。


主從讀寫(xiě)分離架構(gòu)

是一個(gè)主數(shù)據(jù)庫(kù)用來(lái)寫(xiě)入數(shù)據(jù),另外搭建幾個(gè)從數(shù)據(jù)庫(kù)用來(lái)讀取數(shù)據(jù)沿彭,主數(shù)據(jù)庫(kù)會(huì)把數(shù)據(jù)同步到幾個(gè)從數(shù)據(jù)庫(kù)中朽砰,這樣就能將數(shù)據(jù)庫(kù)的讀取壓力分散到從數(shù)據(jù)庫(kù)中,從而實(shí)現(xiàn)數(shù)據(jù)庫(kù)的減壓膝蜈。


06?總結(jié)

由于用戶(hù)體量較小锅移,我們目前開(kāi)發(fā)的應(yīng)用還未在數(shù)據(jù)庫(kù)壓力上出現(xiàn)過(guò)問(wèn)題,但是經(jīng)過(guò)幾次壓力測(cè)試項(xiàng)目工作饱搏,能夠提前對(duì)大體量的業(yè)務(wù)應(yīng)用性能障礙有一定的了解非剃。為避免出現(xiàn)業(yè)務(wù)數(shù)據(jù)庫(kù)壓力過(guò)大等問(wèn)題,筆者通過(guò)思考以及結(jié)合自身的技術(shù)經(jīng)驗(yàn)推沸,分享上述解決方法备绽,供各位同行參考。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鬓催,一起剝皮案震驚了整個(gè)濱河市肺素,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宇驾,老刑警劉巖倍靡,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異课舍,居然都是意外死亡塌西,警方通過(guò)查閱死者的電腦和手機(jī)他挎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)捡需,“玉大人办桨,你說(shuō)我怎么就攤上這事≌净裕” “怎么了呢撞?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)饰剥。 經(jīng)常有香客問(wèn)我殊霞,道長(zhǎng),這世上最難降的妖魔是什么捐川? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任脓鹃,我火速辦了婚禮,結(jié)果婚禮上古沥,老公的妹妹穿的比我還像新娘瘸右。我一直安慰自己,他們只是感情好岩齿,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布太颤。 她就那樣靜靜地躺著,像睡著了一般盹沈。 火紅的嫁衣襯著肌膚如雪龄章。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天乞封,我揣著相機(jī)與錄音做裙,去河邊找鬼。 笑死肃晚,一個(gè)胖子當(dāng)著我的面吹牛锚贱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播关串,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼拧廊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了晋修?” 一聲冷哼從身側(cè)響起吧碾,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎墓卦,沒(méi)想到半個(gè)月后倦春,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年溅漾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了山叮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡添履,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出脑又,到底是詐尸還是另有隱情暮胧,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布问麸,位于F島的核電站往衷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏严卖。R本人自食惡果不足惜席舍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哮笆。 院中可真熱鬧来颤,春花似錦、人聲如沸稠肘。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)项阴。三九已至滑黔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間环揽,已是汗流浹背略荡。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留歉胶,地道東北人汛兜。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像跨扮,于是被迫代替她去往敵國(guó)和親序无。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容