佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > 怎么從技術(shù)的角度去分析12306實現(xiàn)高流量高并發(fā)的問題

怎么從技術(shù)的角度去分析12306實現(xiàn)高流量高并發(fā)的問題

熱門標(biāo)簽:Win7旗艦版 蘋果 電銷機(jī)器人 鐵路電話系統(tǒng) 解決方案 科大訊飛語音識別系統(tǒng) Linux服務(wù)器 阿里云

  12306網(wǎng)站曾被認(rèn)為是“全球最忙碌的網(wǎng)站”,在應(yīng)對高并發(fā)訪問處理方面,曾備受網(wǎng)民詬病。因此記者在第一時間聯(lián)系到一位對12306改造非常關(guān)注的技術(shù)架構(gòu)師,他從技術(shù)的角度,用科學(xué)論證的方式,指出原因所在,并根據(jù)他的經(jīng)驗進(jìn)一步說明12306是如何實現(xiàn)高流量高并發(fā)的關(guān)鍵技術(shù),與大家共享。以下為正文:

  前言:

  12306互聯(lián)網(wǎng)售票系統(tǒng)在2011年下半年開始上線使用,但在2012年春運(yùn)期間引發(fā)無數(shù)的爭議。在2012年春運(yùn)后,12306項目承接單位與多家IT公司聯(lián)系,經(jīng)過多次論證和POC 測試, 最終引入分布式內(nèi)存運(yùn)算數(shù)據(jù)管理云平臺 - Pivotal Gemfire做試點(diǎn),用以提高12306系統(tǒng)性能,解決“高流量和高并發(fā)“的難題。

  高流量高并發(fā)是指某特定時間段的海量請求,根據(jù)過去的經(jīng)驗法則,高并發(fā)是指訪問流量是平常流量的 3-5倍;但由于互聯(lián)網(wǎng)和移動設(shè)備apps的普遍化,電商網(wǎng)站的促銷模式“11.11“,或是廠商的“饑餓營銷“,都會衍生“秒殺“現(xiàn)象。所以過去的經(jīng)驗法則用到12306春運(yùn)售票系統(tǒng),往往是遠(yuǎn)遠(yuǎn)低于實際的的流量。例如,12306平常一天的PV(page views)值大約是在 2500萬到 3000萬左右, 在2015年春運(yùn)高峰日的PV值是297億,流量增加1000倍,這樣海量的請求,假如不能在短時間內(nèi)動態(tài)調(diào)整網(wǎng)絡(luò)帶寬或增加服務(wù)器數(shù)量,就會造成網(wǎng)絡(luò)阻塞或是服務(wù)器性能無法滿足要求,甚至使整個系統(tǒng)不穩(wěn)定。

  12306成長之路

  短短的3年,從2012年春運(yùn)到2015年春運(yùn),12306網(wǎng)站從10億的PV(page views)值增加到297億PV值,PV值成長 30倍;網(wǎng)絡(luò)帶寬從 1.5G調(diào)整到12G,帶寬成長8倍;而12306的售票量從110萬增加到564萬 ,成長5倍。出票處理能力從 每秒200張?zhí)嵘?每秒1032張,也是5倍的成長。

  PV值的增加是與放票的次數(shù)和可出售的票量有關(guān)系,例如,2015年P(guān)V值是2014年的2.3倍, 原因是放票次數(shù)多了5次“秒殺”,另外增加12% 的售票量。由此可見,互聯(lián)網(wǎng)流量PV值的增加速度遠(yuǎn)遠(yuǎn)高于售票量增加的速度。

  高流量除了代表網(wǎng)絡(luò)容易造成阻塞以外,系統(tǒng)服務(wù)器也會面臨更高的CPU負(fù)載,在此情況下又該如何應(yīng)對呢?是選擇基于原來系統(tǒng)框架上購買更昂貴的硬件做“scale up“升級呢 ?還是選擇購買低成本的x86服務(wù)器,進(jìn)行”可擴(kuò)展云平臺架構(gòu)“ scale out的改造設(shè)計呢?12306互聯(lián)網(wǎng)購票系統(tǒng)的改造給我們一個很好的案例參考,也讓政府單位和企業(yè)進(jìn)一步了解了具體是如何實現(xiàn)的。

  12306改造的關(guān)鍵技術(shù)– 建立可伸縮擴(kuò)展的云應(yīng)用平臺

  2015年12306網(wǎng)站順利過關(guān),沒有“癱瘓”,是值得慶祝的。根據(jù)互聯(lián)網(wǎng)上的新聞,中國鐵道科學(xué)研究院電子計算技術(shù)研究所副所長,12306網(wǎng)站技術(shù)負(fù)責(zé)人朱建生說,為了應(yīng)對2015年春運(yùn)售票高峰,該網(wǎng)站采取5項措施:一是利用外部云計算資源分擔(dān)系統(tǒng)查詢業(yè)務(wù),可根據(jù)高峰期業(yè)務(wù)量的增長按需及時擴(kuò)充。二是通過雙中心運(yùn)行的架構(gòu),系統(tǒng)內(nèi)部處理容量擴(kuò)充一倍,可靠性得到有效保證。三是對系統(tǒng)的互聯(lián)網(wǎng)接入帶寬進(jìn)行擴(kuò)容,并可根據(jù)流量情況快速調(diào)整,保證高峰時段旅客順暢訪問網(wǎng)站。四是防范惡意搶票,通過技術(shù)手段屏蔽搶票軟件產(chǎn)生的惡意流量,保證網(wǎng)站健康運(yùn)行,維護(hù)互聯(lián)網(wǎng)售票秩序。五是制定了多套應(yīng)急預(yù)案,以應(yīng)對突發(fā)情況。

  “利用云計算資源“,“按需及時擴(kuò)充“和”快速調(diào)整“,這幾個字眼是12306改造的精神,其核心就是要建立一個從下到上全面“可伸縮擴(kuò)展的云平臺”。底層的硬件架構(gòu)要支持可伸縮擴(kuò)展,上層的應(yīng)用系統(tǒng)架構(gòu)也需要支持可伸縮擴(kuò)展。

  1. 在過去數(shù)年,云計算的基礎(chǔ)架構(gòu)虛擬化已經(jīng)非常成熟,也日益普遍部署;當(dāng)網(wǎng)絡(luò)阻塞時,可以動態(tài)增加帶寬,當(dāng)服務(wù)器 CPU到達(dá)高位時,可以快速從資源池獲取虛擬機(jī)資源來分?jǐn)傌?fù)荷。 “軟件定義的數(shù)據(jù)中心“ 可以輕易完成這些伸縮性擴(kuò)展的配置。

  2. 當(dāng)客戶將底層的架構(gòu)都虛擬化后,網(wǎng)絡(luò)設(shè)備,Web服務(wù)器,應(yīng)用服務(wù)器都可以做“伸縮性”的擴(kuò)展;但遇到一個難點(diǎn)就是“12306的應(yīng)用系統(tǒng)框架”無法支持可伸縮擴(kuò)展。原因是關(guān)系型數(shù)據(jù)庫Sybase無法支持“應(yīng)用系統(tǒng)”的伸縮擴(kuò)展。

  3. 客戶在過去數(shù)年已經(jīng)投入大筆經(jīng)費(fèi)在IT方面的建設(shè),但“系統(tǒng)框架設(shè)計”還是沿用10幾年前的三層設(shè)計,而且每年都在原來的基礎(chǔ)上做不斷的升級。當(dāng)業(yè)務(wù)不斷成長時,數(shù)據(jù)量也跟著成長,功能越來越多, 但系統(tǒng)性能越來越差。客戶該如何選擇呢 ?是 scale up? 還是 scale out ?

  為什么選擇Pivotal Gemfire構(gòu)建12306的云應(yīng)用平臺?

  要解決12306春運(yùn)時高流量高并發(fā)的問題,如果單靠硬件升級解決的話,可能需要擴(kuò)充數(shù)十倍的硬件服務(wù)器。但在春運(yùn)以后,又該如何解決服務(wù)器過剩的問題呢?

  要真正解決“高流量,高并發(fā)“的難題是需要從軟件和應(yīng)用系統(tǒng)層面出發(fā),唯有實現(xiàn)“可擴(kuò)展的應(yīng)用云平臺架構(gòu)”,靈活和快速熱部署的機(jī)制,才是真正解決高并發(fā)訪問的根本。

  在經(jīng)過多次論證和POC測試后, 12306 最后選擇Pivotal Gemfire作為系統(tǒng)改造的平臺,其主要原因如下:

  1. 關(guān)聯(lián)數(shù)據(jù)節(jié)點(diǎn)設(shè)計:可以根據(jù)客戶的業(yè)務(wù)邏輯特性和數(shù)據(jù)關(guān)聯(lián)性,將關(guān)聯(lián)性強(qiáng)的數(shù)據(jù)放置于同一個服務(wù)器節(jié)點(diǎn),提高系統(tǒng)性能,避免分布式系統(tǒng)服務(wù)器的頻繁數(shù)據(jù)交換。

  2. 將數(shù)據(jù)移到內(nèi)存:由于數(shù)據(jù)是放在內(nèi)存里面,屏蔽傳統(tǒng)數(shù)據(jù)庫頻繁訪問, CPU與數(shù)據(jù)庫的交互作用,影響服務(wù)器性能。內(nèi)存的數(shù)據(jù)交換速度遠(yuǎn)高于磁盤速度上千倍, 極大提高系統(tǒng)性能。

  3. 擴(kuò)展和伸縮性:以Gemfire構(gòu)建的應(yīng)用云平臺,是以 x86 PC服務(wù)器為主的硬件基礎(chǔ)。在保證系統(tǒng)的性能下,此平臺可以隨著客戶業(yè)務(wù)的成長來任意調(diào)配x86服務(wù)器的數(shù)量,避免以后昂貴的硬件升級帶來的困擾。經(jīng)POC測試結(jié)果顯示,整個系統(tǒng)性能可隨著服務(wù)器的數(shù)量的增加實現(xiàn)幾乎線性的成長。

  4. 數(shù)據(jù)可靠性:在同個集群里面可以有多個數(shù)據(jù)節(jié)點(diǎn)備份,數(shù)據(jù)可以自動同步,或是將內(nèi)存數(shù)據(jù)持久化到硬盤或是數(shù)據(jù)庫

  5. 跨地域的數(shù)據(jù)分布或同步 :可以透過“廣域網(wǎng)”將指定的 Gemfire集群的內(nèi)存數(shù)據(jù)“實時同步”到異地的數(shù)據(jù)中心。這是屬于“應(yīng)用層”的數(shù)據(jù)同步異于傳統(tǒng)的“數(shù)據(jù)庫”同步。

  6. Pivotal Gemfire使用 x86 PC服務(wù)器,其性價比遠(yuǎn)遠(yuǎn)高于 Unix 小型機(jī)。

  (1)網(wǎng)絡(luò)阻塞是個門檻

  網(wǎng)絡(luò)是進(jìn)入12306征程的起點(diǎn),網(wǎng)絡(luò)帶寬快慢往往決定“秒殺“的結(jié)果,這在很多電商網(wǎng)站促銷時時常發(fā)生, 因此12306也無法避免。下面數(shù)字是由互聯(lián)網(wǎng)收集得到的,可能有偏差。但我們盡可能根據(jù)這些數(shù)目字來解析數(shù)年來網(wǎng)絡(luò)原因發(fā)生的問題。

  2012 年:12306 第一次在春運(yùn)使用, 網(wǎng)絡(luò)帶寬1.5G,可以支持最大的PV值是11,250;根據(jù)報導(dǎo),此系統(tǒng)有10,000人的登陸限制, 假如每人每秒點(diǎn)擊一次的話,理論上是可以勉強(qiáng)支持正常的點(diǎn)擊量。

  但在購票尖峰日,有上千萬的網(wǎng)民第一次上網(wǎng)購票,在無法登陸的情況下, 用戶不斷刷取首頁,或是已登陸者無法得到系統(tǒng)的及時反應(yīng),不斷點(diǎn)擊頁面,產(chǎn)生大量的請求,造成網(wǎng)絡(luò)和系統(tǒng)的高負(fù)載,導(dǎo)致崩潰。

  2013年 :寬帶增加一倍到達(dá)3G頻寬,有20萬用戶登陸的限制,采取10次放票,分散流量,防止買票過度集中;但不幸的是“刷票軟件”橫行,每秒可以刷票數(shù)十次到數(shù)百次,高峰期有25萬的PV值, 遠(yuǎn)遠(yuǎn)超過帶寬的最大理論值 22,500 PV。

  2014年 : 寬帶增加到達(dá)5G,16次放票,有屏蔽刷票軟件搶票的設(shè)計,有效阻擋90%的點(diǎn)擊,但實名制有漏洞,每秒還是有15萬次的瀏覽需求,遠(yuǎn)超過37,500 PV的的理論帶寬承載量。

  2015年 : 12306有21次放票,增加帶寬到12G,手機(jī)訂票(流量小)分擔(dān)25%的12306售票,解決實名制的問題,可以阻擋95% 刷票軟件的點(diǎn)擊量,每秒最大有117,800次的瀏覽請求,此數(shù)目字已經(jīng)很接近理論帶寬承載量117,400 PV值。

  根據(jù)上述解析, 2012年 – 2014年春運(yùn)的網(wǎng)絡(luò)帶寬給12306帶來很多問題。根據(jù)網(wǎng)民的反應(yīng),在2015年12306帶寬在 12G的情況下,雖然稍微有點(diǎn)卡, 但是大致的反應(yīng)還是不錯的。此輪點(diǎn)與我們的推論是大致符合。

  1. PV值和放票次數(shù)是根據(jù)互聯(lián)網(wǎng)的報導(dǎo)。

  2. 2013年與2014年的PV值有10倍的差異, 2014年多了6次放票時段,票的出售量增加90%。但在 2013年,極有可能是大部分的票量集中在少數(shù)時段就放完,減少多次的“秒殺“發(fā)生。

  3. 2012和2013年, 12306 沒有屏蔽搶票軟件的設(shè)置。在2014年以后,實現(xiàn)了基本的屏蔽功能。 假設(shè)此在2014年可以阻擋90%搶票軟件的點(diǎn)擊, 在2015年可以阻擋 95%的點(diǎn)擊。

  4. 在2015年, 假設(shè)互聯(lián)網(wǎng)的平均PV值的數(shù)據(jù)量是15K byte, 手機(jī)上網(wǎng)的PV值是 1K byte,占有25%的流量。

  5. 帶寬最大理論P(yáng)V值/秒 : 1G的帶寬是1,000,000,000 bit/second,1 byte = 8 bits.

  2015年平均PV值 =11.5K byte (含手機(jī)上網(wǎng)), 2012-2014年的PV值= 15K bytes。

  另外,假設(shè)考慮網(wǎng)絡(luò)IP協(xié)議交換有10%的損耗。

  6. 瀏覽請求最大PV值/秒:假設(shè)在每個放票時段,搶票的高峰期是5分鐘(含查詢, 下單,付款等操作),在高峰期5分鐘的下載流量是整個時段下載總量50%;

  再假設(shè)有效的瀏覽下載量是5%上傳的請求點(diǎn)擊量,換句話說,有95%的點(diǎn)擊量被屏蔽,可能是阻擋刷票軟件,或是網(wǎng)絡(luò)阻塞丟包,或是系統(tǒng)忙碌沒有反應(yīng)等等。

  (2)服務(wù)器集群性能無法伸縮性擴(kuò)展

  參考互聯(lián)網(wǎng)上的資料,12306服務(wù)器集群是傳統(tǒng)的三層架構(gòu)設(shè)計,如果不考慮最前端的F5負(fù)載均衡服務(wù)器,它是由 數(shù)百部 Web服務(wù)器集群和應(yīng)用服務(wù)器集群構(gòu)成前端,64部數(shù)據(jù)庫小型機(jī)集群(用于專門實現(xiàn)并行計算每班車次的余票量),和訂單處理服務(wù)器集群構(gòu)成后端。從專業(yè)的角度來看,此種框架設(shè)計是中規(guī)中矩的,國內(nèi)99%的框架設(shè)計師都是如此設(shè)計。

  如前述所提,由于Sybase數(shù)據(jù)庫的原因,此種設(shè)計無法做伸縮性的擴(kuò)展。因此,12306要進(jìn)一步提高性能就面臨很大的抉擇。在此,先了解服務(wù)器集群性能與實際需求之間有多少差距。

  回顧2012年到2015年,12306系統(tǒng)在這3年內(nèi)有很大的變化。

  1. 2012年春運(yùn) :根據(jù)互聯(lián)網(wǎng)上的信息,2012年 12306設(shè)計的售票指標(biāo)是在100萬張票的銷售,這完全低估了互聯(lián)網(wǎng)網(wǎng)民的實際需求,在尖峰日,有上千萬人登陸。網(wǎng)絡(luò)帶寬,Web服務(wù)器集群,應(yīng)用服務(wù)器集群,余票查詢/計算集群,到訂單處理集群, 這些設(shè)備性能完全無法應(yīng)付高流量高并發(fā)的請求。由于極大的低估互聯(lián)網(wǎng)的需求,造成12306整個系統(tǒng)不穩(wěn)定。

  在12306系統(tǒng),余票查詢/計算子系統(tǒng)是最復(fù)雜的, 最耗損服務(wù)器CPU資源。在整個客票系統(tǒng)里,有數(shù)十條行車路線,有3000多個車次(G,D,K,Z,C,..),5000多個火車站,不同的席次(硬座,硬臥, 軟座, 軟臥, etc),座位等級(商務(wù), 一等, 二等),和車票等級(一般,軍人, 學(xué)生,殘障,小孩)等因素,將這些參數(shù)換算成數(shù)學(xué)模型,那可是有數(shù)千億條的排列組合。

  2012年的余票計算系統(tǒng)實際處理能力據(jù)估計不會超過 300-400 TPS,而有效的余票查詢請求遠(yuǎn)遠(yuǎn)高于3000 QPS (query per second)。另外,系統(tǒng)每隔10分鐘更新車次的余票,這些余票信息是沒有參考價值,因為在10分鐘里已經(jīng)售出數(shù)十萬張票。如果要滿足余票計算的需求達(dá)到至少 3000 TPS, 那么12306 需要再增加6倍的服務(wù)器,即將近 400部小型機(jī)(原有系統(tǒng)有64部服務(wù)器)。

  2. 2013年春運(yùn):在2012年6月進(jìn)行第一步余票查詢/計算改造,使用Pivotal Gemfire改造后的結(jié)果是每秒至少支持 10,000 TPS 以上,此數(shù)目字已經(jīng)足夠應(yīng)付高并發(fā)的需求,因此在2013年春運(yùn)余票查詢順利過關(guān)。 由于集群計算能力大增,余票更新縮短到每隔2分鐘提供最及時的信息。

  在余票查詢瓶頸移除后,訂單處理服務(wù)器的瓶頸就出現(xiàn)在訂單排隊,網(wǎng)民必須等待數(shù)十秒到數(shù)十分鐘才會得到訂單的確認(rèn)。訂單的請求累積高達(dá)數(shù)千甚至數(shù)萬個以上,估計當(dāng)時訂單處理服務(wù)器的處理能力不超過 200-300 TPS。

  3. 2014年:在2013年后,進(jìn)行“訂單分庫二級查詢”處理,將訂單生成與訂單查詢分開處理。因為訂單查詢的數(shù)量遠(yuǎn)遠(yuǎn)超過訂單生成的數(shù)量。因此, 12306將查詢訂單的熱點(diǎn)數(shù)據(jù)放在Gemfire集群, 將歷史訂單數(shù)據(jù)放在Hadoop集群。如此設(shè)計,不但提高訂單查詢的功能數(shù)十倍,而且訂單生成的性能至少也提高5倍以上(使用原有服務(wù)器)。

  4. 2015年:進(jìn)一步使用Gemfire優(yōu)化整個 12306系統(tǒng),總共建立5個Gemfire集群。另外建立三個數(shù)據(jù)中心(高鐵公司, 鐵科院,和阿里云),在阿里云上部署數(shù)百個虛擬機(jī)(有 Web服務(wù)器,應(yīng)用服務(wù)器,和余票查詢服務(wù)器集群)分流余票查詢75%的流量,因為余票查詢流量占據(jù)12306整體流量的90%。

  平均每次放票量尖峰有效余票

  計算請求(QPS)余票計算能力(TPS)尖峰期訂單

  處理請求(TPS)訂單處理能力(TPS)

  2012415,000> 3000300-400》 1600200

  2013265,000> 3000》 10,000》 1030500

  2014313,000> 3000》 10,000 12001000

  2015268,500> 3000》 10,00010501000

  在12306系統(tǒng),余票計算的結(jié)果是放在“數(shù)據(jù)緩存應(yīng)用服務(wù)器”,在2012年每隔10分鐘更新每班車次的余票結(jié)果。如果新請求與上次更新的時間間隔低于10分鐘,數(shù)據(jù)緩存系統(tǒng)就直接返回上次計算的結(jié)果。而在10分鐘左右再重新計算新的請求。在10分鐘的間隔,服務(wù)器集群需要計算3000多個車次的余票結(jié)果。自2013年以后,12306系統(tǒng)每隔2分鐘更新車次余票結(jié)果。

  使用Gemfire改造后12306的現(xiàn)狀和啟示

  2015年的春運(yùn)購票期間12306系統(tǒng)的表現(xiàn)是很令人矚目的,它的效果和影響總結(jié)如下:

  1. 提供“高并發(fā),低延遲”的解決方案,一勞永逸,不用煩惱后續(xù)硬件升級的問題

  2. 通過GemFire多集群技術(shù),實現(xiàn)多重的高可用性,確保高峰壓力下和系統(tǒng)異常的情況下保證業(yè)務(wù)的持續(xù)性。

  3. 構(gòu)建一個可擴(kuò)展的云應(yīng)用平臺架構(gòu),靈活和快速熱部署的機(jī)制,為未來混合云的部署打基礎(chǔ)。

  4. 余票查詢集群性能提升 :

  使用數(shù)十部 x86服務(wù)器 (或是上百部虛擬機(jī))可以達(dá)到 10,000 TPS以上,提升原來系統(tǒng)性能達(dá)30倍以上。原來的系統(tǒng)是使用64部Unix 小型機(jī)。

  余票信息更新從原來10分鐘縮短到2分鐘,使信息更有參考價值。

  5. 12306“訂單分庫二級查詢”子系統(tǒng):

  將訂單生成與訂單查詢分庫處理,訂單查詢性能提高50倍, 訂單生成性能提高4-5倍。

  將熱點(diǎn)訂單放在Gemfire集群,將歷史訂單數(shù)據(jù)放在Hadoop集群。這是快數(shù)據(jù)和大數(shù)據(jù)結(jié)合的完美案例。

  6. 混合云的應(yīng)用:

  使用Gemfire改造后的分布式系統(tǒng),極易分散部署到不同的數(shù)據(jù)中心

  例如,余票查詢子系統(tǒng)可以獨(dú)立于原來的大系統(tǒng)部署到公有云上,同時也可以再將此子系統(tǒng)一分為二,將另一部分服務(wù)器部署在私有云的數(shù)據(jù)中心。即按業(yè)務(wù)需求隨時部署所需要的資源,來解決高并發(fā)的難題

標(biāo)簽:湖州 三門峽 安陽 辛集 畢節(jié) 呼倫貝爾 湘西 邵陽

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《怎么從技術(shù)的角度去分析12306實現(xiàn)高流量高并發(fā)的問題》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    阳泉市| 南宁市| 济宁市| 吉林市| 浙江省| 得荣县| 永修县| 东阿县| 平阴县| 含山县| 获嘉县| 鄂伦春自治旗| 新乡市| 洪雅县| 扬州市| 兴国县| 长宁区| 永年县| 怀集县| 正宁县| 九江县| 灵台县| 莱西市| 襄樊市| 纳雍县| 昔阳县| 酉阳| 岢岚县| 集贤县| 万盛区| 同仁县| 同心县| 清丰县| 谷城县| 宜春市| 襄汾县| 江油市| 大足县| 吴堡县| 含山县| 揭东县|