本文是GitHub热门项目系统设计入门的学习笔记第2篇,本篇记录了系统架构中经常用到的各个组件。
略过的内容
- DNS
- CDN
- 反向代理
- 缓存
- 安全
负载均衡
常见的负载均衡算法有:
- 随机
- 最小负载/连接
- 轮询/加权轮询
- 哈希
负载均衡还可以分为四层负载均衡和七层负载均衡,例如AWS提供的NLB和ALB就是这样区分的。简单来说,四层负载均衡(NLB)工作在TCP那一层,七层负载均衡(ALB)工作在HTTP那一层,所以NLB性能好,能处理所有TCP流量,ALB性能稍微差点,只能处理HTTP流量,但能根据HTTP本身的数据进行路由(例如请求的路径、参数、Header不同)。
数据库
关系型数据库
关系型数据库的一些技术及其细节:
主从复制
- 主库负责读写,从库只负责读
- 主库在复制数据到从库之前挂掉会造成数据丢失
- 从库太多写入延迟
- 主库挂掉时,从库提升为主库需要额外的逻辑
主主复制
- 需要额外的逻辑来决定写入哪个数据库
- 与主从复制一样的问题
联合
- 把数据按不同功能分为多个库,例如用户库、产品库
- 不方便JOIN
- 应用需要额外逻辑来确定读写哪个库
分片
- 一个表分为多个表,如用户表按姓名首字母分为多个
- SQL语句更复杂
- 分片不合理可能导致数据不均衡,例如某个姓的用户很多
- 不方便JOIN
非规范化
- 即不完全遵循关系型数据库的规范来储存数据
- 冗余信息来减少JOIN操作,适合写少读多的情况
SQL调优
- 慢查询
- 使用索引
非关系型数据库
BASE理论:
- Basically Available: 分布式系统在出现不可预知故障的时候允许损失部分可用性
- Soft state: 允许存在中间状态
- Eventually consistent: 数据最终会一致
类型:
- KeyValue型,如redis
- 文档型,如MongoDB
- 列式存储,如HBase
- 图数据库
SQL还是NoSQL
选择SQL的原因
- 结构化数据
- 关系型数据,需要join
- 事务等
选择NoSQL的原因
- 半结构化数据
- 非关系型数据库
- 高吞吐量等
适合NoSQL的场景
- 埋点和日志数据
- 热数据
- 元数据等
异步
任务队列和消息队列
- 消息队列接收,保留和传递消息,如RabbitMQ、Kafka
- 任务队列接收任务及其相关数据,并执行任务,例如Celery
通讯
略过的内容
- OSI 7层模型
- UDP协议
- RPC
- REST
HTTP协议
- HTTP2.0
TCP协议
- 序列号和校验码
- 确认包和自动重传
- 流量控制和拥塞控制
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。