一讹挎、背景
有一天如筛,dba在數(shù)據(jù)庫告警群找到我,說我們數(shù)據(jù)庫CPU有規(guī)律性的尖刺则涯,qps每次突然增加500+复局,尖刺時(shí)cpu飆升到60%,沒尖刺時(shí)只有5%左右
這種情況對系統(tǒng)造成的穩(wěn)定性風(fēng)險(xiǎn)極高
粟判,要我們盡快排查亿昏,盡早排除隱患。下面是當(dāng)時(shí)的數(shù)據(jù)庫qps監(jiān)控
二档礁、排查與溝通過程
由于是規(guī)律性的尖刺角钩,我們想到我們的定時(shí)job
, 我們業(yè)務(wù)有一個(gè)業(yè)務(wù)配置
緩存數(shù)據(jù),通過Java程序的定時(shí)job從數(shù)據(jù)庫加載到本地內(nèi)存的,而且時(shí)間也吻合。
通過查看代碼递礼,我們是一個(gè)單機(jī)的job每,5分鐘加載一次惨险,每臺機(jī)器都是分頁從數(shù)據(jù)庫讀取配置數(shù)據(jù)
,每次讀取100條
脊髓,然后寫到本地的內(nèi)存里辫愉。
這里有兩個(gè)問題,單機(jī)的job和分頁查詢将硝,我們生產(chǎn)環(huán)境有50臺機(jī)器恭朗,這樣查詢db的qps會(huì)放大
,造成數(shù)據(jù)庫壓力擴(kuò)大依疼。
和dba進(jìn)行了溝通冀墨,dba給了我們兩條建議:
1、要我們不要分頁查詢涛贯,直接一次性查詢所有的配置數(shù)據(jù)诽嘉。
2、不要用本地緩存弟翘,直接使用redis虫腋,這樣就一份數(shù)據(jù),操作數(shù)據(jù)庫的qps也降低了稀余。
三悦冀、第一次優(yōu)化
由于是c端系統(tǒng),而且業(yè)務(wù)配置緩存是系統(tǒng)的熱點(diǎn)數(shù)據(jù)
睛琳,考慮到系統(tǒng)穩(wěn)定性
第一盒蟆,我們第一次沒有大的改動(dòng),試圖調(diào)高了
分頁的limit
大小师骗,觀測數(shù)據(jù)庫的監(jiān)控历等,cpu使用率有下降,但是還是有尖刺,這樣還有慢sql
情況辟癌。
四寒屯、第二次優(yōu)化
由于尖刺仍然存在,對數(shù)據(jù)庫還是有一定的壓力
黍少,且現(xiàn)在的方案存在優(yōu)化空間
寡夹,為了徹底消除數(shù)據(jù)庫隱患,因此我們開始了第二輪優(yōu)化厂置。
我們需要解決的問題:
1菩掏、降低數(shù)據(jù)庫qps
,消除cpu尖刺
2昵济、不影響查詢熱點(diǎn)配置數(shù)據(jù)的性能
因?yàn)槊颗_機(jī)器都請求數(shù)據(jù)庫智绸,分頁查詢
請求或颊,我們想著降低請求qps,因此我們?nèi)コ瓉磉@種單機(jī)定時(shí)加載緩存
方式传于,換成加載緩存到redis囱挑,這樣就只要一臺機(jī)器啟動(dòng)一個(gè)定時(shí)任務(wù)了,這樣可以降低數(shù)據(jù)庫的qps沼溜。由一個(gè)定時(shí)任務(wù)每5分鐘執(zhí)行一次平挑,加載到redis。
不影響原來的查詢性能系草,肯定不能直接查詢r(jià)edis,因此我們引入了本地緩存框架Caffine
,本地緩存從redis查詢數(shù)據(jù)通熄。這樣就形成了二級緩存架構(gòu)
。
整個(gè)緩存改造涉及三個(gè)階段:
第一階段:使用xxljob
定時(shí)job加載緩存到redis
第二階段:程序啟動(dòng)初次加載緩存
找都,加載數(shù)據(jù)到本地緩存
第三階段:Caffine緩存未命中場景唇辨,單線程從緩存或者數(shù)據(jù)庫加載
五、測試與上線流程
這次屬于技術(shù)升級
能耻,需要測試回歸相關(guān)業(yè)務(wù)才能上線赏枚,整體測試與上線流程如下:
1、測試回歸業(yè)務(wù)功能晓猛,開關(guān)驗(yàn)證
2饿幅、灰度驗(yàn)證
3、分機(jī)器發(fā)布
4戒职、全量發(fā)布
先發(fā)布一臺機(jī)器節(jié)點(diǎn)栗恩,觀測了幾天業(yè)務(wù)情況,觀測沒問題之后再分批次發(fā)布洪燥,直到所有機(jī)器節(jié)點(diǎn)發(fā)布完成磕秤。
六、最終效果
經(jīng)過優(yōu)化上線捧韵,數(shù)據(jù)庫的qps和cpu使用率下來了市咆,也沒有了尖刺,徹底消除了數(shù)據(jù)庫隱患纫版。
七床绪、總結(jié)
數(shù)據(jù)庫是業(yè)務(wù)系統(tǒng)強(qiáng)依賴
的中間件,保障其穩(wěn)定性至關(guān)重要其弊,本文是根據(jù)實(shí)際性能優(yōu)化經(jīng)驗(yàn),從架構(gòu)設(shè)計(jì)
和代碼層面
優(yōu)化數(shù)據(jù)庫的使用膀斋,降低數(shù)據(jù)庫qps和cpu使用率梭伐,提高數(shù)據(jù)庫的穩(wěn)定性
。
通過這次優(yōu)化實(shí)踐
仰担,給以后業(yè)務(wù)功能的設(shè)計(jì)開發(fā)也有一定的啟發(fā)糊识,一個(gè)好的方案設(shè)計(jì)
可以避免系統(tǒng)風(fēng)險(xiǎn)绩社,提高資源利用率,作為程序員可以利用每次新功能的設(shè)計(jì)開發(fā)經(jīng)驗(yàn)赂苗,不斷的積累比較好的方案
愉耙,提升我們自身的能力。
堅(jiān)持相信有輸入一定要有輸出拌滋,加油朴沿。