聽說你們的數(shù)據(jù)庫并發(fā) 2 萬就跪了?
發(fā)布日期:2022/11/24 10:45:42 瀏覽量:
如果各位看官的 SQL 數(shù)據(jù)庫真有 2W+ 高并發(fā),那真是要恭喜你。你已經(jīng)比很多公司的 MIS 都要前衛(wèi)得多。2W 和 2K 差別有那么大嗎,嗯,真是有的。2K 并發(fā)的 MIS 系統(tǒng)也經(jīng)常有無法訪問,timeout 的異常,處理這些異常已經(jīng)夠很多朋友苦惱的了。2W+ 的并發(fā)那需要懂的知識框架就更復(fù)雜了。
筆者曾服務(wù)了 500W+ 用戶的電商系統(tǒng),7*24 小時的噩夢再也不想見
前幾年在一家擁有 500 多萬直銷顧問的團隊做電商平臺。平時的流量很平穩(wěn),基本都在千把,月底拼業(yè)績才會沖一沖,來個 1W+ 的并發(fā)。大部分的數(shù)據(jù)庫開發(fā)人員在日常中還是沒心沒肺沒壓力的。但電商系統(tǒng)有個慣例,都是淘寶帶出來的,會搞促銷,類似于雙 11. 一到這時間段,必須隨時警惕流量是不是井噴,一旦跨越紅線,系統(tǒng)就跟前期的 12306 一樣,頻頻延遲。隨著 DBA 組的介入,才慢慢搞定這難題。本文的初衷也來自于這段經(jīng)歷的總結(jié)。
單實例數(shù)據(jù)庫應(yīng)用
這種應(yīng)用架構(gòu)最簡單,UI + 應(yīng)用服務(wù)器 + 數(shù)據(jù)庫服務(wù)器,所有的請求,無論讀寫都直接拋給數(shù)據(jù)庫。往往項目初期,為了迅速的證明自己的點子靠譜,拿到市場,我們會選擇這樣的架構(gòu)來實現(xiàn)產(chǎn)品。此時往往 10 萬用戶注冊了,但每天訪問的人數(shù)剛過 200, 每張數(shù)據(jù)庫表的總數(shù),最大也不會超過 5000 條。這樣的應(yīng)用,開發(fā)能力強的,1 個人就可以搞定,業(yè)務(wù)復(fù)雜的需要分前端和后端。但無論如何都屬于基礎(chǔ)項目,如果你工作 3,4 了還是停留在這種模式下,那該補補課了。

事物總是在發(fā)展之中的,只要系統(tǒng)正常運行,總有一天用戶量會加大,隨之而來的請求會超乎你的想象(前提你是做了 pv, uv 的數(shù)據(jù)分析),很快這種架構(gòu)會遇到用戶超過 100 萬,日訪問量超過 20 萬,峰值并發(fā) 2 萬,而數(shù)據(jù)庫的表會趨近于億級的量。此時應(yīng)用系統(tǒng)如果還是建立在當(dāng)初的硬件基礎(chǔ)上(比如 16GB,16 核,240GB 硬盤)應(yīng)該會明顯感覺得到拖卡慢的尷尬,增多的是用戶的抱怨和投訴。就像 12306 前期的購票一樣,往往輪到你的時候,票沒了。

多實例數(shù)據(jù)庫
遇到流量起來的應(yīng)用,如果壓力確定是在數(shù)據(jù)庫上了,那么分庫是必然的事情了。將一個大庫拆成若干小庫,保持?jǐn)?shù)據(jù)庫對象都一致,這樣每個小庫分?jǐn)偟粢徊糠至髁?,?yīng)用終將回歸第一種簡單架構(gòu)上來,將用戶服務(wù)好。以現(xiàn)在的硬件服務(wù) 4000 個并發(fā),對于不復(fù)雜的商用沒有問題。具體能負(fù)責(zé)多少看系統(tǒng)上線后的 baseline (基線)監(jiān)測,這里我們假定 4000 并發(fā)。所以分成 5 個相同的庫,來做分庫。這樣同時寫入 4000 并發(fā)夠用。

這里會遇到一個技術(shù)細(xì)節(jié),就是分庫路由。如何將流量均攤到每個庫里,是需要研制算法的。比如已知全國用戶分布均衡,即華東、華北、華西、華南和華中,各有 4000 用戶。我們依據(jù)地理位置分成 5 個庫,根據(jù)用戶身份證哈希成 5 個散列值,分別對應(yīng)了這 5 臺數(shù)據(jù)庫,用戶就被分流了。
只要用戶不是劇烈增長,老板也滿意這種小而美的生意,這樣的架構(gòu)可以一直沿用下去?;静粫衅款i。頂多就是時間長了,表數(shù)據(jù)越來越大了,我們用分庫的思想進行分表就可以了。當(dāng)前年份(月份)數(shù)據(jù)放在主表里面,而歷史數(shù)據(jù)就歸檔到聚合表里;或者索性每月,每年分成子表存儲,而跨時間段的查詢用視圖來控制。
但用戶的行為始終是不可控的,我么必須做一系列的事情來滿足和留住用戶。比如促銷、打折、團購等等。這個時候,用戶的行為不僅僅是下個單買杯咖啡這么簡單了。他們會大量查詢他們的數(shù)據(jù),帶來的是讀請求遠遠大于寫入請求。眾所周知,讀請求即使不影響寫入請求(比如 MVVC),但也會耗盡服務(wù)器的 CPU\IO\Network 資源。那么我們必須更進入一層,讀寫分離。
讀寫分離
讀寫分離是另一種分庫,但與前面的分庫意圖不一樣。分出來的庫和源庫一模一樣,且只讀不接收用戶的寫入請求。實現(xiàn)細(xì)節(jié)每個數(shù)據(jù)庫都不一樣,也可以使用實時同步工具做,詳情可以參考《Designing Data-Intensive Applications》這本書。不僅僅給出了指導(dǎo)思想,更有每種數(shù)據(jù)庫的讀寫分離組件指南。

- 時序數(shù)據(jù)庫方興未艾,有人卻說看到了終局
-
看場景、重實操,實時數(shù)倉不是“紙上談兵”
- 作業(yè)幫多云架構(gòu)設(shè)計與實踐
馬上咨詢: 如果您有業(yè)務(wù)方面的問題或者需求,歡迎您咨詢!我們帶來的不僅僅是技術(shù),還有行業(yè)經(jīng)驗積累。
QQ: 39764417/308460098 Phone: 13 9800 1 9844 / 135 6887 9550 聯(lián)系人:石先生/雷先生