昨晚,因?yàn)楹怂嵯到y(tǒng)崩潰,這家公司被罵上了熱搜第一
大家好,我是軒轅。
昨天晚上,成都因?yàn)橐咔橛忠淮紊狭藷崴?,而這一次,熱搜上的詞條是一家軟件公司的名字。
事情的起因是這樣的:
從9月1號(hào)開(kāi)始,成都市政府宣布了為期四天的全員核酸檢測(cè)。昨天下午,我們小區(qū)物業(yè)通知了預(yù)計(jì)14:00-17:00會(huì)進(jìn)行檢測(cè),告訴我們會(huì)挨個(gè)樓棟通知下去檢測(cè)。
結(jié)果一直拖到晚上也沒(méi)收到通知,我一直忙別的也沒(méi)留意,結(jié)果上網(wǎng)一看,關(guān)于成都核酸系統(tǒng)崩潰的各種段子已經(jīng)滿(mǎn)天飛了。
是的,成都核酸檢測(cè)系統(tǒng),又崩潰了!
辛苦的大白們沒(méi)有辦法,都用上了這種古老的方式來(lái)尋找“信號(hào)”。
因?yàn)檫@個(gè)系統(tǒng)出了問(wèn)題,導(dǎo)致核酸檢測(cè)工作非常緩慢,大量的市民排隊(duì)等待,平常排隊(duì)半小時(shí)能完成的,昨晚都要排隊(duì)好幾個(gè)小時(shí)。
到晚上23點(diǎn)半,物業(yè)直接通知只給部分人做,其他人可以洗洗睡了。好家伙,不知道有多少人白排了幾個(gè)小時(shí)隊(duì)。
這好好的系統(tǒng)它咋就崩潰了呢?
有網(wǎng)友挖出了一個(gè)中標(biāo)公告,說(shuō)這套系統(tǒng)背后使用的是浪潮的服務(wù)器:
一千多萬(wàn)的項(xiàng)目,結(jié)果就這?
但隨后,有疑似浪潮的人出來(lái)回復(fù):
人家說(shuō)的很清楚,上面中標(biāo)的只是基礎(chǔ)運(yùn)維,這套軟件系統(tǒng)的設(shè)計(jì)另有其人。
隨后有人又開(kāi)噴健康碼,噴鵝廠。
但實(shí)際上,崩的不是健康碼,而是大白使用的核酸采集錄入系統(tǒng),這是兩套獨(dú)立的系統(tǒng)。
再接著,有人爆出這套軟件是東軟公司做的。
于是一時(shí)間,所有人把怒火對(duì)準(zhǔn)了東軟,很快就把東軟這個(gè)詞條送上了微博熱搜榜第一的位置。
關(guān)于崩潰的原因,也有各種說(shuō)法在朋友圈、微信群里流傳,一時(shí)難辨真假。
有說(shuō)是這套系統(tǒng)背后使用的MySQL使用了超寬的大表:
有說(shuō)是MySQL單表容量太大,造成性能下降:
還有的說(shuō)是因?yàn)樨?fù)載均衡不行,沒(méi)法支撐高并發(fā)。
總結(jié)起來(lái)基本上就兩個(gè)原因:
1、數(shù)據(jù)庫(kù)的問(wèn)題,數(shù)據(jù)量大后,查詢(xún)檢索效率低下。
成都全市人口超過(guò)2000萬(wàn),每天一次核酸,那就是單日新增兩千萬(wàn)條記錄,最近幾天一直在做,數(shù)據(jù)容量很快就是幾億的規(guī)模,如果后端用MySQL還不分表,那確實(shí)夠嗆。
2、高并發(fā)的問(wèn)題,同一時(shí)間大量請(qǐng)求,服務(wù)器扛不住。
一般情況下,使用nginx負(fù)載均衡,單機(jī)能做到幾萬(wàn)的并發(fā)量。但成都2000W+的人口規(guī)模,全面做核酸的情況下,幾萬(wàn)的并發(fā)肯定是不夠用的。
倘若這套系統(tǒng)背后真的就是一個(gè)nginx+mysql(不分表),那昨晚的情況也就不足為奇了。
好了,吃瓜歸吃瓜,我們還是要來(lái)點(diǎn)干貨,作為一個(gè)程序員,要在吃瓜中學(xué)會(huì)成長(zhǎng)。
高并發(fā)之路
這篇文章,我們來(lái)回答一個(gè)問(wèn)題:到底該怎么做高并發(fā)?
讓我們從零開(kāi)始。
1、單機(jī)時(shí)代
一開(kāi)始的時(shí)候,用戶(hù)量很少,一天就幾百上千個(gè)請(qǐng)求,一臺(tái)服務(wù)器就完全足夠。
我們用Java、Python、PHP或者其他后端語(yǔ)言開(kāi)發(fā)一個(gè)Web后端服務(wù),再用一個(gè)MySQL來(lái)存儲(chǔ)業(yè)務(wù)數(shù)據(jù),它倆攜手工作,運(yùn)行在同一臺(tái)服務(wù)器上,對(duì)外提供服務(wù)。
2、應(yīng)用與數(shù)據(jù)庫(kù)分離
慢慢的,用戶(hù)量開(kāi)始多了起來(lái),一臺(tái)服務(wù)器有點(diǎn)夠嗆,把它們拆開(kāi)成兩臺(tái)服務(wù)器,一臺(tái)專(zhuān)門(mén)運(yùn)行Web服務(wù),一臺(tái)專(zhuān)門(mén)用來(lái)運(yùn)行數(shù)據(jù)庫(kù),這樣它們就能獨(dú)享服務(wù)器上的CPU和內(nèi)存資源,不用互搶了。
3、緩存系統(tǒng)
后來(lái),用戶(hù)量進(jìn)一步增加,每一次都要去數(shù)據(jù)庫(kù)里查,有點(diǎn)費(fèi)時(shí)間,引入一個(gè)緩存系統(tǒng),可以有效縮短服務(wù)的響應(yīng)時(shí)間。
4、軟件負(fù)載均衡
用戶(hù)量還在增加,一個(gè)Web服務(wù)的吞吐量開(kāi)始達(dá)到了上限,系統(tǒng)開(kāi)始出現(xiàn)卡頓。這時(shí)候,可以復(fù)制多個(gè)Web服務(wù)出來(lái),再用一個(gè)nginx來(lái)進(jìn)行負(fù)載均衡,將請(qǐng)求分?jǐn)偟剿蠾eb服務(wù)器上,提高并發(fā)量。
5、數(shù)據(jù)讀寫(xiě)分離
隨著系統(tǒng)的運(yùn)行和用戶(hù)的增長(zhǎng),數(shù)據(jù)量越來(lái)越多,數(shù)據(jù)庫(kù)的瓶頸開(kāi)始顯現(xiàn),讀寫(xiě)明顯變慢。這時(shí)候,可以增加新的數(shù)據(jù)庫(kù)服務(wù)器,將讀寫(xiě)進(jìn)行分離,二者做好數(shù)據(jù)同步,提高數(shù)據(jù)庫(kù)服務(wù)的整體I/O性能。
6、數(shù)據(jù)庫(kù)分庫(kù)分表
系統(tǒng)中的數(shù)據(jù)越來(lái)越多,即便是讀寫(xiě)分離了,但一張表中的記錄越來(lái)越多,從幾百萬(wàn)到幾千萬(wàn),甚至要過(guò)億了。把它們?nèi)咳谕粡埍砝?,檢索查詢(xún)耗時(shí)費(fèi)力,是時(shí)候進(jìn)行分庫(kù)分表,把數(shù)據(jù)拆分一下,提高數(shù)據(jù)查詢(xún)效率。
7、硬件負(fù)載均衡
再后來(lái),業(yè)務(wù)發(fā)展很不錯(cuò),用戶(hù)量激增,以至于強(qiáng)勁的Nginx也扛不住了。
一臺(tái)不夠,那就多整幾臺(tái),再引入一個(gè)硬件負(fù)載均衡的服務(wù)器,比如F5,將網(wǎng)絡(luò)流量分發(fā)到不同的Nginx服務(wù)器上,再一次提高性能。
8、DNS負(fù)載均衡
再再后來(lái),用戶(hù)量還在蹭蹭蹭的增長(zhǎng),強(qiáng)悍如F5這樣的硬件負(fù)載均衡服務(wù)器也扛不住這樣的高并發(fā)。
老辦法,一個(gè)不夠那就多整幾個(gè)。這一次,咱們?cè)谟蛎馕錾舷鹿Ψ?,不同地區(qū)的用戶(hù),在訪問(wèn)同一個(gè)域名時(shí),解析到不同的IP地址,以此來(lái)將流量進(jìn)一步拆分。
上面就是從最簡(jiǎn)單的單機(jī)到復(fù)雜集群的高并發(fā)演進(jìn)之路。
高并發(fā)是一個(gè)很大的話題,它所涵蓋的東西其實(shí)遠(yuǎn)遠(yuǎn)不止上面這些內(nèi)容。除了這些之外,像是消息隊(duì)列、數(shù)據(jù)庫(kù)選型、CDN、編程語(yǔ)言中的協(xié)程等等技術(shù)都能為提高并發(fā)助力。
回到這次崩潰事件上,我想著經(jīng)過(guò)一夜的折騰,今天總該好點(diǎn)了吧,結(jié)果下午一開(kāi)始,又繼續(xù)擺爛了:
在我寫(xiě)這篇文章的時(shí)候,當(dāng)事公司已經(jīng)發(fā)布了說(shuō)明:
網(wǎng)絡(luò):你的意思是怪我咯?