分布式

1
2
3
https://github.com/Xten-no-brain/RaftKV
准备写一个分布式KV的轮子项目,故补充一下分布式相关的知识
下列提到的还处于了解阶段,待后续深入后再修改

CAP 定理

  • 一致性(Consistency):所有节点在同一时间的数据完全一致
  • 可用性(Availability):每个请求都能得到响应(不保证数据最新)
  • 分区容忍性(Partition Tolerance):系统能容忍网络分区故障

三者不可兼得,最多满足两项

因为分布式系统中,网络分区是不可避免的,故只有两种系统

  1. CP:强一致性、容错,但不一定总可用
  2. AP:高可用、容错,但可能短时间不一致

如何选取?



BASE 理论

对 CAP 中 AP 场景的扩展

基本可以:系统故障时仍能提供部分功能

软状态:允许中间状态存在

最终一致性:数据经过一段时间后达成一致



一致性模型

  • 强一致性
  • 线性一致性
  • 因果一致性
  • 会话一致性
  • 最终一致性

如何选取?



分布式事务

  • 两阶段提交(2PC)
  • 三阶段提交(3PC)
  • TCC 模型
  • SAGA 模型

如何选取?



副本同步

  • 主从复制(同步 / 异步 / 半同步)
  • Quorum 机制
  • Raft / Paxos 简介

如何选取?



服务发现

  • 静态配置
  • 动态注册与发现(Consul / Etcd / Zookeeper)

如何选取?



全局分布式 ID

  • UUID
  • Redis 生成 ID
  • 雪花算法
  • Leaf(美团开源)

如何选取?



负载均衡

  • 轮询
  • 加权轮询
  • 一致性哈希
  • 随机
  • IP Hash
  • 基于连接数 / RTT 动态调整

如何选取?



幂等性

  • 设计方法
    • 唯一流水号
    • 幂等表
    • 业务逻辑保障

典型场景



数据一致性

  • 强一致性
  • 最终一致性
  • 事件驱动架构
  • 消息队列一致性保障

如何选取?



分布式锁

  • 基于数据库
  • 基于 Redis
  • 基于 Zookeeper
  • 可重入 / 非可重入
  • 防止死锁设计

如何选取?



消息队列

  • Kafka / RabbitMQ / RocketMQ / Pulsar
  • 消息一致性保障
  • 消息幂等性设计
  • 消息顺序性设计

如何选取?



高可用设计

  • Leader 选举
  • 多活架构 vs 主备架构
  • 灾备策略

如何选取?



扩展性设计

  • 横向扩展
  • 无中心设计 vs 有中心设计
  • 分区与分片策略



缓存机制

  • 本地缓存 vs 分布式缓存
  • 缓存一致性策略
    • Cache Aside
    • Write Through
    • Write Behind
  • 缓存雪崩 / 穿透 / 击穿

如何选取?




限流机制

  • 固定窗口
  • 滑动窗口
  • 漏桶算法
  • 令牌桶算法

如何选取?




熔断 / 降级 / 容错

  • 熔断器(Hystrix / Sentinel)
  • 超时控制
  • 自动恢复机制

如何选取?




案例

短链生成系统



分布式 ID 生成器



高并发秒杀系统



分布式文件存储系统



分布式锁实践



消息队列实践