学习总结 - 第 5 周
本周老师开始详细讲解架构技术,包括分布式缓存架构、消息队列与异步结构、负载均衡架构、分布式数据库
一、分布式缓存架构
缓存 Cache 和缓冲 Buffer,缓存是原始数据的复制集,加速读取,是提升性能的重要手段。缓冲是不同层次数据速度不一致时,利用缓冲区来缓解上下层之间速度问题,可用于加速读和写。
缓存无处不在,CPU 缓存、操作系统缓存、数据库缓存、JVM 编译缓存、CDN 缓存、代理和反向代理缓存、应用程序缓存、分布式对象缓存等。
缓存的关键指标是缓存命中率,影响缓存命中率的主要因素有缓存键集合大小、缓存可使用内存空间、缓存对象生存时间。
通读缓存,客户端连接的是通读缓存而不是生成响应的原始服务器,由通读缓存在请求未命中时获取实际数据,像代理缓存、反向代理缓存、CDN 缓存都是通读缓存;旁路缓存,客户端先访问旁路缓存,如果旁路缓存中没有需要的数据,由客户端自己去访问真正的数据服务提供者,获取数据。客户端获得数据以后,会自己把这个数据写入到旁路缓存中,这样下一次或者其他客户端去读取旁路缓存的时候就可以获得想要的数据了。Key-value 存储的对象缓存通常是旁路缓存。
通过 memcached 案例介绍了分布式缓存访问模型,老师特意介绍了一致性 hash 算法和基于虚拟节点的一致性 hash 算法。一致性 hash 算法是一种环状的节点,能够有效解决增加节点导致的全部缓存失效问题,只影响到一个节点小部分缓存。基于虚拟节点的一致性 hash 算法,通过随机分布的多个虚拟节点,可以大大增加平衡性和分散性,使得失效降低到非常低。
合理使用缓存,对于频繁修改的数据不需要进行缓存;没有热点的访问也没有必要缓存;需要考虑数据不一致与脏读,数据更新时通知缓存失效,删除缓存数据;防止缓存雪崩现场;进行缓存预热;防止缓存穿透。
Redis 缓存,redis 支持多种数据结构、支持多路复用异步 I/O、支持主从复制高可用、支持持久化。选型上优先选择 redis。
二、消息队列与异步结构
异步调用相对于同步调用不阻塞应用线程,提升了性能和并发。
通过消息队列构建异步调用架构,有点对点模型和发布订阅模型。
消息队列的好处:实现异步处理,提升处理性能;有更好的伸缩性;削峰填谷;失败隔离和自我修复;解耦。
三、负载均衡架构
常见的负载均衡架构:Http 重定向负载均衡(不推荐使用)、DNS 负载均衡、反向代理负载均衡(7 层)、IP 负载均衡(3 层)、数据链路层负载均衡(2 层)。对于中小型产品,推荐使用反向代理 nginx,即可做负载均衡也要以做反向代理服务器,对于大型产品,需要用到多级负载均衡,需要使用数据链路层负载均衡。
负载均衡算法:轮询、加权轮询、随机、最少连接、源地址散列。
应用服务器集群的 session 管理,session 复制(集群规模大时不推荐使用,复制成本高、压力大);session 绑定(发布版本或故障时会丢失,可用性降低,不推荐使用);使用 cookie 记录 session(cookie 可能被禁用、有安全风险);session 服务器(推荐使用)
四、分布式数据库
Mysql 复制,主从复制,包括一主一从和一主多从。
Mysql 复制,主主复制,相比主从复制,主主复制可以随时切换主数据库,可用性更高。
Mysql 复制注意事项:主主复制的两个数据库不能并发写入;复制只是增加了数据的读并发处理能力,没有增加写并发能力和存储能力;更新表结构会导致巨大的同步延迟。
本周课程印象深刻的几个知识点:
虚拟节点的一致性 hash 算法,虽然现在这种方法使用不多了,但其算法设计的思路非常有启发性,有独特精妙之处。
负载均衡架构,之前听过 lvs、F5、反向代理等很多概念,一直没弄清楚他们的区别,这次系统性的理解了,以后在选型上和与运维讨论时会清晰很多。
主主复制,之前一直认为主主复制的作用是两个数据库都可以写,现在才明白,其实不是两个数据库同时写,而是可以随时切换写。所以之前没明白,两个数据库都可以写怎么确保数据的一致性和写的冲突。
评论