看过一些关于网站架构的书,受益匪浅,把书中的内容、自己的笔记拿来与大家分享。我还没有完善完下面的知识点,这篇文章会长期更新。
一、网站架构设计- 网站的基本组件
- 网站业务规模增长带来的
- 大型网站架构设计的目标和原则
-
高性能(Performance)
单个用户和客户端,单个请求的响应时间越短,性能越高网站建设和维护者,除了每个请求的响应时间,还有每秒事务次数(TPS),以及服务器的性能指标,包括 CPU 的使用率,内存使用率,IOPS 等。TPS 越高,性能越高
-
高可用
-
伸缩性
理想状况下,在网站业务规模增长/缩小时,可以通过直接添加/减少服务器来满足未来的需求 -
扩展性
- 添加新功能,不需要对已有代码或者架构进行大量的修改
- 添加新功能,假如在已有组件中已经有类似功能,不需要从头搭建类似的功能
- 添加新功能,不会对没有被修改的网站组件造成影响
- 添加新功能,不会降低其他网站组件的性能
-
- 需求分析
- 需求驱动的重要性
- 如何根据需求制定系统目标
- 方案设计
- 与架构设计原则相结合
- 设计多套备选方案
- 方案评估
- 关系型数据库
- 什么是关系型数据库
- 关系型数据库的优势和应用场景
- 非关系型数据库
- 什么是非关系型数据库
- 非关系型数据库的优势和应用场景
- 常见的关系型数据库产品
- MySQL
- MS SQL Server
- Oracle
- 常见的非关系型数据库产品
- MongoDB
- DynamoDB
- 云数据库
- 什么是分库分表
- 分库
- 分表
- 为什么要进行分库分表
- 吞吐量
- 索引
- 备份
- 其他风险
- 实现分库分表
- 垂直分库分表
- 水平分库分表
- 分库分表带来的问题
- 全局唯一ID
- 关系型数据库的部分操作
- 事物支持
- 什么是读写分离
- 为什么要进行读写分离
- 何时需要使用读写分离
- 读写分离的
- 实现读写分离
- 中间件实现
- 应用层实现
- 读写分离带来的问题
- 副本的实时性
- 副本实时性的解决方案
- 成本问题
- 什么是缓存
- 缓存策略
- LFU 缓存策略
- LRU 缓存策略
- 缓存策略的优劣
- 缓存命中率
- 缓存的类型
- 客户端缓存
- CDN 缓存
- 应用缓存
- 基于分布式集群的缓存
- 分布式缓存
- 分布式缓存的应用场景
- 分布式缓存的架构设计
- 缓存的问题
- 缓存过热
- 缓存穿透
- 缓存雪崩
- 常见的缓存系统
- MemCached
- Redis
- 动静分离
- 动态数据和静态数据
- 动静分离的概念
- 动静分离的作用
- 拆分动态数据和静态数据
- 识别动态数据和静态数据
- 改造数据
- 改造数据要注意的问题
- 动静分离的架构设计
- 动静分离的缓存架构
- 浏览器缓存
- CDN 缓存
- Web 服务器缓存
- 分布式缓存
- 页面组装
- 什么是负载均衡
- 负载均衡的概念
- 负载均衡的类型
- 有负载均衡的网站架构
- 反向代理
- DNS 负载均衡
- DNS
- A 记录
- CName
- 配置 DNS 负载均衡
- DNS 负载均衡的优缺点
- 硬件负载均衡
- 软件负载均衡:LVS
- LVS 架构
- LVS 的负载均衡方式
- LVS 的负载均衡的策略
- LVS 的调整升级
- LVS 的优缺点
- 软件负载均衡:Nginx
- Nginx 架构
- Nginx 工作原理
- Nginx 的负载均衡策略
- Nginx 的错误重试
- Nginx 的调整升级
- Nginx 的主要特点
- Nginx 配置实战
- 负载均衡的实践流程
- 回顾流量基本概念
- 实践流程
- 异步及其相关概念
- 同步和异步
- 阻塞和非阻塞
- 多线程
- 异步和非阻塞的作用
- 异步和非阻塞的应用场景
- 异步和非阻塞的架构
- 异步的优势
- 实战:以 Java 为例
- Runnable
- Callable
- Future
- Executor 和 ExecutorServer
- 改造同步且阻塞的 Java 代码
- 异步和非阻塞带来的问题
- API 定义
- 线程池的扩容
- 队列及其相关概念
- 队列
- 生产/消费、发布/订阅与主题
- 队列与网站的整合
- 发布者
- 订阅者
- 订阅者:推送模式
- 订阅者:拉取/轮询模式
- 队列的应用
- 流量控制
- 服务解耦
- 队列存在的问题与解决方案
- 消息积压
- 消息的可靠性
- 消息重复
- 常见的队列产品和系统
- RabbitMQ
- ActiveMQ
- RocketMQ
- Kafka
- AWS SQS 和 SNS
- CAP 原理
- 什么是 CAP 原理
- CAP 原理与网站服务
- 服务可用性的标准
- 冗余和隔离
- 扩容中的冗余
- 广义的冗余
- 隔离
- 异地多活的基本概念
- 基本概念
- 作用
- 应用场景
- 异地多活和负载均衡
- 异地多活的类型
- 同城异地多活
- 跨城市异地多活
- 跨地区异地多活
- 如何进行异地多活改造
- 业务分类
- 数据分类
- 数据同步
- 异地多活的数据同步提升方案
- 服务降级的基本概念
- 什么是服务降级
- 单点故障
- 微服务与服务拆分
- 什么是微服务
- 流量模式
- 如何拆分服务
- 系统分级
- 分析系统流程图
- 一级系统
- 限流的基本概念
- 什么是限流
- 为什么需要限流
- 限流的几种标准
- 限流的几种思路
- 限流算法
- 令牌桶算法和漏桶算法
- 时间窗口算法
- 队列法
- 服务限流需要考虑的问题
- 性能和准确性
- 如何进一步提升
- 实战:使用 Nginx 限流
- 超时机制
- 错误分类
- 如何分类错误
- 早期失败
- 默认值的作用
- 错误重试
- 错误重试的条件
- 错误重试带来的问题
- 测试的类型
- 一般功能测试
- 黑盒和白盒测试
- 不同程度的功能测试
- 非功能的测试
- 测试用例的设计
- 模拟实际环境
- 包含错误情况
- 保证用例多样性
- 验证系统间的连接性
- 功能测试详解
- 单元测试
- 集成测试
- 端到端测试
- 发布流程
- 规范化流程
- 结合测试的流程
- 自动化的流程
- 监控
- 生产环境度量
- 监控与警报
- 压力测试
- 压力测试的目的
- 如何进行压力测试
- 灰度发布
- 什么是灰度发布
- 灰度发布的条件
- 维护人员
- 应急预案
- 人工监控