來源:https://www.cyningsun.com/02-02-2020/high-concurrency-hierarchical-storage.htmlhtml
本來想聊下緩存的相關技術,可是純聊緩存未免眼界太窄,視野過小,既然打算寫一個系列,不如就先從底層聊起,而後慢慢鋪開。本篇先聊分級存儲引入的問題,以及對服務和架構的影響:服務分類、分層架構(服務分層)。算法
瞭解計算機組成的都知道,存儲結構是分層(級)的,究竟是什麼緣由呢?sql
用戶指望提供儘量高的存取速度和儘可能大的存儲容量,但價格儘量低。矛盾的現實是:mongodb
計算機發揮性能要求存儲存取速度與CPU相匹配。離 CPU 越近的存儲,速度越快,成本越高,容量也所以越小。數據庫
數據從產生的那一刻起就天然地進入到了一個循環,通過建立、訪問、遷移、歸檔和銷燬,最終完成一個生命週期,而這個過程必然須要良好的管理,不然,要麼是浪費了過多的資源;要麼是資源不足下降了工做效率。緩存
數據生來並不是平等的。不一樣的數據具備不一樣的價值,如業務生產相關的關鍵數據和日誌;同一數據在其不一樣階段價值也不同。縱向來看,即訪問越多,其價值越高。微信
分級存儲,利用了數據訪問的局部性原理,使用快速的存儲,存儲訪問最多的數據。當訪問數據時,先從內存中取,若是內存中沒有,再從磁盤讀入內存。之後訪問該區域的數據時,就不用再從磁盤讀取,所以上層的存儲均可以認爲是下層的緩存。網絡
總結一下:局部性原理的緩存體系,平衡了速度和價格的矛盾。架構
分級存儲並不是是解決問題的銀彈,解決了矛盾的同時,也給存儲自己引入了一些問題:併發
命中率
當數據被上層存儲覆蓋時,一切盡在掌握,分層存儲的機制能夠正常的工做。當熱點數據穿透上層落到下層時,下層存儲的性能將成爲總體的瓶頸。
一致性
做爲緩存,上層存儲在提升系統處理性能的同時,也可能會「滯留」IO操做。若是在系統發生故障時,仍有部分IO「滯留」,真正寫到下層存儲的數據就會少於服務實際寫出的數據,致使數據不一致。
存儲管理
因爲存在多個層級,數據在生命週期內就須要在不一樣層級間流動遷移。不一樣層級須要合適的遷移淘汰策略,知足業務場景的需求。緩存須要緩存策略;內存須要內存管理策略;磁盤須要磁盤管理策略。
如同放洗澡水同樣,首先檢查熱水多熱,而後檢查冷水多冷。而後調節水龍頭旋鈕,以流出溫度合適的水。
相似的,基於不一樣類型存儲訪問速度的巨大差別,須要關注的重點不一樣。多級存儲也給架構設計帶來很多問題。
在大型互聯網公司,全部的服務被分爲三種類型:
一個服務能夠既是「CPU消耗型「,同時也是「內存消耗型」,例如:搜索服務 —— 燒錢玩意兒,騰訊賣掉搜索給搜狗估計也是被燒的肉疼了吧 :)。
那爲何如此劃分呢?
盤點下業界在高併發場景下,使用的存儲方案(至少保證數據不丟失):
能夠看到絕大部分的互聯網公司,仍是依靠第二種方案扛住高併發的請求。那麼應對高併發的架構中,就不能缺乏存儲層(也能夠稱爲:持久層,數據訪問層),不然業務代碼會與存儲管理的代碼交叉耦合在一塊兒
使用第二種方案,就免不了緩存的是是非非。既然緩存也是存儲層級中的一層,全部的問題也就脫不開分級問題的範疇了,後續詳聊。
參考連接: