高并发系统设计(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

使用第二种方案,就免不了缓存的是是非非。既然缓存也是存储层级中的一层,全部的问题也就脱不开分级问题的范畴了,后续详聊。



参考连接:

相关文章
相关标签/搜索