系统架构学习笔记-架构师的 36 项修炼
大约 10 分钟
系统架构学习笔记-架构师的 36 项修炼
学习链接
https://www.bilibili.com/video/BV1St4y1h75v
大型架构的演进之路
大型互联网系统的特点
- 高并发大流量
- 高可用
- 海量数据
- 用户分布广泛,网络情况复杂
- 安全环境恶劣
- 需求快速变更,发布频繁
系统处理能力提升的两种途径
- 垂直伸缩
指提升单台服务器的处理能力
缺点- 达到某个程度后,增加计算能力需要的花费更多
- 垂直伸缩有物理极限
- 操作系统的设计或应用程序自身制约
- 水平伸缩
服务器分布式集群
大型互联网架构的演进之路
- 单机系统(少量用户)
- 数据库与应用分离(万级用户)
- 使用缓存改善性能,应用服务集群化(十万级用户)
- 使用反向代理和 CDN 加速响应,数据库读写分离(百万级用户)
- 使用分布式文件系统和分布式数据库系统(千万级用户)
- 使用搜索引擎、NoSQL、消息队列与分布式服务(亿级用户)
分布式缓存
缓存知识架构图
缓存特点
- 技术简单
- 性能显著提升
- 应用场景多
缓存为什么能显著提高性能
- 缓存数据通常来自内存,相比磁盘上的数据有更快的访问速度
- 缓存存储数据的最终结果形态,不需要中间计算,减少 CPU 消耗
- 缓存降低数据库、磁盘、网络的敷在压力,是这些 I/O 设备获得更好的响应特性
缓存数据存储(Hash 表)
缓存的关键指标: 命中率
- 缓存是否有效依赖于能多少次重用同一个缓存响应业务请求,这个度量指标被称为缓存命中率
- 影响缓存命中率的 3 个重要因素: 缓存键集中大小、内存空间和缓存寿命
影响缓存命中率的关键特性
- 缓存建集合大小
- 缓存可用的内存空间
- 缓存对象的生存时间
使缓存失效的两种方式
- 超时失效
- 实时清除
- 内存空间不足的 LRU 清除
代理缓存
应用程序的缓存,在客户端一端的缓存
反向代理缓存
代理数据中心的缓存
多层反向代理缓存
内容分发网络 CDN
通读缓存
- 代理缓存,反向代理缓存,CDN 缓存都是通读缓存
- 若通读缓存给客户端返回缓存资源,或在请求未命中缓存时获取实际数据
- 客户端连接的是通读缓存而不是生成响应的原始服务器
旁路缓存
- 旁路缓存通常是一个独立的键值对存储,对象缓存就是第一种旁路缓存
合理使用对象缓存
- 频繁修改的数据(读写比例要在 2:1 以上才有意义)
- 没有热点的访问
- 数据不一致与脏读
- 缓存雪崩(缓存服务崩溃导致数据库崩溃)
分布式对象缓存
- 路由算法选择对应的分布式对象缓存服务器
- 分布式对象缓存的一致性 hash 算法(一致性 hash 环 )(虚拟节点 + 物理映射)
分布式消息队列知识架构图
消息队列构建异步调用架构
- 消息生产者
- 消息消费者
- 消息队列
分布式数据存储
分布式数据存储知识架构图
一主多从复制的优点
- 分摊负载
- 专机专用
- 便于冷备
- 高可用
MySQL 复制注意事项
- 主主复制不能对两个数据库不能并发写入
- 复制只是增加数据的读并发处理能力,没有增加写并发能力和存储能力
- 更新表结构会导致巨大的同步延迟(由运维手工操作主从数据库表结构)
数据分片
- 硬编码分片
- 映射表分片
数据分片的挑战
- 需要大量的额外代码,处理逻辑因此变得复杂
- 无法执行多分片的联合查询
- 无法使用数据库的事务
- 随着数据的增长,如何增加更多的数据服务器
分布式数据库中间件
- Mycat
分片数据库伸缩扩容
分布式系统 CAP 原理
- C: 数据一致性: 数据的多个备份任何时候都是一致的
- A: 数据可用性: 任何时候任何应用程序都可以读写访问
- P: 分区耐受性: 系统可以跨网络分区线性伸缩
- CAP 原理表示这三个无法同时满足
最终一致性
保证多个数据节点最终的数据是一致的
数据冲突处理
- 时间戳解决冲突(时间戳大的覆盖时间戳小的)
- 客户端解决冲突(合并数据并重新写入)
- 投票解决冲突(尝试写入三个节点并至少获得两个节点成功响应)
分布式微服务架构
分布式微服务架构知识架构图
微服务架构策略
- 业务先行,先理顺业务边界和依赖
- 先有独立的模块,后有分布式的服务
- 业务耦合严重,逻辑复杂多变的系统进行微服务重构要谨慎
- 要搞清楚实施微服务的目的是什么?业务复用?开发边界清晰?分布式集群提升性能?
事件溯源
- 将用户请求处理过程中的每次状态变化都记录到事件日志中,病案时间序列进行持久化存储
- 利用事件溯源,可以精确复现任何用户状态,进行复核审计
- 利用事件溯源,可以有效监控用户状态变化,并在此基础上实现分布式事务
命令与查询职责隔离(CQRS)
- 在服务接口层面将查询与命令隔离,服务层的读写分离
- 更清晰的领域模型
- 针对读写分别划,实现更好的性能
- 查询服务不会修改数据,更好地保护数据
断路器
- 当某个服务出现故障,响应延迟或失败率增加,继续调用会导致调用者请求阻塞,资源消耗增加,进而出现服务级联失效
- 三种状态:关闭、打开、半开
- Spring Cloud 断路器实现:Hystrix
超时
- 上游调用者的超时时间大于下游调用者的超时时间
高性能系统架构
系统高性能架构知识架构图
网站性能的主要指标
- 响应时间
- 并发数
- 吞吐量
- 性能计数器
性能测试方法
- 性能测试
系统性能是否达到设计预期
- 负载测试
增加系统压力,直到某项指标或多项指标达到阈值
- 压力测试
最坏情况下能够承受的访问压力
- 稳定性测试
按照一定的压力,系统是否能够稳定提供服务
系统的性能优化的分层思想
- 机房与骨干网络性能优化
- 服务器与硬件性能优化
- 操作系统性能优化
- 虚拟机性能优化
- 基础组件性能优化
- 软件架构性能优化
- 软件代码性能优化
软件架构性能优化三板斧: 缓存
软件架构性能优化三板斧: 异步
软件架构性能优化三板斧: 集群
软件代码性能优化
- 遵循面向对象的设计原则与设计模式编程,避免烂代码
- 并发编程,多线程与锁
- 资源复用,线程池与对象池
- 异步编程,生产者消费者
- 合理的数据结构,数组、链表、hash 表、树
高可用的系统架构
高可用架构知识图谱
系统高可用的策略
- 应用服务器负载均衡
HTTP 重定向负载均衡
反向代理负载均衡
DNS 负载均衡
IP 层负载均衡 数据链路层负载均衡 - 数据库复制与失效转移
- 消息队列隔离
- 通过对并发的访问进行限流,降低并发请求数量来保护系统
- 关闭部分非核心功能,降低对系统的资源消耗,保证系统在高并发的情况下仍然可用
- 异地多活多机房架构