當前位置:首頁 » 硬碟大全 » 雙十一數據緩存架構
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

雙十一數據緩存架構

發布時間: 2022-07-01 05:18:55

㈠ 淘寶的資料庫怎麼搭建

我們也了解到,現在淘寶的整個的資料庫團隊在逐漸的把一些資料庫從Oracle遷移到Mysql,然後呢,把一些伺服器由小型機轉到PC server,那你們整個轉變的動機是什麼?
主要是因為業務壓力給了我們最大的動力。07年我來到淘寶的時候,當時只有三個主要的資料庫,全部在小型機和存儲上面。以當時的壓力來看,它跑起來是非常順利的,而且大家也知道小型機它從Unix操作系統到硬體,穩定性都會比PC server其實要高很多,當時的情況下淘寶用小型機是一個非常自然的選擇。
從07年開始淘寶的業務量保持每年自然翻一番的增長,資料庫質量感覺到非常大的壓力。那麼前端業務量增長一倍,在資料庫上有可能增長是好幾倍,它有一個放大效應在里邊。當時我們第一步能夠想到很自然的架構,就是把三個資料庫拆成更多的資料庫,或每一個資料庫支持一個比較單一的業務。比如用戶、商品和交易,都會分成獨立的資料庫,然後放到獨立的小型計算中去,這是我們08年做的很大的事情就是垂直拆分,然後08年的業務我們就頂住了。
當時我們就預估09年、10年會有更大的壓力增長,這個時候我們應該怎麼辦?當時我們從業界能看到很多的經驗分享,包括eBay、亞馬遜這些國外的大公司,他們的經驗分享裡面,水平拆分是我們資料庫漲到一定程度後的架構選擇。我們從Oracle到MySQL轉移,主要是用水平拆分,這是我們未來的一個弱點,那水平拆分後機器、資料庫的數量都會多很多,那Oracle它本身的成本也是我們考慮的一個重要因素,所以當時從成本考慮的話,那個時候我們自然會選擇用MySQL資料庫。
給我們再簡單總結一下這幾年,淘寶整個資料庫的演變過程?
剛才說到08年我們做完垂直拆分以後,09年到今年我們主要做的工作其實就是水平拆分。今年在十月份之前我們全部完成了淘寶最核心的三個系統:交易資料庫、商品資料庫和用戶資料庫的水平拆分。所以到「雙十一」之前,在我們內部采訪中,我一直跟采訪人員說,當時資料庫情緒穩定。基本上我們沒有做什麼事情,只是在不停的看報表,看數據,然後很開心的看到交易曲線以超過45度的趨勢往上漲。
那前期還是做了非常完善的准備。據我們了解在整個從小型機到PC server的遷移,包括從Oracle到MySQL資料庫的遷移,你們在做這個事情的時候,都做過好幾個月的壓力測試。你講講這個背景和故事。
是這樣的,今年我們年初決定,我們商品庫從小型機遷到PC server上面去,這是淘寶壓力最大的一個資料庫,當時是用四台小型機加兩個高端存儲來支撐的。要把這么大一個資料庫進行遷移,我們心裏面也是沒有底的,因為不知道要多少台PC server能夠支撐,需要什麼樣的配置來支撐這個壓力?當時我們能夠想到一個很直觀的想法就是模擬線上完全一樣的壓力,甚至加上幾倍的壓力來測它的極限值。
我們和開發團隊、我們的性能測試團隊,加上DBA團隊和ops團隊,成立了一個非常大的項目組,然後做了接近兩個月的性能測試,在整個測試過程中發現了非常多的問題,包括我們給Oracle、MySQL等廠商都提交了很多Bug,有些Bug也得到廠商回應,進行修復。
那整體的轉變的過程到現在進行到了什麼樣的程度?包括你在整個轉變的過程中遇到哪些問題?
我們現在最核心的用戶資料庫今年已經徹底完成了從小型機、存儲和Oracle切入到PC server加MySQL的架構。
我們內部有一個提法叫做去O、去I、去E,其實就是我們要從高端硬體Scale up模式到低端硬體的Scal out水平擴展的模式,這是淘寶內部最大最核心的系統,今年已經順利完成了全部區的水平擴展。其他幾個系統,比如說交易和商品已經完成了一部分,完成了水平拆分的一部分,但是沒有達到我們希望的進度,這可能是明年我們需要做的事情。
在轉型過程中主要遇到哪些問題?
讓我們覺得比較大的問題就是我們從可靠的小型機遷移到大規模,大數據量的PC server上來,從架構上就對我們就是一個非常大的挑戰。大家都知道,每一個PC server的穩定性肯定和單台小型機會有一定的差距,再加上我們一個機群有可能是32台或者64台PC server。每一台PC server即使有四個9的可用性,但如果我們整個系統合在一起,可能它最後的兩個9的可用性都達不到。這就需要我們從軟體層、架構層要做非常多的改進,能夠要讓單點的一些失效對整體的系統不造成任何影響,因為我們和架構部門、開發部門一起做了很多事情,才能保證我們的集群穩定上線。
其實「雙十一」這個時間應該說是對過去的技術轉變的檢驗,現在回頭來看,這個檢驗的結果怎麼樣?
當時是有點提心吊膽的,之後又覺得相對來說今年我們做的很多事情還是非常成功的。但是現在再回頭仔細想想還是有點後怕,「雙十一」那天的凌晨零點不是有一次Ipad的秒殺嗎,當天晚上我們都在線上觀察數據,在零點的一瞬間,就看到所有資料庫指標已經達到了以前正常時候最高峰的指標,有些甚至還超過了。
當天晚上睡覺的時候心裡就有點在打鼓:才零點就這個樣子了,明天下午明天晚上最高峰的時候我們應該怎麼渡過?所以第二天早上八點多的時候我們一進到指揮部裡面就看到所有的指標, 包括CDN的指標、各個業務線的指標、資料庫的指標都是噌噌的往上漲,這時心裏面其實是很忐忑不安的。
但是我們比較放心的是這三大核心系統,商品、用戶和交易,在我們今年所有的水平擴展項目做完了以後,比如說商品功能做完了以後,從我們的機械壓測裡面它是有十倍的流量的,所以當天百分之一百,百分之兩百的流量基本上對資料庫沒有造成太大的影響,所以當時還是很開心的看到這個指標快速的往上漲,希望交易能夠通過10個億、20個億,我覺得都是能夠承受的。
那對於整個資料庫架構的演進下一步有什麼打算?
下一步其實就是剛剛說的我們有幾個核心系統還沒有完全的做到這個水平擴展,加上「雙十一」那天我們還是有一個小驚險:我們有一個資料庫,跟交易核心有一點點聯系的,但它還是放在小型機上面,當時已經提前為它准備了百分之一百的餘量,就是說它可以承擔平時最高壓力的兩倍。
但是那天已經達到平時最高壓力的1.8倍左右的時候,把我們嚇出了一身冷汗。如果當時淘寶的交易最高峰的流量再增長20%的話,有可能資料庫就會到瓶頸了。所以我們明年是要把更多這種Scale up能夠看到天花板的資料庫全部要拆分成水平庫存這種資料庫。
那你剛才所提到的去Oracle,去小型機,去高端存儲,這個「三去」的整體思路給淘寶網帶來了哪些經濟上的效應?
當時我們知道小型機和存儲的價格是非常昂貴的,還是拿我們剛才說壓力最大的商品資料庫舉個例子,當初我們資料庫是用了四台高端的小型機,兩套高端的存儲,成本加起來起碼都是三千萬以上。那目前我們用的是32台PC server來搭建的一個機群,價格也就是300萬~500萬的級別。相對來說我們做完這個事情以後,解決了兩三千萬的硬體成本。
這樣來講,整體的經濟效益還是非常不錯的。但是其實剛才我們在前期溝通的時候也提到,你要從Oracle轉到MySQL,包括從小型機轉到PC server,其實裡面還是會遇到蠻多問題的,包括它的不穩定性等等,那對於這一方面你有沒有什麼經驗可談?
在這一方面,我覺得有兩個很重要的因素。第一個是我們需要和我們的開發前端應用架構部門能夠緊密的合作,能夠讓我們的應用融入剛才說的整個機群的單點失效和容災的問題。都需要我們和架構部門一起來考慮的;第二個比較大的經驗就是目前我們在做的,深入研究MySQL的源代碼。我們從研究和壓力測試的過程中,發現MySQL它本身代碼的一些缺陷,可能在高並發大壓力下會有很多隱藏的Bug。
在我們最近的這次測試當中,我們還發現了Facebook發布的FlashCache二級緩存的軟體,當時我們是測出它一個非常大的Bug:並發壓力非常大的情況下,它會導致MySQL成為一個僵屍進程。我們發現了以後,很快反饋給Face book,然後Face book很快就修復了這個問題,這也是我們對使用開源軟體帶來更大的一個信心,就是開源能夠在全球得到更多的支持,大家都能夠從原代碼層面來解決更深層次的一個問題。
我想這也可能是淘寶技術團隊現在那麼開放,那麼注重開源的動力之一。那如果說想對MySQL的一些核心代碼做編譯,就需要對人才的儲備,包括各方面資源整合的要求還是蠻大的,那你在這方面有沒有什麼感觸?
說到人才這個話題,08年的時候,淘寶當時准備大規模的往MySQL方向上轉,我們內部也是有一些置疑的聲音。他們說淘寶DDA團隊以前都是在Oracle方面比較專精,在業界來說,淘寶的DDA團隊在Oracle方面更加有名氣一些。所以我們內部有置疑的聲音。就是說你們有MySQL專家嗎,MySQL出問題了以後能很快的解決嗎?所以從08年到現在,我們慢慢的一路走過來,內部培養了很多的MySQL的人才,包括這幾年我們的應屆生的成長,再加上我們從外部招到一些專家,我們對MySQL的理解已經越來越深。
剛才說到,我們已經能夠給MySQL打Patch,已經能夠給MySQL report這些Bug。到現在為止,我覺得MySQL的成長已經達到了非常高的一個程度,我們對MySQL已經越來越有信心,但是未來淘寶的MySQL肯定是要做得越來越大的,淘寶還有很多小型機上面擴展不太容易的系統需要遷移到可擴展的機群上面來,但我們也希望業界能夠有更多的MySQL夥伴加入我們,和我們一起來做這么一件非常有意義的事情。
我想能夠加入到淘寶的技術團隊,去經歷那麼多有大交易量的技術實踐還是非常寶貴的。另外一個問題就是雖然說現在我們用的越來越多的是MySQL,但是現在大家也知道MySQL已經被Oracle收購了,那對像淘寶這樣的團隊有什麼影響呢?
大家都知道MySQL其實是基於GPL的協議來開源的軟體,那淘寶在使用過程中,前期是已經考慮到一些風險。所以我們所有的MySQL都是自己來做編譯做優化的,而且我想MySQL被Oracle收購了以後,現在看起來Oracle應該是給MySQL在開發這方面是提供了更大的幫助,像之前在Sun的時候,MySQL的版本相對來說是比較混亂的,包括我們現在在用的5.0和5.1的正式版本,最近還有包括開發方面就還有兩個,一個6.0,一個5.4,這些特性會互相交織在一起,讓我們選擇的時候也有點不知道到底選哪個版本會更好一點。但現在Oracle收購MySQL以後,他把5.4跟6.0這些版本已經合成了一個比較規范的5.5的版本,並且為它制訂了很好的一個milestone15:31,未來要怎麼發展這個里程碑,M1、M2、M3、M4這種發展方向,而到現在為止這個5.5已經發展到5.6、5.7的版本,而且已經是IC版本了,很快就要GA了,那我想這對於MySQL來說應該是一個好消息。我們可以用到更多更穩定的新特性, 5.5版本里有幾個新的特性是我們非常關注的,比如Google已經達到英文15:57這個pach,所以我們覺得對我們未來的這個MySQL這個系統非常有用的一個功能。那我們也等著Oracle的5.5這個版本能夠盡快的GA出來。

㈡ 2021年雙11成交額會有多少億從這份數據中你看出了什麼

從天貓獲悉,從11月1日0點到11日0點45分,已有382個品牌在天貓雙11的成交額超過1億元。其中不僅有華為、鴻星爾克等一大批人氣國貨品牌,也有蘋果、歐萊雅等國際品牌。百雀羚、回力這樣的老字型大小,蕉內、添可等新品牌,也躋身成交額過億之列。另外,已有411個去年成交額過百萬的中小品牌,今年銷售額突破千萬;更有40個去年雙11成交額千萬級的品牌,在今年雙11成交額突破了1億元大關。雖然今年的數據還沒有完全出來,但是預計,今年不會比去年差,去年雙十一成交額在4982億元,今年預計會達到5600億,這是和今年的經濟分不開的,今年的經濟形勢,雖然還是受到疫情的影響,但是明顯優於去年。雖然這兩年全球經濟形勢整體不好,但是谷市兩年還是很不錯的,從2600點漲到現在的3500點。

㈢ 如何統計分析雙十一天貓數據

首先說一個眾所周知的數據:2017年雙十一天貓成交額1682億。

數據來源:網路整理

涉及工具:BDP個人版、微輿情、微指數、wordart

㈣ 天貓雙11訂單峰值每秒50多萬筆,此數據可以看到什麼

2020年雙十一購物狂歡節是指2020年11月11日網路商品促銷日,這天的東西大多都很便宜,在雙十一這天有許多折扣或者優惠券之類的優惠活動,今年天貓雙十一訂單峰值每秒達到了50萬多筆。

天貓雙十一訂單峰值每秒50多萬筆,從中我們可以看出網購在現代社會越來越受歡迎,互聯網在人們生活中越來越重要,人們日常離不開互聯網和網購。雙十一是一個購物促銷節,今年熱詞出現“尾款人”、“打工人”,社會發展越來越具有年輕化,潮流話。

雙十一合理消費,理性購買,適量購買,適量消費。社會在進步,互聯網所佔地位提升。

㈤ 天貓雙十一是怎麼保證高並發,分布式系統中,數據一致性的

VPLEX的技術核心是「分布式緩存一致性」,下圖則是「分布式緩存一致性」技術的工作機制示意:正是因為這項核心技術優勢,使得VPLEX方案和目前所有廠商的虛擬化方案截然不同,並能夠實現異地的數據中心整合。對跨數據中心的所有負載實現跨引擎的平攤或者實時遷移,來自任何一個主機的I/O請求可以通過任何一個引擎得到響應。緩存一致性的記錄目錄使用少量的元數據,記錄下哪個數據塊屬於哪個引擎更新的,以及在何時更新過,並通過4K大小的數據塊告訴在集群中的所有其他的引擎。在整個過程中實際發生的溝通過程,遠遠比實際上正在更新數據塊少很多。分布式緩存一致性數據流示意圖:上方是一個目錄,記錄下左側的主機讀取緩存A的操作,並分發給所有引擎,右側主機需要讀取該數據塊時,會先通過目錄查詢,確定該數據塊所屬的引擎位置,讀取請求會直接發送給引擎,並直接從數據塊所在的緩存上讀取。當一個讀請求進入時,VPLEX會自動檢查目錄,查找該數據塊所屬的引擎,一旦確定該數據塊所屬的引擎位置,讀的請求會直接發送給該引擎。一旦一個寫入動作完成,並且目錄表被修改,這時另一個讀請求從另一個引擎過來,VPLEX會檢查目錄,並且直接從該引擎的緩存上讀取。如果該數據仍然在緩存上,則完全沒必要去磁碟上讀取。如上圖,來自圖中左側主機的操作,由CacheA服務,會記錄一個更新狀態,並分發給所有所有引擎知道。如果讀取的需求來自最右側的伺服器,首先通過目錄查詢。通過這種技術可以實現所有引擎一致性工作,而且這個技術不僅可以跨引擎還可以跨VPLEX集群,而VPLEX集群可以跨區域,因此緩存一致性也可以跨區域部署。分布式緩存一致性技術使VPLEX相比傳統的虛擬化方案擁有更高的性能和可靠性,並實現異地數據中心的虛擬化整合對傳統的虛擬化架構來說,如果虛擬化的I/O集群中有一個節點壞了,那麼性能就會降低一半,而且實際情況降低不止一半。因為壞了一個節點,這個節點緩存一般會被寫進去。因為沒有緩存,操作會直接寫到硬碟里。如果圖中中心這個節點壞掉,那主機所有的可用性都沒有了。而VPLEX如果有一個引擎或者一個控制器壞掉了,那這個引擎的負載會均攤到其他活動引擎上。這樣總體來講用戶可以維持可預知性能,性能降低也不那麼明顯。

㈥ 雙11是當下最大的網購活動之一,一天之內如此龐大的數據交互,淘寶是靠什麼解決的

有自己的ai技術,淘寶天貓每年都會舉辦618年中大促和雙十一大促,兩個活動淘寶商城都很重視,同樣也會舉辦活動去迎接這些日子,那麼這兩個的優惠上面有何區別?淘寶618和雙11哪個便宜呢?



參加雙十一的商品可同時參加同期的聚劃算,但正式活動的商品售價與聚劃算價必須保持一致,否則將被同時強制修改為報名的最低價格。但參加聚劃算秒殺活動的商品,無法同時報名參加雙11活動,即使同時報名參加雙十一,也會被系統自動請退出招商名單。
天貓表示,不會強制商家設置活動商品價格,但商家應確保所有價格真實有效,所有售價真實有效,不可在雙十一期間擅自提價、擅自提前結束活動。和往年不同的是,今年天貓將為消費者提供「11.11購物券」,天貓表示,這是專為天貓消費者開發的產品。報名參加「天貓雙十一全球狂歡節」的商家,店鋪全店商品均須支持使用「11.11購物券」。

㈦ 天貓雙十一是怎麼保證高並發,分布式系統中,數據一致性的

VPLEX的技術核心是「分布式緩存一致性」,下圖則是「分布式緩存一致性」技術的工作機制示意:正是因為這項核心技術優勢,使得VPLEX方案和目前所有廠商的虛擬化方案截然不同,並能夠實現異地的數據中心整合。對跨數據中心的所有負載實現跨引擎的平攤或者實時遷移,來自任何一個主機的I/O請求可以通過任何一個引擎得到響應。
緩存一致性的記錄目錄使用少量的元數據,記錄下哪個數據塊屬於哪個引擎更新的,以及在何時更新過,並通過4K大小的數據塊告訴在集群中的所有其他的引擎。在整個過程中實際發生的溝通過程,遠遠比實際上正在更新數據塊少很多。

分布式緩存一致性數據流示意圖:上方是一個目錄,記錄下左側的主機讀取緩存A的操作,並分發給所有引擎,右側主機需要讀取該數據塊時,會先通過目錄查詢,確定該數據塊所屬的引擎位置,讀取請求會直接發送給引擎,並直接從數據塊所在的緩存上讀取。
當一個讀請求進入時,VPLEX會自動檢查目錄,查找該數據塊所屬的引擎,一旦確定該數據塊所屬的引擎位置,讀的請求會直接發送給該引擎。一旦一個寫入動作完成,並且目錄表被修改,這時另一個讀請求從另一個引擎過來,VPLEX會檢查目錄,並且直接從該引擎的緩存上讀取。如果該數據仍然在緩存上,則完全沒必要去磁碟上讀取。
如上圖,來自圖中左側主機的操作,由Cache A服務,會記錄一個更新狀態,並分發給所有所有引擎知道。如果讀取的需求來自最右側的伺服器,首先通過目錄查詢。通過這種技術可以實現所有引擎一致性工作,而且這個技術不僅可以跨引擎還可以跨VPLEX集群,而VPLEX集群可以跨區域,因此緩存一致性也可以跨區域部署。

分布式緩存一致性技術使VPLEX相比傳統的虛擬化方案擁有更高的性能和可靠性,並實現異地數據中心的虛擬化整合
對傳統的虛擬化架構來說,如果虛擬化的I/O集群中有一個節點壞了,那麼性能就會降低一半,而且實際情況降低不止一半。因為壞了一個節點,這個節點緩存一般會被寫進去。因為沒有緩存,操作會直接寫到硬碟里。如果圖中中心這個節點壞掉,那主機所有的可用性都沒有了。而VPLEX如果有一個引擎或者一個控制器壞掉了,那這個引擎的負載會均攤到其他活動引擎上。這樣總體來講用戶可以維持可預知性能,性能降低也不那麼明顯。

㈧ 天貓雙十一是怎麼保證高並發、分布式系統中,數據一致性的

今年交易庫應該使用的還是全程參與過的Oceanbase0.5版,還可以回答一下 1.
數據一致性的保證,這是個分布式問題,解決方法就是就是Paxos協議。Oceanbase的updateserver節點由一個master和兩個slave組成,每條redolog都要保證寫master本地成功,並且任意一個slave確認持久化成功才算成功,否則不應答客戶端。工程實現上經過了簡化,比較類似raft,slave只能應答ID連續的日誌同步,而不是megastore里那樣,來一條就持久化一條(OB1.0是完美的Multi-Paxos,以後我單獨分享blog)。相對與mysql/oracle主備同步要在Maximum
Protection和的Maximum
availability之間取捨設計,Paxos最大的優勢在於,3台機器任意宕掉一台(或者說N台機器任意宕掉N/2台),剩下的機器可以繼續提供服務,而不必擔心丟失日誌。
2.
分庫分表事務怎麼辦,OB的事務都在單點updateserver上執行沒有分布式事務問題,由於交易庫壓力巨大,OB也部署了多個集群,但是交易庫的特性是沒有跨域交易的事務,因此盡管有一筆交易內的跨表事務,但是業務可以按照交易ID來分庫,庫與庫之間沒有事務操作。至於其他業務跨庫事務,是靠業務邏輯處理實現事務的。
3.
庫存加鎖是個好問題,OB和mysql優化方式不太一樣,本質是都是批處理,之前是聽說mysql通過將多條扣減庫存的sql合並為一條sql來優化的,優化邏輯需要處理sql解析,個人感覺比較定製化,後續優化成什麼樣就不太清楚了;而OB使用了多個優化設計:(1)對於並發扣減庫存的語句,引入了一種叫做「early
lock release」的機制來優化,在事務提交前釋放行鎖,使得對同一行的修改有可能能夠在一次group
commit提交;(2)擴充了sql語法增,類似存儲過程,使得insert,update能夠在一次auto
commit中完成,避免了持鎖與客戶端交互;(3)支持hint提示,讓客戶端能夠提示可能的沖突,使得我們可以將可能沖突的請求在一個線程中排隊處理。如上幾個優化效果很顯著,但是比較遺憾是,由於某些原因,OB當年沒有拿下庫存中心,後續才轉而主攻更核心的交易庫。

㈨ 如何搭建億級並發的系統架構

想設計億萬級高並發架構,你要先知道高並發是什麼?

面對流量高峰,不同的企業是如何通過技術手段解決高並發難題的呢?

0、引言

軟體系統有三個追求:高性能、高並發、高可用,俗稱三高。三者既有區別也有聯系,門門道道很多,全面討論需要三天三夜,本篇討論高並發。

高並發(High Concurrency)。並發是操作系統領域的一個概念,指的是一段時間內多任務流交替執行的現象,後來這個概念被泛化,高並發用來指大流量、高請求的業務情景,比如春運搶票,電商雙十一,秒殺大促等場景。

很多程序員每天忙著搬磚,平時接觸不到高並發,哪天受不了跑去面試,還常常會被面試官犀利的高並發問題直接KO,其實吧,高並發系統也不高深,我保證任何一個智商在線的看過這篇文章後,都能戰勝恐懼,重拾生活的信心。

本文先介紹高並發系統的度量指標,然後講述高並發系統的設計思路,再梳理高並發的關鍵技術,最後結合作者的經驗做一些延伸探討。

1、高並發的度量指標

既然是高並發系統,那並發一定要高,不然就名不副實。並發的指標一般有QPS、TPS、IOPS,這幾個指標都是可歸為系統吞吐率,QPS越高系統能hold住的請求數越多,但光關注這幾個指標不夠,我們還需要關注RT,即響應時間,也就是從發出request到收到response的時延,這個指標跟吞吐往往是此消彼長的,我們追求的是一定時延下的高吞吐。

比如有100萬次請求,99萬次請求都在10毫秒內響應,其他次數10秒才響應,平均時延不高,但時延高的用戶受不了,所以,就有了TP90/TP99指標,這個指標不是求平均,而是把時延從小到大排序,取排名90%/99%的時延,這個指標越大,對慢請求越敏感。

除此之外,有時候,我們也會關注可用性指標,這可歸到穩定性。

一般而言,用戶感知友好的高並發系統,時延應該控制在250毫秒以內。

什麼樣的系統才能稱為高並發?這個不好回答,因為它取決於系統或者業務的類型。不過我可以告訴你一些眾所周知的指標,這樣能幫助你下次在跟人扯淡的時候稍微靠點兒譜,不至於貽笑大方。

通常,資料庫單機每秒也就能抗住幾千這個量級,而做邏輯處理的服務單台每秒抗幾萬、甚至幾十萬都有可能,而消息隊列等中間件單機每秒處理個幾萬沒問題,所以我們經常聽到每秒處理數百萬、數千萬的消息中間件集群,而像阿某的API網關,每日百億請求也有可能。

2、高並發的設計思路

高並發的設計思路有兩個方向:

  • 垂直方向擴展,也叫豎向擴展

  • 水平方向擴展,也叫橫向擴展

  • 垂直方向:提升單機能力

    提升單機處理能力又可分為硬體和軟體兩個方面:

  • 硬體方向,很好理解,花錢升級機器,更多核更高主頻更大存儲空間更多帶寬

  • 軟體方向,包括用各快的數據結構,改進架構,應用多線程、協程,以及上性能優化各種手段,但這玩意兒天花板低,就像提升個人產出一樣,996、007、最多24 X 7。

  • 水平方向:分布式集群

    為了解決分布式系統的復雜性問題,一般會用到架構分層和服務拆分,通過分層做隔離,通過微服務解耦。

    這個理論上沒有上限,只要做好層次和服務劃分,加機器擴容就能滿足需求,但實際上並非如此,一方面分布式會增加系統復雜性,另一方面集群規模上去之後,也會引入一堆AIOps、服務發現、服務治理的新問題。

    因為垂直向的限制,所以,我們通常更關注水平擴展,高並發系統的實施也主要圍繞水平方向展開。

    3、高並發的關鍵技術

    玩具式的網路服務程序,用戶可以直連伺服器,甚至不需要資料庫,直接寫磁碟文件。但春運購票系統顯然不能這么做,它肯定扛不住這個壓力,那一般的高並發系統是怎麼做呢?比如某寶這樣的正經系統是怎麼處理高並發的呢?

    其實大的思路都差不多,層次劃分 + 功能劃分。可以把層次劃分理解為水平方向的劃分,而功能劃分理解為垂直方向的劃分。

    首先,用戶不能直連伺服器,要做分布式就要解決「分」的問題,有多個服務實例就需要做負載均衡,有不同服務類型就需要服務發現。

    集群化:負載均衡

    負載均衡就是把負載(request)均衡分配到不同的服務實例,利用集群的能力去對抗高並發,負載均衡是服務集群化的實施要素,它分3種:

  • DNS負載均衡,客戶端通過URL發起網路服務請求的時候,會去DNS伺服器做域名解釋,DNS會按一定的策略(比如就近策略)把URL轉換成IP地址,同一個URL會被解釋成不同的IP地址,這便是DNS負載均衡,它是一種粗粒度的負載均衡,它只用URL前半部分,因為DNS負載均衡一般採用就近原則,所以通常能降低時延,但DNS有cache,所以也會更新不及時的問題。

  • 硬體負載均衡,通過布置特殊的負載均衡設備到機房做負載均衡,比如F5,這種設備貴,性能高,可以支撐每秒百萬並發,還能做一些安全防護,比如防火牆。

  • 軟體負載均衡,根據工作在ISO 7層網路模型的層次,可分為四層負載均衡(比如章文嵩博士的LVS)和七層負載均衡(NGINX),軟體負載均衡配置靈活,擴展性強,阿某雲的SLB作為服務對外售賣,Nginx可以對URL的後半部做解釋承擔API網關的職責。

  • 所以,完整的負載均衡鏈路是 client <-> DNS負載均衡 -> F5 -> LVS/SLB -> NGINX

    不管選擇哪種LB策略,或者組合LB策略,邏輯上,我們都可以視為負載均衡層,通過添加負載均衡層,我們將負載均勻分散到了後面的服務集群,具備基礎的高並發能力,但這只是萬里長征第一步。

    資料庫層面:分庫分表+讀寫分離

    前面通過負載均衡解決了無狀態服務的水平擴展問題,但我們的系統不全是無狀態的,後面通常還有有狀態的資料庫,所以解決了前面的問題,存儲有可能成為系統的瓶頸,我們需要對有狀態存儲做分片路由。

    資料庫的單機QPS一般不高,也就幾千,顯然滿足不了高並發的要求。

    所以,我們需要做分庫分表 + 讀寫分離。

    就是把一個庫分成多個庫,部署在多個資料庫服務上,主庫承載寫請求,從庫承載讀請求。從庫可以掛載多個,因為很多場景寫的請求遠少於讀的請求,這樣就把對單個庫的壓力降下來了。

    如果寫的請求上升就繼續分庫分表,如果讀的請求上升就掛更多的從庫,但資料庫天生不是很適合高並發,而且資料庫對機器配置的要求一般很高,導致單位服務成本高,所以,這樣加機器抗壓力成本太高,還得另外想招。

    讀多寫少:緩存

    緩存的理論依據是局部性原理。

    一般系統的寫入請求遠少於讀請求,針對寫少讀多的場景,很適合引入緩存集群。

    在寫資料庫的時候同時寫一份數據到緩存集群里,然後用緩存集群來承載大部分的讀請求,因為緩存集群很容易做到高性能,所以,這樣的話,通過緩存集群,就可以用更少的機器資源承載更高的並發。

    緩存的命中率一般能做到很高,而且速度很快,處理能力也強(單機很容易做到幾萬並發),是理想的解決方案。

    CDN本質上就是緩存,被用戶大量訪問的靜態資源緩存在CDN中是目前的通用做法。

    緩存也有很多需要謹慎處理的問題:

  • 一致性問題:(a)更新db成功+更新cache失敗 -> 不一致 (b)更新db失敗+更新cache成功 -> 不一致 ©更新db成功+淘汰緩存失敗 -> 不一致

  • 緩存穿透:查詢一定不存在的數據,會穿透緩存直接壓到資料庫,從而導致緩存失去作用,如果有人利用這個漏洞,大量查詢一定不存在的數據,會對資料庫造成壓力,甚至打掛資料庫。解決方案:布隆過濾器 或者 簡單的方案,查詢不存在的key,也把空結果寫入緩存(設置較短的過期淘汰時間),從而降低命失

  • 緩存雪崩:如果大量緩存在一個時刻同時失效,則請求會轉到DB,則對DB形成壓迫,導致雪崩。簡單的解決方案是為緩存失效時間添加隨機值,降低同一時間點失效淘汰緩存數,避免集體失效事件發生

  • 但緩存是針對讀,如果寫的壓力很大,怎麼辦?

    高寫入:消息中間件

    同理,通過跟主庫加機器,耗費的機器資源是很大的,這個就是資料庫系統的特點所決定的。

    相同的資源下,資料庫系統太重太復雜,所以並發承載能力就在幾千/s的量級,所以此時你需要引入別的一些技術。

    比如說消息中間件技術,也就是MQ集群,它是非常好的做寫請求非同步化處理,實現削峰填谷的效果。

    消息隊列能做解耦,在只需要最終一致性的場景下,很適合用來配合做流控。

    假如說,每秒是1萬次寫請求,其中比如5千次請求是必須請求過來立馬寫入資料庫中的,但是另外5千次寫請求是可以允許非同步化等待個幾十秒,甚至幾分鍾後才落入資料庫內的。

    那麼此時完全可以引入消息中間件集群,把允許非同步化的每秒5千次請求寫入MQ,然後基於MQ做一個削峰填谷。比如就以平穩的1000/s的速度消費出來然後落入資料庫中即可,此時就會大幅度降低資料庫的寫入壓力。

    業界有很多著名的消息中間件,比如ZeroMQ,rabbitMQ,kafka等。

    消息隊列本身也跟緩存系統一樣,可以用很少的資源支撐很高的並發請求,用它來支撐部分允許非同步化的高並發寫入是很合適的,比使用資料庫直接支撐那部分高並發請求要減少很多的機器使用量。

    避免擠兌:流控

    再強大的系統,也怕流量短事件內集中爆發,就像銀行怕擠兌一樣,所以,高並發另一個必不可少的模塊就是流控。

    流控的關鍵是流控演算法,有4種常見的流控演算法。

  • 計數器演算法(固定窗口):計數器演算法是使用計數器在周期內累加訪問次數,當達到設定的限流值時,觸發限流策略,下一個周期開始時,進行清零,重新計數,實現簡單。計數器演算法方式限流對於周期比較長的限流,存在很大的弊端,有嚴重的臨界問題。

  • 滑動窗口演算法:將時間周期分為N個小周期,分別記錄每個小周期內訪問次數,並且根據時間滑動刪除過期的小周期,當滑動窗口的格子劃分的越多,那麼滑動窗口的滾動就越平滑,限流的統計就會越精確。此演算法可以很好的解決固定窗口演算法的臨界問題。

  • 漏桶演算法:訪問請求到達時直接放入漏桶,如當前容量已達到上限(限流值),則進行丟棄(觸發限流策略)。漏桶以固定的速率進行釋放訪問請求(即請求通過),直到漏桶為空。分布式環境下實施難度高。

  • 令牌桶演算法:程序以r(r=時間周期/限流值)的速度向令牌桶中增加令牌,直到令牌桶滿,請求到達時向令牌桶請求令牌,如獲取到令牌則通過請求,否則觸發限流策略。分布式環境下實施難度高。

  • 4、高並發的實踐經驗

    接入-邏輯-存儲是經典的互聯網後端分層,但隨著業務規模的提高,邏輯層的復雜度也上升了,所以,針對邏輯層的架構設計也出現很多新的技術和思路,常見的做法包括系統拆分,微服務。

    除此之外,也有很多業界的優秀實踐,包括某信伺服器通過協程(無侵入,已開源libco)改造,極大的提高了系統的並發度和穩定性,另外,緩存預熱,預計算,批量讀寫(減少IO),池技術等也廣泛應用在實踐中,有效的提升了系統並發能力。

    為了提升並發能力,邏輯後端對請求的處理,一般會用到生產者-消費者多線程模型,即I/O線程負責網路IO,協議編解碼,網路位元組流被解碼後產生的協議對象,會被包裝成task投入到task queue,然後worker線程會從該隊列取出task執行,有些系統會用多進程而非多線程,通過共享存儲,維護2個方向的shm queue,一個input q,一個output q,為了提高並發度,有時候會引入協程,協程是用戶線程態的多執行流,它的切換成本更低,通常有更好的調度效率。

    另外,構建漏斗型業務或者系統,從客戶端請求到接入層,到邏輯層,到DB層,層層遞減,過濾掉請求,Fail Fast(盡早發現盡早過濾),嘴大屁眼小,哈哈。

    漏斗型系統不僅僅是一個技術模型,它也可以是一個產品思維,配合產品的用戶分流,邏輯分離,可以構建全方位的立體模型。

    5、小結

    莫讓浮雲遮望眼,除去繁華識真顏。我們不能掌握了大方案,吹完了牛皮,而忽視了編程最本質的東西,掌握最基本最核心的編程能力,比如數據架構和演算法,設計,慣用法,培養技術的審美,也是很重要的,既要致高遠,又要盡精微。

㈩ 雙十一實時顯示銷售額使用哪些大數據技術

主要用的的大數據技術包括:大數據採集、大數據預處理、大數據存儲及管理、大數據分析及挖掘、大數據展現和應用(大數據檢索、大數據可視化、大數據應用、大數據安全等)。

十年來,阿里電商天貓淘寶,雙11的全天銷售額也是呈幾何數字增長:

2009年:0.52億

2010年:9億

2011年:52億

2012年:191億

2013年:350億

2014年:571億

2015年:912億

2016年:1207億

2017年:1682億

2018年:2135億

你使用觀向數據,是很不錯的一款電商數據採集軟體,這款軟體可以快速部署,並且可以採集到全網多平台、多維度數據,根據商品類目等要求,形成可視化報表,希望能幫到你。