架构师训练营第 1 期 -Week5 - 技术选型一学习总结

用户头像
鲁小鲁
关注
发布于: 2020 年 10 月 25 日



上周内容



上一周学习了系统架构的一些基本知识和基本概念。了解了在系统架构的发展过程中,使用各种技术解决各种各样的问题和挑战,一些架构模式和架构要素。



互联网架构的挑战:高并发、大流量、高可用、海量数据、用户分布广泛、安全环境恶劣、需求快速变更、渐进式发展。



互联网架构演化的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服务器。



思考和总结



架构师一定要搞清楚,我们已使用的技术,它背后的架构原理是什么样子的。不要盲目的说这个东西缓存就能提升性能的,增加服务器,就是扩展能力的。避免生搬硬套。



用户头像

鲁小鲁

关注

博学而笃志,切问而近思。 2018.09.29 加入

Go开发

评论

发布
暂无评论
架构师训练营第 1 期 -Week5 - 技术选型一学习总结