技术选型能力反映了架构师的综合水平(第 5 周学习总结)
一、分布式缓存架构
1. 什么是缓存Cache?
缓存:存储在计算机上的一个原始数据复制集,以便于访问。缓存是介于数据访问者和数据源之间的一种高速存储,当数据需要多次读取的时候,用于加快读取的速度。
2. 无处不在的缓存
CPU缓存
操作系统缓存
数据库缓存
JVM编译缓存
CDN缓存
代理与反向代理缓存
应用程序缓存
分布式对象缓存
3. 缓存的关键指标
访问速度要快:缓存数据存储结构一般是Hash表
缓存关键指标:缓存命中率
影响缓存命中率的主要指标:
缓存键集合大小
缓存可用内存空间
缓存对象生存时间
4. 缓存分类
a. 通读缓存(read-through)
代理缓存
反向代理缓存
多层反向代理缓存
内容分发网络(CDN)
b. 旁路缓存(cache-aside)应用代码主动缓存对象
浏览器对象缓存
本地对象缓存:对象存储在同一台机器的共享内存中
c. 远程分布式对象缓存(Redis、Memcached)
Memcached分布式对象缓存:由应用程序对key进行hash,选择分片
Redis分布式对象缓存
5. 分布式对象缓存的一致性hash算法
集群:有多台提供相同服务的机器组成
访问集群路由算法
当由应用程序对key进行hash取模,选择分片时,如果增加了服务节点,会导致取模结果失效,大量缓存无法命中。传统的hash算法无法解决这个问题,于是就有了一致性hash。
一致性hash也有缺点:可能出现不均衡
解决:基于虚拟节点的一致性hash算法
6. 缓存为什么能显著提升性能
缓存数据通常来自于内存,比磁盘上的数据有更快的访问速度
缓存存储数据的最终结果形态,不需要中间计算,减少CPU资源的消耗
缓存降低数据库、磁盘、网络的负载压力,使这些I/O设备获得更好的响应特性
7. 合理使用缓存
使用缓存对提升系统性能有很多好处,但是不合理的使用缓存可能非但不能提高系统性能,还会成为系统累赘、甚至风险。
频繁修改的数据不适合缓存:这种数据缓存起来后,由于频繁修改,还没来得及修改就已经失效或更新,徒增系统负担。一般来说,数据的读写比在2:1以上,缓存才有意义。
系统没有热点数据访问:如果系统没有热点数据,不遵循二八定律,那么增加缓存也意义不大。
数据不一致与脏读:缓存数据通常有失效时间,当更新了数据库中的数据时,缓存数据可能没有及时更新,会导致数据不一致。如果采用立即更新缓存或失效缓存的方式,可以减少数据不一致的情况,但也增加了一定的复杂度。
缓存雪崩:由于缓存过期失效导致大量请求穿透缓存到数据库,导致数据库服务宕机,而引发整个服务故障。
缓存预热:缓存中存放的是热点数据,热点数据又是缓存系统利用LRU算法对不断访问的数据筛选淘汰出来,这个过程需要花费较长时间,在这段时间系统的性能不太高、数据库负载较大。那么最好在缓存系统启动的时候就把热点数据加载好。
缓存穿透:如果不恰当的业务、或者恶意攻击持续高并发的请求某个不存在的数据,因为缓存没有保存该数据,所有的请求都会落到数据库上,对数据库造成很大的压力,甚至崩溃。一个简单的对策是将不存在的数据也缓存起来(值为null),并设定一个较短的失效时间。
二、消息队列与异步架构
1. 同步调用 VS 异步调用
异步采用消息队列的方式(Tornado采用的异步方式是???)
缓存可以提升读的能力,消息队列可以提升写的能力(给用户返回一个提交成功的结果,保护数据库)。
削峰填谷、解耦
事件驱动架构EDA
三、负载均衡架构
负载均衡分类:
http重定向负载均衡
DNS负载均衡
反向代理负载均衡
IP负载均衡
数据链路层负载均衡
负载均衡算法:
轮询
加权轮询
随机
最少连接
源地址散列(IP Hash等)
四、分布式数据库
分类:
MySQL主从复制
MySQL一主多从复制
MySQL主主复制
版权声明: 本文为 InfoQ 作者【李德政】的原创文章。
原文链接:【http://xie.infoq.cn/article/357ee525ba97856ab161d8dd2】。文章转载请联系作者。
评论