来源:https://www.cyningsun.com/02-02-2020/high-concurrency-hierarchical-storage.htmlhtml
本来想聊下缓存的相关技术,可是纯聊缓存未免眼界太窄,视野过小,既然打算写一个系列,不如就先从底层聊起,而后慢慢铺开。本篇先聊分级存储引入的问题,以及对服务和架构的影响:服务分类、分层架构(服务分层)。算法
了解计算机组成的都知道,存储结构是分层(级)的,究竟是什么缘由呢?sql
用户指望提供尽量高的存取速度和尽可能大的存储容量,但价格尽量低。矛盾的现实是:mongodb
计算机发挥性能要求存储存取速度与CPU相匹配。离 CPU 越近的存储,速度越快,成本越高,容量也所以越小。数据库
数据从产生的那一刻起就天然地进入到了一个循环,通过建立、访问、迁移、归档和销毁,最终完成一个生命周期,而这个过程必然须要良好的管理,不然,要么是浪费了过多的资源;要么是资源不足下降了工做效率。缓存
数据生来并不是平等的。不一样的数据具备不一样的价值,如业务生产相关的关键数据和日志;同一数据在其不一样阶段价值也不同。纵向来看,即访问越多,其价值越高。微信
分级存储,利用了数据访问的局部性原理,使用快速的存储,存储访问最多的数据。当访问数据时,先从内存中取,若是内存中没有,再从磁盘读入内存。之后访问该区域的数据时,就不用再从磁盘读取,所以上层的存储均可以认为是下层的缓存。网络
总结一下:局部性原理的缓存体系,平衡了速度和价格的矛盾。架构
分级存储并不是是解决问题的银弹,解决了矛盾的同时,也给存储自己引入了一些问题:并发
命中率
当数据被上层存储覆盖时,一切尽在掌握,分层存储的机制能够正常的工做。当热点数据穿透上层落到下层时,下层存储的性能将成为总体的瓶颈。
一致性
做为缓存,上层存储在提升系统处理性能的同时,也可能会“滞留”IO操做。若是在系统发生故障时,仍有部分IO“滞留”,真正写到下层存储的数据就会少于服务实际写出的数据,致使数据不一致。
存储管理
因为存在多个层级,数据在生命周期内就须要在不一样层级间流动迁移。不一样层级须要合适的迁移淘汰策略,知足业务场景的需求。缓存须要缓存策略;内存须要内存管理策略;磁盘须要磁盘管理策略。
如同放洗澡水同样,首先检查热水多热,而后检查冷水多冷。而后调节水龙头旋钮,以流出温度合适的水。
相似的,基于不一样类型存储访问速度的巨大差别,须要关注的重点不一样。多级存储也给架构设计带来很多问题。
在大型互联网公司,全部的服务被分为三种类型:
一个服务能够既是“CPU消耗型“,同时也是“内存消耗型”,例如:搜索服务 —— 烧钱玩意儿,腾讯卖掉搜索给搜狗估计也是被烧的肉疼了吧 :)。
那为何如此划分呢?
盘点下业界在高并发场景下,使用的存储方案(至少保证数据不丢失):
能够看到绝大部分的互联网公司,仍是依靠第二种方案扛住高并发的请求。那么应对高并发的架构中,就不能缺乏存储层(也能够称为:持久层,数据访问层),不然业务代码会与存储管理的代码交叉耦合在一块儿
使用第二种方案,就免不了缓存的是是非非。既然缓存也是存储层级中的一层,全部的问题也就脱不开分级问题的范畴了,后续详聊。
参考连接: