System Design 学习笔记2

本文是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协议

  • 序列号和校验码
  • 确认包和自动重传
  • 流量控制和拥塞控制

你可能感兴趣的:(系统设计)