「架构师训练营」第 5 周总结
本周内容主要包括架构的几个方面,包括缓存、消息队列、负载均衡和分布式数据库。
缓存
缓存是什么?
缓存是介于数据访问者和数据源之间的一种高速存档,当数据需要多次读取的时候,用于加速读取的速度。
常见的缓存,例如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 分别有各自的从
评论