高併發系統設計(1)——分級存儲

來源:https://www.cyningsun.com/02-02-2020/high-concurrency-hierarchical-storage.htmlhtml

背景

本來想聊下緩存的相關技術,可是純聊緩存未免眼界太窄,視野過小,既然打算寫一個系列,不如就先從底層聊起,而後慢慢鋪開。本篇先聊分級存儲引入的問題,以及對服務和架構的影響:服務分類、分層架構(服務分層)。算法

分級存儲

瞭解計算機組成的都知道,存儲結構是分層(級)的,究竟是什麼緣由呢?sql

computer-architecture.png

用戶指望提供儘量高的存取速度和儘可能大的存儲容量,但價格儘量低。矛盾的現實是:mongodb

  1. 速度越快,單位存儲價格就越高;
  2. 在必定的單位存儲價格下,容量越大,存儲器的總價就越高。

計算機發揮性能要求存儲存取速度與CPU相匹配。離 CPU 越近的存儲,速度越快,成本越高,容量也所以越小。數據庫

數據從產生的那一刻起就天然地進入到了一個循環,通過建立、訪問、遷移、歸檔和銷燬,最終完成一個生命週期,而這個過程必然須要良好的管理,不然,要麼是浪費了過多的資源;要麼是資源不足下降了工做效率。緩存

數據生來並不是平等的。不一樣的數據具備不一樣的價值,如業務生產相關的關鍵數據和日誌;同一數據在其不一樣階段價值也不同。縱向來看,即訪問越多,其價值越高。微信

分級存儲,利用了數據訪問的局部性原理,使用快速的存儲,存儲訪問最多的數據。當訪問數據時,先從內存中取,若是內存中沒有,再從磁盤讀入內存。之後訪問該區域的數據時,就不用再從磁盤讀取,所以上層的存儲均可以認爲是下層的緩存。網絡

總結一下:局部性原理的緩存體系,平衡了速度和價格的矛盾。架構

分級問題

分級存儲並不是是解決問題的銀彈,解決了矛盾的同時,也給存儲自己引入了一些問題:併發

  1. 命中率

    當數據被上層存儲覆蓋時,一切盡在掌握,分層存儲的機制能夠正常的工做。當熱點數據穿透上層落到下層時,下層存儲的性能將成爲總體的瓶頸。
  2. 一致性

    做爲緩存,上層存儲在提升系統處理性能的同時,也可能會「滯留」IO操做。若是在系統發生故障時,仍有部分IO「滯留」,真正寫到下層存儲的數據就會少於服務實際寫出的數據,致使數據不一致。
  3. 存儲管理

    因爲存在多個層級,數據在生命週期內就須要在不一樣層級間流動遷移。不一樣層級須要合適的遷移淘汰策略,知足業務場景的需求。緩存須要緩存策略;內存須要內存管理策略;磁盤須要磁盤管理策略。

服務分類

如同放洗澡水同樣,首先檢查熱水多熱,而後檢查冷水多冷。而後調節水龍頭旋鈕,以流出溫度合適的水。

相似的,基於不一樣類型存儲訪問速度的巨大差別,須要關注的重點不一樣。多級存儲也給架構設計帶來很多問題。

在大型互聯網公司,全部的服務被分爲三種類型:

  • CPU消耗型:也稱爲「計算密集型」,指服務使用CPU完成計算任務,受CPU速度限制。_CPU越快,任務處理越快。_
  • 內存消耗型:也稱爲「內存密集型」,指服務執行任務過程當中受內存大小和訪問速度限制。_內存越大、訪問速度越快,任務處理速度越快。_ 一般爲搜索類、緩存類、內存數據庫等需求大量內存的服務
  • I/O消耗型:也稱爲「I/O密集型」,指服務執行任務涉及到大量的網絡傳輸或磁盤I/O,受I/O速度限制。_I/O越快,任務處理越快。_ 一旦發生I/O,服務的工做線程(進程)就會處於等待狀態,當I/O結束,數據準備好後,線程(進程)纔會繼續執行。

一個服務能夠既是「CPU消耗型「,同時也是「內存消耗型」,例如:搜索服務 —— 燒錢玩意兒,騰訊賣掉搜索給搜狗估計也是被燒的肉疼了吧 :)。

那爲何如此劃分呢?

  • 一方面,當服務陷入瓶頸的時候可以快速根據類型進行資源預估、調整和性能調優
  • 另外一方面,調度程序可使用該信息來調度不一樣類型的服務,使用裝包算法(bin-packingalgorithms)進行最優的混合部署,以達到資源最大利用。
    bin-packing.png

分層架構

盤點下業界在高併發場景下,使用的存儲方案(至少保證數據不丟失):

  1. 純內存數據庫:以 mongodb 爲表明。成本高昂
    內存數據庫 + 磁盤數據庫:以 Redis/memcached + 2. Mysql/TiDB 爲表明。使用起來比較複雜,須要業務本身處理分級存儲帶來的問題
  2. 高性能高可用分佈式數據庫:以 megastore(谷歌)/ paxosstore(微信) / Dynamo (亞馬遜),技術門檻比較高,大廠專屬

能夠看到絕大部分的互聯網公司,仍是依靠第二種方案扛住高併發的請求。那麼應對高併發的架構中,就不能缺乏存儲層(也能夠稱爲:持久層,數據訪問層),不然業務代碼會與存儲管理的代碼交叉耦合在一塊兒

layer-architecture.png

使用第二種方案,就免不了緩存的是是非非。既然緩存也是存儲層級中的一層,全部的問題也就脫不開分級問題的範疇了,後續詳聊。



參考連接:

相關文章
相關標籤/搜索