《极客时间教程 - 深入浅出分布式技术原理》笔记
2024/5/7大约 6 分钟
《极客时间教程 - 深入浅出分布式技术原理》笔记
开篇词 掌握好学习路径,分布式系统原来如此简单
导读:以前因后果为脉络,串起网状知识体系
分布式系统解决了什么问题
- 水平扩展:解决单机性能瓶颈和用户量/数据量爆炸
- 高可用:解决单点问题
- 分而治之:解决大规模系统迭代效率和成本
分布式系统引入的新问题
- 服务发现与注册、路由与负载均衡、配置中心
- 分布式锁、重试+幂等
- 限流、熔断、降级、弹性扩容
- 分布式链路追踪与监控告警
分布式存储内部协调
- 理解 ACID、CAP、BASE
- 确定分片策略(Hash / Region)
- 确定复制方案:中心化(主从、Raft/Paxos)或去中心化(Quorum、Vector Clock)
- 处理分布式事务(2PC、3PC)
新的挑战:分布式系统是银弹吗?
- 故障处理、网络不可靠(超时)、时间不可靠(NTP、逻辑时钟)
- 共识协同(共识性算法)
CAP 理论:分布式场景下只能三选二吗?
当发生网络分区时,强一致性和可用性只能二选一。
注册发现:AP 系统和 CP 系统哪个更合适?
注册中心关键要求:
- 可用性最高:分布式系统基石
- 性能中等、数据容量低、API 友好
服务发现关键:统一的中介存储 + 状态更新与通知。
因为可用性是最关键的设计目标,AP 系统更合适。
负载均衡:从状态的角度重新思考负载均衡
常见策略:轮询、随机、加权轮询/随机、最少连接/请求、最少响应时间、Hash、一致性 Hash、虚拟一致性 Hash。
配置中心:如何确保配置的强一致性呢?
关键挑战:统一的配置存储(带版本管理)+ 配置信息的同步(修改后及时同步到所有实例)。
特性要求:可用性最高、性能中等、数据容量低。
分布式锁:所有的分布式锁都是错误的?
重试幂等:让程序 Exactly-once 很难吗?
分布式系统无法保证 Exactly-once:超时情况下无法判断请求是否已处理。
幂等设计要点:
- 使用唯一性 ID 标记请求并去重
- 保存状态快照+回滚(代价高,少用)
雪崩(一):熔断,让故障自适应地恢复
雪崩效应:某一服务故障导致级联扩散,引起大范围服务不可用。
熔断器三种状态:
- Closed:计数器记录失败次数,达到阈值则切换
- Open:立即返回错误/降级结果,启动超时计时器
- Half-Open:允许少量请求探测,成功则恢复,失败则继续 Open
雪崩(二):限流,抛弃超过设计容量的请求
常见限流算法:固定窗口、滑动窗口、漏桶、令牌桶。
雪崩(三):降级,无奈的丢车保帅之举
牺牲非核心服务保障核心服务稳定性。实现方式:手动降级、自动降级。
雪崩(四):扩容,没有用钱解决不了的问题
动态扩容:可观测性监控核心指标 → 达到阈值触发扩容 → K8S 容器化扩容。
可观测性(一):如何监控一个复杂的分布式系统?
三类数据:日志(Logs)、链路(Traces)、指标(Metrics)。
- Logs:ELK
- Traces:Jaeger、Zipkin、SkyWalking
- Metrics:Prometheus + Grafana
四个黄金指标:延迟、流量、错误、饱和度。
可观测性(二):如何设计一个高效的告警系统?
评价指标:
- 信噪比:有效告警 / 无效告警(越高越好,评估"多报")
- 覆盖率:被告警通知的故障 / 全部故障(越高越好,评估"漏报")
- 转交率:被转交的告警 / 全部告警(越低越好)
故障(一):预案管理竟然能让被动故障自动恢复?
故障评价:平均故障频率(越低越好)、平均故障恢复时间(越短越好,更关键)。
被动故障来源:DNS 解析、网络连通性、硬件设施、第三方服务。
故障(二):变更管理,解决主动故障的高效思维方式
主动故障来源:程序发布、实例变更、配置变更、运营策略变更。
分片(一):如何选择最适合的水平分片方式?
略
分片(二):垂直分片和混合分片的 trade-off
略
复制(一):主从复制从副本的数据可以读吗?
三种复制方案:
- 主从复制:一个主副本 + 多个从副本(MySQL、PostgreSQL、Redis、MongoDB、Kafka 均支持)
- 多主复制:多个主副本,互相复制数据变更
- 无主复制:所有副本都可接受写入
关键:选择同步复制还是异步复制。
复制(二):多主复制的多主副本同时修改了怎么办?
多主复制目的:多机房多数据中心冗余。
实现:单元内常规主从复制,单元间主副本互相复制。
- 同步 → 退化为主从复制
- 异步 → 数据一致性问题(写入冲突)
复制(三):最早的数据复制方式竟然是无主复制?
无主复制:写入不依赖主节点,可用性好但一致性差。
关键:
- 数据读写通过 w + r > n 仲裁保证
- 数据修复通过读修复和反熵实现
- 无主复制是可用性优先的复制模型
事务(一):一致性,事务的集大成者
事务是一个或多个操作的组合,保证要么都执行,要么都不执行。
事务(二):原子性,对应用层提供的完美抽象
2PC 简介。
事务(三):隔离性,正确与性能之间权衡的艺术
事务隔离级别简介。
事务(四):持久性,吃一碗粉就付一碗粉的钱
Redo Log + WAL 简介。
一致性与共识(一):数据一致性都有哪些级别?
按强度由高到低:
- 线性一致性:所有进程看到一致有序的历史,符合时间顺序
- 顺序一致性:一致有序但不需符合时间顺序
- 因果一致性:因果事件有序,并发不排序
- 最终一致性:互相看到的写无序,但最终一致
一致性与共识(二):它们是鸡生蛋还是蛋生鸡?
略
一致性与共识(三):共识与事务之间道不明的关系
略
分布式计算技术的发展史:从单进程服务到 Service Mesh
略
分布式存储技术的发展史:从 ACID 到 NewSQL
略
春节加餐 技术债如房贷,是否借贷怎样取舍?
略
春节加餐 深入聊一聊计算机系统的时间
略
春节加餐 系统性思维,高效学习和工作的利器
略
结束语 在分布式技术的大潮流中自由冲浪吧!
略