架构师训练营第五章总结
1、什么是缓存?
1.1、定义
存储在计算机上的一个原始数据的复制集,以便于访问。
缓存是介于数据访问者和数据源之间的一种高速存储,当数据需要多次读取的时候,用于监控读取的速度。
缓存是有读操作,多次读取的时候才需要用缓存
缓存所在的领域:CPU 缓存、操作系统缓存、数据库缓存、JVM 编译缓存、CDN 缓存、代理与反向代理缓存、前端缓存、应用程序缓存、分布式对象缓存;
1.2、缓存的数据存储(Hash 表)
访问复杂度 O(1),以 key/value 的形式存储;
通过 key 计算 hashcode,比如“abc”.hashcode=101;
根据 hashcode 计算哈希表的下标索引,通过余模 8 取值;
数据存储结构是哈希表结构,每个地址的长度是 8 个字节;
每个数据保存的是值空间的指针;
1.3、关键指标
缓存命中率是说,缓存是否有效依赖于能多少次重用用一个缓存响应业务请求
主要指标:
缓存键集合的大小:缓存中的每一个对象使用缓存键识别,定位一个对象的唯一方式就是对缓存键执行精确匹配,缓存键越少,命中率越高;
缓存可使用内存空间;缓存可使用空间直接决定了缓存对象的平均大小和缓存对象数量;
缓存对象生存时间:缓存对象生存时间 TTL(Time To Live),对象缓存的时间越长,缓存对象被重用的可能性越高
1.4、缓存种类
代理服务器:客户端连接到本地代理服务器,获取静态资源,如果缓存未命中则去服务器获取;
反向代理服务缓存:客户端在数据中心访问,请求进来时做缓存代理,未命中则请求资源;
多层反向代理缓存:由多层反向代理服务缓存,RestFul 风格特别适合做缓存代理;
内容分发网络:也叫 CDN,CDN 放在网络提供的数据中心,客户端请求 CDN 服务数据中心,然后 CDN 没有名字发至服务器
通读缓存:应用程序连通读缓存,由通读缓存去查找,只能去连接缓存,看不到数据源,一般代理缓存、反向代理缓存、CDN 缓存
旁路缓存:客户端会连接缓存服务端,如果没有命中,则由服务端直接去查服务数据,对象缓存就是一种旁路缓存
2、算法
2.1、一致性 hash
开始位置 0,结束位置 2^23-1,hashcode 的范围;
每个服务器节点取 hash 值,三个服务 NODE0、NODE1、NODE2;
根据算出来的 hash 值顺时针查找获取最近的服务节点;
扩容时新增节点只需要变更最近的 key 值,影响范围较小;
hash 值是一个随机数,导致数据分布不均匀,负载不均衡;
2.2、基于虚拟节点的一致性 Hash 算法
服务器字符串的 hash 值放到环上,节点变成虚拟节点;
一个服务分成多个虚拟节点均匀的分布在环上面;
根据算出来的 hash 值顺时针查找获取最近的虚拟节点;
影响范围是基本所有虚拟节点都会受到影响,但是影响的数据量相对较少;
3、性能
3.1、为什么缓存能提高性能
缓存数据通常来自于内存,比磁盘上的数据有更快的访问速度;
缓存存储数据的最终结果形态,不需要中间计算,减少 CPU 资源的消耗;
缓存降低数据库、磁盘、网络的负载压力,是这些 I/O 设备活动更好的响应特性
缓存一般有几个特点:技术简单、性能提升显著、应用场景多
3.2、合理的使用缓存
使用缓存对提高系统性能有很多好处、但是不合理的使用缓存可能非但不能提高系统的性能,还会成为系统的累赘,甚至风险。实践中,缓存滥用的情景屡见不鲜。
频繁修改的数据,不应该缓存,由于频繁修改,应用还来不及读取就已经失效了,增加系统负担,一般来说,数据的读写比例在 2:1,缓存才有意义;
没有热点的访问:缓存使用内存作为存储,内存资源宝贵而有限,不能将所有的数据缓存起来,如果应用系统访问数据没有热点,不遵循二八定律,即大部分数据访问不是集中的小部分数据,name 缓存就没有意义;
缓存雪崩:缓存是为了提供数据读取性能,缓存数据丢失或者缓存不可用不会影响到应用程序的作用,他可以直接获取数据库的数据。随着业务的发展,缓存会承受大部分的数据访问压力,进而导致整个网站不可用。
缓存预热:缓存中存放的是热点数据,热点数据又是缓存利用 LRU 算法对不断访问的数据筛选淘汰处理的,过程时间较长,这段时间对系统的负载不太友好,一般是在系统启动的时候就把热点数据预热好。
缓存穿透:如果不恰当的业务或者恶意攻击持续高并发的请求某个不存在的数据,以为缓存没有报错该数据,所有的请求都会落在数据库上面,会对数据库造成很大的压力甚至奔溃,一个简单的对策是将不存在的数据也缓存起来,并设定一个较短的失效时间。
消息队列
消息队列的模式:点对点模型,发布订阅模型
消息队列的好处:更好的伸缩性、削峰填谷、失败隔离和自我修复、减少耦合、简化管理
MQ 主要产品:RabbitMQ 、ActiveMQ、RockerMQ、Kafka
负载均衡算法
轮询:所有请求被一次分发到每一个应用服务器上面,适合于所有服务器硬件都相同的场景
加权轮询:根据应用服务器硬件性能指标,在轮询的基础上,按照配置的权重将请求分发到每个服务器,高性能的服务器分配更多的请求;
随机:请求被随机分配到各个应用服务器,在许多场合下,这种方案都简单实现,应为好的随机数本身就很均衡。如果应用服务器硬件配置不同,也可以很容易的使用加权随机算法;
最少连接:记录每个应用服务器正在处理的连接数,将新到的请求分发到最少连接的服务器上,应该说,这是最符合负载均衡定义的算法。
原地址散列:根据请求来源的 IP 地址进行 Hash 计算,得到应用服务器,该算法可以保证同一个来源的请求总在同一个服务器上处理。
分布式数据库
MySQL 分布式数据库架构:
主从复制
主主复制
版权声明: 本文为 InfoQ 作者【叮叮董董】的原创文章。
原文链接:【http://xie.infoq.cn/article/03cf2d2979114c00ccdcf8c9b】。文章转载请联系作者。
评论