「架构师训练营」第 5 周总结

用户头像
guoguo 👻
关注
发布于: 2020 年 07 月 08 日



本周内容主要包括架构的几个方面,包括缓存、消息队列、负载均衡和分布式数据库。

缓存

缓存是什么?

缓存是介于数据访问者和数据源之间的一种高速存档,当数据需要多次读取的时候,用于加速读取的速度。

常见的缓存,例如CPU缓存、操作系统缓存、数据库缓存、JVM编译缓存、CDN缓存、代理与反向代理缓存、前端缓存、应用程序缓存,分布式对象缓存。



缓存的数据存储

hash表的结构存储。时间复杂度O(1)。

关键指标

命中率是缓存的关键指标,而影响命中率的主要指标有:缓存键集合大小,缓存可使用内存空间、缓存对象生存时间。

缓存键集合大小

即存放缓存的hash表中key的集合大小。

应想办法减少可能的缓存键数量,从而提升命中率和缓存效率。

缓存可使用内存空间

缓存的可使用内存空间有限。直接决定了缓存对象的平均大小和缓存对象的数量。

缓存对象的生存时间

对象缓存的时间越长,缓存对象被重用的可能性越高。但要结合实际的场景。

通读缓存与旁路缓存

通读缓存就是应用程序去缓存中读取,如果缓存中有数据直接返回,如果没有数据直接去数据源中读取数据并写入到通读缓存中,常见的CDN缓存和反向代理缓存就是通读缓存。



旁路缓存就是缓存中有就返回,没有就返回null,需要应用程序去数据库中读取获取之后写入,比如我们的redis缓存。

memcached

集群服务器之间是相互无感知的。

缓存服务器的集群地址都配置在客户端,由客户端通过路由算法进行数据的路由。

一致性哈希算法

当缓存服务器伸缩时,为避免通过服务器数量增加,取模带来的大部分缓存失效从而可能引发服务器压力过大,可使用一致性哈希算法解决。

定位服务器时,通过分布在环中位置顺时针找到第一个node,即定位到对应的服务器。

当增加一个节点时,只影响到小于原来1/N的数据。(假设平均分布的情况)

但实际使用中,通过少数节点hash取模的分布往往都不均匀,并且增加一个缓存服务器节点,也仅仅分担了一台服务器的压力。所以,可以增加一定数量的虚拟节点

合理使用缓存

不要缓存频繁修改的数据。

缓存资源宝贵而有限,合理的淘汰机制,例如LRU算法(Least Recently Used)。

系统能够容忍一定时间的数据不一致(缓存失效)。如果数据更新时,通常也可删除缓存。

缓存雪崩,缓存服务器崩溃的时候,带来数据库压力过大而宕机。

缓存预热,在缓存启动时,加载好热点数据。

缓存穿透,不恰当的业务或用户恶意的不断访问一个不存在的数据,因为没有缓存而造成请求都去访问数据库,会对数据库造成压力。可以将null缓存一个相对较短的时间。(另外还有种布隆过滤器的判断)

Redis集群

Redis预留了16384个桶,根据CRC16(key)mod 16384从而决定桶的位置。

Cluster负责维护slot与服务器的映射关系,而非客户端。

客户端与redis节点直连,客户端不需要连接集群所有节点。

集群中所有redis节点是互通的。

消息队列与异步架构

同步与异步

同步调用

异步调用





响应提升,不需要等待远程调用完成。

消息队列

消息模型

点对点模型

一条消息被一个消费者消费。

发布订阅模型

一条消息Topic可能被多个消费者订阅。

消息队列的好处

高并发情况下,解决数据写的压力。

更好的伸缩性。

削峰填谷。

失败隔离与自我修复。消费者与生产者隔离,不受对方错误影响。

解耦。消费者与生产者并不知道对方。

事件驱动架构EDA

将信息发到主题里面去,需要消费主题的消费者订阅该主题。

主要MQ产品

  • RabbitMQ 性能好,社区活跃。但是使用Erlang开发,对不熟悉的开发者不便于二次开发和维护。

  • ActiveMQ 跨平台。使用JAVA开发。

  • RocketMQ 性能好,可靠性较高。

  • Kafka 使用Scala开发。针对分布式场景进行了优化,分布式的伸缩性比较好。

负载均衡架构

反向代理负载均衡(七层)。由于HTTP协议比较重,适合于小型的网站。

IP层的负载均衡。

数据链路层负载均衡。大型网站普遍使用。响应不再成为瓶颈。

负载均衡算法

  • 轮询 依次分发给不同服务器。

  • 加权轮询 在轮询基础上,根据不同配置分配不同的权重,高性能服务器分配到更多的请求。

  • 随机 随机分配到服务器上。也可做加权随机。

  • 最少连接 新的请求分配到正在处理的请求最少的服务器上。

  • 源地址散列 根据源IP地址散列分发。同一个来源总是到同一个服务器上。会话粘滞。

分布式数据库

MySQL复制

主从复制。binlog从主服务器同步到从服务器。

主库上的增加字段,一定要在应用程序之前,否则应用程序会出错。

删除字段要先在应用程序中先删,数据库在删。

一般DDL手动在从库操作,不通过binlog同步。

一主多从。主服务器提供写操作,从服务器提供读操作。

分摊负载,降低了服务器的读压力。

专机专用,从服务器可对于专门事项专用。

便于备分,数据不易丢失。

高可用。



主主复制。

不能同时向两个服务器写操作。当写的服务器停机时,将写操作切换到另一个服务器。

并没有增加写的能力和存储能力。

主主失效恢复。

A B 是主主

A 和 B 分别有各自的从



用户头像

guoguo 👻

关注

还未添加个人签名 2017.11.30 加入

还未添加个人简介

评论

发布
暂无评论
「架构师训练营」第 5 周总结