偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

同事老是吐槽我的接口性能差,原來真兇就在這里

開發(fā) 架構
這篇文章咱們繼續(xù)來聊一下,百億級別的海量數(shù)據(jù)場景下還要支撐每秒十萬級別的高并發(fā)查詢,這個架構該如何演進和設計?

一、前情回顧

上篇文章:《??為什么每個程序員都必須堅持寫博客?這篇文章教你怎么寫??》聊了一下系統(tǒng)架構中,百億流量級別高并發(fā)寫入場景下,如何承載這種高并發(fā)寫入,同時如何在高并發(fā)寫入的背景下還能保證系統(tǒng)的超高性能計算。

這篇文章咱們繼續(xù)來聊一下,百億級別的海量數(shù)據(jù)場景下還要支撐每秒十萬級別的高并發(fā)查詢,這個架構該如何演進和設計?

咱們先來看看目前系統(tǒng)已經(jīng)演進到了什么樣的架構,大家看看下面的圖:

首先回顧一下,整個架構右側部分演進到的那個程度,其實已經(jīng)非常的不錯了,因為百億流量,每秒十萬級并發(fā)寫入的場景,使用MQ限流削峰、分布式KV集群給抗住了。

接著使用了計算與存儲分離的架構,各個Slave計算節(jié)點會負責提取數(shù)據(jù)到內(nèi)存中,基于自研的SQL內(nèi)存計算引擎完成計算。同時采用了數(shù)據(jù)動靜分離的架構,靜態(tài)數(shù)據(jù)全部緩存,動態(tài)數(shù)據(jù)自動提取,保證了盡可能把網(wǎng)絡請求開銷降低到最低。

另外,通過自研的分布式系統(tǒng)架構,包括數(shù)據(jù)分片和計算任務分布式執(zhí)行、彈性資源調(diào)度、分布式高容錯機制、主備自動切換機制,都能保證整套系統(tǒng)的任意按需擴容,高性能、高可用的的運行。

下一步,咱們來研究研究架構里的左側部分

二、日益膨脹的離線計算結果

其實大家會注意到,在左側還有一個MySQL,那個MySQL就是用來承載實時計算結果和離線計算結果放在里面匯總的。

終端的商家用戶就可以隨意的查詢MySQL里的數(shù)據(jù)分析結果,支撐自己的決策,他可以看當天的數(shù)據(jù)分析報告,也可以看歷史上任何一段時期內(nèi)的數(shù)據(jù)分析報告。

但是那個MySQL在早期可能還好一些,因為其實存放在這個MySQL里的數(shù)據(jù)量相對要小一些,畢竟是計算后的一些結果罷了。但是到了中后期,這個MySQL可是也岌岌可危了。

給大家舉一個例子,離線計算鏈路里,如果每天增量數(shù)據(jù)是1000萬,那么每天計算完以后的結果大概只有50萬,每天50萬新增數(shù)據(jù)放入MySQL,其實還是可以接受的。

但是如果每天增量數(shù)據(jù)是10億,那么每天計算完以后的結果大致會是千萬級,你可以算他是計算結果有5000萬條數(shù)據(jù)吧,每天5000萬增量數(shù)據(jù)寫入左側的MySQL中,你覺得是啥感覺?

可以給大家說說系統(tǒng)當時的情況,基本上就是,單臺MySQL服務器的磁盤存儲空間很快就要接近滿掉,而且單表數(shù)據(jù)量都是幾億、甚至十億的級別。

這種量級的單表數(shù)據(jù)量,你覺得用戶查詢數(shù)據(jù)分析報告的時候,體驗能好么?基本當時一次查詢都是幾秒鐘的級別。很慢。

更有甚者,出現(xiàn)過用戶一次查詢要十秒的級別,甚至幾十秒,上分鐘的級別。很崩潰,用戶體驗很差,遠遠達不到付費產(chǎn)品的級別。

所以解決了右側的存儲和計算的問題之后,左側的查詢的問題也迫在眉睫。新一輪的重構,勢在必行!

三、分庫分表 + 讀寫分離

首先就是老一套,分庫分表 + 讀寫分離,這個基本是基于MySQL的架構中,必經(jīng)之路了,畢竟實施起來難度不是特別的高,而且速度較快,效果比較顯著。

整個的思路和之前第一篇文章:《??別光看NB的Github開源項目,你得參考他們?nèi)ピO計自己的架構??》講的基本一致。

說白了,就是分庫后,每臺主庫可以承載部分寫入壓力,單庫的寫并發(fā)會降低;其次就是單個主庫的磁盤空間可以降低負載的數(shù)據(jù)量,不至于很快就滿了;

而分表之后,單個數(shù)據(jù)表的數(shù)據(jù)量可以降低到百萬級別,這個是支撐海量數(shù)據(jù)以及保證高性能的最佳實踐,基本兩三百萬的單表數(shù)據(jù)量級還是合理的。

然后讀寫分離之后,就可以將單庫的讀寫負載壓力分離到主庫和從庫多臺機器上去,主庫就承載寫負載,從庫就承載讀負載,這樣避免單庫所在機器的讀寫負載過高,導致CPU負載、IO負載、網(wǎng)絡負載過高,最后搞得數(shù)據(jù)庫機器宕機。

首先這么重構一下數(shù)據(jù)庫層面的架構之后,效果就好的多了。因為單表數(shù)據(jù)量降低了,那么用戶查詢的性能得到很大的提升,基本可以達到1秒以內(nèi)的效果。

四、每秒10萬查詢的高并發(fā)挑戰(zhàn)

上面那套初步的分庫分表+讀寫分離的架構確實支撐了一段時間,但是慢慢的那套架構又暴露出來了弊端出來了,因為商家用戶都是開了數(shù)據(jù)分析頁面之后,頁面上有js腳本會每隔幾秒鐘就發(fā)送一次請求到后端來加載最新的數(shù)據(jù)分析結果。

此時就有一個問題了,漸漸的查詢MySQL的壓力越來越大,基本上可預見的范圍是朝著每秒10級別去走。

但是我們分析了一下,其實99%的查詢,都是頁面JS腳本自動發(fā)出刷新當日數(shù)據(jù)的查詢。只有1%的查詢是針對昨天以前的歷史數(shù)據(jù),用戶手動指定查詢范圍后來查詢的。

但是現(xiàn)在的這個架構之下,我們是把當日實時數(shù)據(jù)計算結果(代表了熱數(shù)據(jù))和歷史離線計算結果(代表了冷數(shù)據(jù))都放在一起的,所以大家可以想象一下,熱數(shù)據(jù)和冷數(shù)據(jù)放在一起,然后對熱數(shù)據(jù)的高并發(fā)查詢占到了99%,那這樣的架構還合理嗎?

當然不合理,我們需要再次重構系統(tǒng)架構。

五、 數(shù)據(jù)的冷熱分離架構

針對上述提到的問題,很明顯要做的一個架構重構就是冷熱數(shù)據(jù)分離。也就是說,將今日實時計算出來的熱數(shù)據(jù)放在一個MySQL集群里,將離線計算出來的冷數(shù)據(jù)放在另外一個MySQL集群里。

然后開發(fā)一個數(shù)據(jù)查詢平臺,封裝底層的多個MySQL集群,根據(jù)查詢條件動態(tài)路由到熱數(shù)據(jù)存儲或者是冷數(shù)據(jù)存儲。

通過這個步驟的重構,我們就可以有效的將熱數(shù)據(jù)存儲中單表的數(shù)據(jù)量降低到更少更少,有的單表數(shù)據(jù)量可能就幾十萬,因為將離線計算的大量數(shù)據(jù)結果從表里剝離出去了,放到另外一個集群里去。此時大家可想而知,效果當然是更好了。

因為熱數(shù)據(jù)的單表數(shù)據(jù)量減少了很多,當時的一個最明顯的效果,就是用戶99%的查詢都是針對熱數(shù)據(jù)存儲發(fā)起的,性能從原來的1秒左右降低到了200毫秒以內(nèi),用戶體驗提升,大家感覺更好了。

六、自研Elasticsearch+HBase+純內(nèi)存的查詢引擎

架構演進到這里,看起來好像還不錯,但是其實問題還是很多。因為到了這個階段,系統(tǒng)遇到了另外一個較為嚴重的問題:冷數(shù)據(jù)存儲,如果完全用MySQL來承載是很不靠譜的。冷數(shù)據(jù)的數(shù)據(jù)量是日增長不斷增加,而且增速很快,每天都新增幾千萬。

因此你的MySQL服務器將會面臨不斷的需要擴容的問題,而且如果為了支撐這1%的冷數(shù)據(jù)查詢請求,不斷的擴容增加高配置的MySQL服務器,大家覺得靠譜么?

肯定是不合適的!

要知道,大量分庫分表后,MySQL大量的庫和表維護起來是相當麻煩的,修改個字段?加個索引?這都是一場麻煩事兒。

此外,因為對冷數(shù)據(jù)的查詢,一般都是針對大量數(shù)據(jù)的查詢,比如用戶會選擇過去幾個月,甚至一年的數(shù)據(jù)進行分析查詢,此時如果純用MySQL還是挺災難性的。

因為當時明顯發(fā)現(xiàn),針對海量數(shù)據(jù)場景下,一下子查詢分析幾個月或者幾年的數(shù)據(jù),性能是極差的,還是很容易搞成幾秒甚至幾十秒才出結果。

因此針對這個冷數(shù)據(jù)的存儲和查詢的問題,我們最終選擇了自研一套基于NoSQL來存儲,然后基于NoSQL+內(nèi)存的SQL計算引擎。

具體來說,我們會將冷數(shù)據(jù)全部采用ES+HBase來進行存儲,ES中主要存放要對冷數(shù)據(jù)進行篩選的各種條件索引,比如日期以及各種維度的數(shù)據(jù),然后HBase中會存放全量的數(shù)據(jù)字段。

因為ES和HBase的原生SQL支持都不太好,因此我們直接自研了另外一套SQL引擎,專門支持這種特定的場景,就是基本沒有多表關聯(lián),就是對單個數(shù)據(jù)集進行查詢和分析,然后支持NoSQL存儲+內(nèi)存計算。

這里有一個先決條件,就是如果要做到對冷數(shù)據(jù)全部是單表類的數(shù)據(jù)集查詢,必須要在冷數(shù)據(jù)進入NoSQL存儲的時候,全部基于ES和HBase的特性做到多表入庫關聯(lián),進數(shù)據(jù)存儲就全部做成大寬表的狀態(tài),將數(shù)據(jù)關聯(lián)全部上推到入庫時完成,而不是在查詢時進行。

對冷數(shù)據(jù)的查詢,我們自研的SQL引擎首先會根據(jù)各種where條件先走ES的分布式高性能索引查詢,ES可以針對海量數(shù)據(jù)高性能的檢索出來需要的那部分數(shù)據(jù),這個過程用ES做是最合適的。

接著就是將檢索出來的數(shù)據(jù)對應的完整的各個數(shù)據(jù)字段,從HBase里提取出來,拼接成完成的數(shù)據(jù)。

然后就是將這份數(shù)據(jù)集放在內(nèi)存里,進行復雜的函數(shù)計算、分組聚合以及排序等操作。

上述操作,全部基于自研的針對這個場景的查詢引擎完成,底層基于Elasticsearch、HBase、純內(nèi)存來實現(xiàn)。

七、實時數(shù)據(jù)存儲引入緩存集群

好了,到此為止,冷數(shù)據(jù)的海量數(shù)據(jù)存儲、高性能查詢的問題,就解決了。接著回過頭來看看當日實時數(shù)據(jù)的查詢,其實實時數(shù)據(jù)的每日計算結果不會太多,而且寫入并發(fā)不會特別特別的高,每秒上萬也就差不多了。

因此這個背景下,就是用MySQL分庫分表來支撐數(shù)據(jù)的寫入、存儲和查詢,都沒問題。

但是有一個小問題,就是說每個商家的實時數(shù)據(jù)其實不是頻繁的變更的,在一段時間內(nèi),可能壓根兒沒變化,因此不需要高并發(fā)請求,每秒10萬級別的全部落地到數(shù)據(jù)庫層面吧?要全都落地到數(shù)據(jù)庫層面,那可能要給每個主庫掛載很多從庫來支撐高并發(fā)讀。

因此這里我們引入了一個緩存集群,實時數(shù)據(jù)每次更新后寫入的時候,都是寫數(shù)據(jù)庫集群同時還寫緩存集群的,是雙寫的方式。

然后查詢的時候是優(yōu)先從緩存集群來走,此時基本上90%以上的高并發(fā)查詢都走緩存集群了,然后只有10%的查詢會落地到數(shù)據(jù)庫集群。

八、階段性總結

好了,到此為止,這個架構基本左邊也都重構完畢:

  • 熱數(shù)據(jù)基于緩存集群+數(shù)據(jù)庫集群來承載高并發(fā)的每秒十萬級別的查詢。
  • 冷數(shù)據(jù)基于ES+HBase+內(nèi)存計算的自研查詢引擎來支撐海量數(shù)據(jù)存儲以及高性能查詢。

經(jīng)實踐,整個效果非常的好。用戶對熱數(shù)據(jù)的查詢基本多是幾十毫秒的響應速度,對冷數(shù)據(jù)的查詢基本都是200毫秒以內(nèi)的響應速度。

九、下一階段的展望

其實架構演進到這里已經(jīng)很不容易了,因為看似這么一張圖,里面涉及到無數(shù)的細節(jié)和技術方案的落地,需要一個團隊耗費至少1年的時間才能做到這個程度。

但是接下來,我們要面對的,就是高可用的問題,因為付費級的產(chǎn)品,我們必須要保證超高的可用性,99.99%的可用性,甚至是99.999%的可用性。

責任編輯:姜華 來源: 今日頭條
相關推薦

2022-11-17 00:04:38

接口性能查詢

2021-01-27 10:28:21

CISO升職加薪首席信息安全官

2016-06-06 17:23:50

AndroidChrome OS

2021-10-11 07:46:50

ScalaJVM語言

2009-06-24 14:10:22

2014-01-17 15:31:43

智能數(shù)據(jù)中心PDU

2021-10-06 16:21:32

類型對象Typescript

2018-12-10 07:22:27

物聯(lián)網(wǎng)預測分析安全威脅

2021-12-24 10:01:55

勒索團伙攻擊勒索軟件

2016-08-02 14:03:21

建設數(shù)據(jù)中心

2017-07-26 16:15:17

Python案例入門級

2022-03-02 10:36:37

Linux性能優(yōu)化

2018-10-23 16:40:08

Python編程語言實用案例

2025-05-16 09:34:10

2020-11-10 14:09:48

高斯進程神經(jīng)網(wǎng)絡高斯

2020-06-08 17:51:28

戴爾

2019-01-09 08:26:55

無線路由器WiFi網(wǎng)絡

2013-05-06 09:30:17

互聯(lián)網(wǎng)創(chuàng)業(yè)

2024-07-02 11:16:21

2018-04-26 16:15:02

數(shù)據(jù)庫MySQLMySQL 8.0
點贊
收藏

51CTO技術棧公眾號