架构师训练营第 1 期 -Week5 - 技术选型一学习总结
上周内容
上一周学习了系统架构的一些基本知识和基本概念。了解了在系统架构的发展过程中,使用各种技术解决各种各样的问题和挑战,一些架构模式和架构要素。
互联网架构的挑战:高并发、大流量、高可用、海量数据、用户分布广泛、安全环境恶劣、需求快速变更、渐进式发展。
互联网架构演化的10个阶段:
单机架构
应用数据分离
使用缓存改善系统性能
使用应用服务器集群改善系统的并发处理能力
数据库读写分离
使用反向代理和CDN加速网站响应
使用分布式文件系统和分布式数据库系统
使用NoSQL和搜索引擎
业务拆分
微服务及中台化
大数据和智能化
互联网系统架构常见的架构模式:分层、分隔、分布式、集群、缓存、异步、冗余、自动化、安全。
互联网系统架构的五个核心要素(架构的评定标准):高性能、高可用、可伸缩、可扩展、安全。
特别注意: 架构师在做技术选型的时候,根据场景选择技术,做技术选型。白技术方案的优缺点。去选择最适合自己的方案。
本周内容
本周以及下周主要讲互联网架构中各种具体的技术手段。比如:分布式缓存、负载均衡、消息队列、分布式数据库、NoSQL、搜索引擎。本周主要学习:分布式缓存、消息队列、负载均衡。
缓存: 存储在计算机上的一个元素数据复制集,以便于访问 -- 维基百科
无处不在的缓存:CPU缓存(L1 cahce 等)、操作系统缓存、数据库缓存、JVM编译缓存、CDN缓存、代理和反向代理、前端缓存、应用程序缓存、分布式对象缓存等。
缓存可以在所有请求资源的地方使用。缓存的主要特点:技术简单、性能提升显著、应用场景多。缓存是系统性能优化的大杀器。
不适合缓存的数据:频繁修改的数据、没有热点的数据。 通常数据是遵循二八定律的,就是80%的访问,几种在20%的数据上。我们缓存的时候把这20%的数据缓存起来,就能提供80%的读取访问。有热点的访问才有价值,才适合使用缓存
LRU是缓存主要使用的内存管理算法,LRU算法,即最近最久未用算法。尾部数据总是最热的,最多访问的。而头部的数据总是最少访问的,最近最久未被使用的数据。
各种介质的访问延迟:
缓存(Cache)和缓存(Buffer)的区别
cache和buffer都是用于在高速和低俗设备之间的一个中间装置,都是优化性能的一种手段。
Buffer 是用来在读写数据的时候,在应用程序和低速的设备之间,用来缓冲数据的一个中间存储。只读一次。
读取低俗设备时,buffer先请求低速设备,将数据写入buffer中,供高速设备使用。
写入低俗设备时,高速设备处理之后的数据,先写入buffer中,低俗设备可以缓慢的吸入。
Cache主要是在多次读取数据的时候,然后将数据,放入到缓存中、Cache中,每一次要读取的时候,从Cache中去读取就可以了。读多次。
缓存的关键指标 -- 缓存命中率
缓存是否有效依赖于能多少次重用同一个缓存响应业务请求,这个度量指标被称作缓存命中率。如果查询一个缓存,十次查询九次能够得到正确结果,那么它的命中率是90%。
影响缓存命中率的主要指标:
缓存键集合的大小。
缓存可使用内存空间。
缓存对象生存时间 -- TTL(Time To Live)。
缓存的分类
通读缓存 read-through
代理缓存
反向代理缓存
CDN - 内存分发网络
旁路缓存 cache-aside
浏览器缓存 - cookie
本地缓存 - 常量、全局变量等
分布式对象缓存集群
Memcached
Memcached缓存架构方式 - Share-Nothing架构
集群内各个服务器节点之间不共享任何信息,它们之间并不感知到对方。集群的负载均衡有客户端程序实现。
Memcached访问模型
SDK由4部分组成:API、路由算法、通信模块、路由表
路由算法使用的是余数Hash算法。
存在的问题:在集群做伸缩时,会出现大量的缓存不命中。
一致性Hash算法
没有使用虚拟节点的一致性Hash算法存在的问题
key在每个节点上的分布不均匀
新增节点不能分摊所有节点的负载压力、不能分摊所有节点的存储压力
一致性Hash算法是分布式缓存,甚至是整个分布式系统的一个重要算法。理解一致性Hash,对我们理解分布式系统,理解分布式缓存,都有非常重要的意义。多花一点时间,多去理解下
技术栈各个层次的缓存
缓存显著提升性能的三个关键特点
缓存数据通常来自内存,比磁盘上的数据有更快的访问速度。
缓存存储数据的最终形态(计算之后的结果),不需要中间计算,减少CPU资源的消耗。比如CDN缓存整个URL的页面。
缓存降低数据库、磁盘、网络的负载压力,使这些I/O设备活动更好的响应特性。
使用缓存的注意事项
数据不一致与脏读
解决方法有:设置失效时间(容忍一定时间的脏读)、数据源更新时更新缓存、数据源更新时作废缓存等三种方法
缓存雪崩
出现雪崩的原因主要是大量的缓存穿透(大批KEY过期,多台缓存服务器宕机等)
缓存雪崩是前端请求大批量的缓存穿透,到达数据库,导致数据库服务器资源耗尽,然后崩溃,进而导致整个系统崩溃。
缓存预热 - warm up
可以缓存的数据:元数据(城市地名、类目信息)
缓存穿透
造成缓存穿透的原因有:黑客攻击(访问不存在的key)、缓存过期
Redis集群 -- 桶
Redis集群的架构方式和Memcached不同,不是share-nothing的。它的架构方式和一致性Hash类型。
Redis-cluster是将物理节点映射到预分好的16384个桶。它采用余数hash算法。用Hash code和16384取余,计算出是那个桶,在通过映射知道服务器。伸缩服务器集群的时候,只要调整物理节点和桶的映射就可以了。
消息队列
消息队列架构的三个角色:消息队列、消息生产者、消息消费者。
实现异步架构的两种模型: 点对点模型、发布订阅模型。
点对点模型中消息生产者生产的消息只被消费一次。
发布订阅模型中消息生产者生产的消息,被所有订阅的消息消费者消费。可以理解成消息被分发给每个消费者的消息队列中。
消息队列的好处:
实现异步处理,提升写性能
更好伸缩,业务解耦之后,可以针对特定功能进行伸缩。
削峰填谷,可以解决不同时段访问不均匀的问题。
失败隔离,自我修复。
解耦,消息生产者和消息消费者,不直接依赖,没有强耦合。开发、功能扩展、运维都容易些。
事件驱动架构-EDA
EDA是系统架构中的一种经典架构方式。也是用的比较广泛的一种架构方式。
事件驱动架构带来的好处,主要是耦合的表面积更少
典型的使用场景:用户注册(注册后发送邮件、发送短信、跟其他产品信息同步、保存数据库)、
负载均衡
所谓的负载均衡架构是说,用户发送的请求,通过HTTP请求,发送到负载均衡服务器,通过负载均衡服务器,将请求转发给应用服务集群中的某一台服务器。
负载均衡架构的两个关键点:1.请求是如何分发的(实现负载均衡的方式)。2.应该将请求分发到那台服务器上(负载均衡算法)
负载均衡请求转发的几种方式:
HTTP重定向负载均衡
DNS解析负载均衡,两层负载均衡的第一层。
反向代理负载均衡, 在集群规模比较小的时候才要,性能低。
IP层负载均衡
数据链路层负载均衡
负载均衡算法:轮询、加权轮询、随机、最少连接、源地址散列。
应用服务器集群的会话管理(Session)
管理方式:Session复制、Session绑定(源地址散列)、利用Cookie记录Session、Session服务器。
思考和总结
架构师一定要搞清楚,我们已使用的技术,它背后的架构原理是什么样子的。不要盲目的说这个东西缓存就能提升性能的,增加服务器,就是扩展能力的。避免生搬硬套。
评论