分布式架构知识体系
1. 问题
- 何为分布式,何为微服务?
- 为什么需要分布式?
- 分布式核心理论基础,节点、网络、时间、顺序,一致性?
- 分布式系统有哪些设计模式?
- 分布式有哪些类型?
- 如何实现分布式?
2. 关键词
节点,时间,一致性,CAP,ACID,BASE,P2P,机器伸缩,网络变更,负载均衡,限流,鉴权,服务发现,服务编排,降级,熔断,幂等,分库分表,分片分区,自动运维,容错处理,全栈监控,故障恢复,性能调优
3. 全文概要
随着移动互联网的发展和智能终端的普及,计算机系统从单机独立工作过渡到多机器协作工作。计算机以集群的方式存在,按照分布式理论的指导构建出庞大复杂的应用服务。本文从分布式基础理论、架构设计模式、工程应用、部署运维、业界方案这几大方面,介绍基于 MSA(微服务架构)的分布式知识体系大纲,从而对 SOA 到 MSA 的进化有立体的认识,从概念和工具应用上更进一步了解微服务分布式的本质。
4. 基础理论
4.1 SOA 到 MSA 的进化
SOA 面向服务架构
由于业务发展到一定程度后,需要对服务进行解耦,将单一的大系统按逻辑拆分成不同子系统,通过服务接口通讯。SOA 通常需要总线集成服务,且大多共享数据库,单点故障可能导致总线层故障,甚至拖垮数据库,因此需要更独立的设计方案。
MSA 微服务架构
微服务是真正意义上的独立服务,从服务入口到数据持久层逻辑上完全隔离,无需服务总线接入,但增加了分布式系统的搭建和管理难度。微服务的兴起需要整套技术栈无缝接入,以支撑微服务治理理念。
4.2 节点与网络
节点
传统节点是单体物理机,包含服务和数据库;随着虚拟化发展,节点演变为虚拟机上的服务;容器技术成熟后,节点成为轻量级容器服务。节点是提供单位服务的逻辑计算资源集合。
网络
分布式架构的根基是网络,分为同步网络、半同步网络和异步网络:
- 同步网络:节点同步执行,消息延迟有限,高效全局锁。
- 半同步网络:锁范围放宽。
- 异步网络:节点独立执行,消息延迟无上限,无全局锁,部分算法不可行。
常用网络传输层协议:
- TCP 协议:解决重复和乱序问题,速度较慢。
- UDP 协议:常量数据流,丢包不致命。
4.3 时间与顺序
时间
分布式系统中,协调不同节点间的先后关系困难。网络时间协议(NTP)试图解决标准时间问题,但存在不足,如节点时间不同步、硬件时钟漂移等。逻辑时钟和向量时钟被引入以改进时间协调。
- 逻辑时钟:定义事件先后,
t' = max(t, t_msg + 1)。 - 向量时钟:
t_i' = max(t_i, t_msg_i)。 - 原子钟:提供高精度时间。
顺序
顺序是一致性理论的基本概念,时间工具的引入使得协商节点一致性成为可能。
4.4 一致性理论
强一致性 ACID
单机环境下,传统关系型数据库遵循 ACID 原则:
- Atomicity(原子性):事务操作要么全完成,要么全不完成。
- Consistency(一致性):事务前后数据库完整性不被破坏。
- Isolation(隔离性):允许多个并发事务同时读写,防止交叉执行导致不一致。
- Durability(持久性):事务完成后,数据修改永久保存。
分布式一致性 CAP
分布式环境下,无法同时保证一致性(Consistency)、可用性(Availability)和分区容忍性(Partition)。相关理论包括:
- CAP:系统无法同时满足三者。
- FLP:异步环境中,存在恶意节点时无法在有限时间达成共识。
- DLS:部分同步网络可容忍 1/3 错误;异步模型无容错;同步模型可达 100% 容错。
弱一致性 BASE
为兼顾效率,发展出最终一致性理论 BASE:
- Basically Available(基本可用):允许部分可用性损失,保证核心可用。
- Soft State(软状态):允许中间状态,不影响整体可用性。
- Eventual Consistency(最终一致性):数据副本经过时间后达到一致。
一致性算法
一致性是分布式核心,常用算法包括:
- Paxos:优雅的共识算法。
- Raft:易于理解的共识算法。
- Gossip:基于传播的算法。
CALM 原则:单调逻辑保证最终一致性,无需中心节点调度。
CRDT 数据结构:
- 基于状态:节点间 CRDT 数据直接合并,顺序不影响结果。
- 基于操作:操作通知其他节点,任意顺序可合并到同一状态。
5. 场景分类
5.1 文件系统
分布式文件系统解决多机协作存储问题,常见系统包括:
- HDFS
- FastDFS
- Ceph
- MooseFS
5.2 数据库
分布式数据库分为关系型和非关系型(NoSQL),NoSQL 包括:
- 列式存储:Hbase
- 文档存储:Elasticsearch, MongoDB
- KV 类型:Redis
- 关系型:Spanner
5.3 计算
分布式计算分为:
- 离线计算:Hadoop
- 实时计算:Spark
- 流式计算:Storm, Flink/Blink
5.4 缓存
分布式缓存提升性能,需解决一致性问题:
- 持久化:Redis
- 非持久化:Memcache
5.5 消息
消息队列消除异步复杂性:
- Kafka
- RabbitMQ
- RocketMQ
- ActiveMQ
5.6 监控
分布式系统需监控:
- Zookeeper
5.7 应用
应用间通信基于 RPC 或 HTTP 协议:
- HSF
- Dubbo
5.8 日志
分布式日志系统用于故障定位:
- 日志采集:Flume
- 日志存储:Elasticsearch, Solr, SLS
- 日志定位:Zipkin
5.9 账本
区块链是去中心化分布式系统:
- 比特币
- 以太坊
6. 设计模式
6.1 可用性
- 健康检查:定期检查系统功能。
- 负载均衡:平滑重负载。
- 节流:限制资源消耗。
6.2 数据管理
- 缓存:加载数据到缓存。
- CQRS:命令查询职责分离。
- 事件溯源:记录事件序列。
- 索引表:为查询字段创建索引。
- 物化视图:预填充数据视图。
- 拆分:水平分区或分片。
6.3 设计与实现
- 代理:反向代理。
- 适配器:连接现代与遗留系统。
- 前后端分离:后端提供接口。
- 网关聚合/卸载/路由:优化请求处理。
- 领导人选举:协调分布式系统。
- 管道和过滤器:分解复杂任务。
- 边车:隔离监控组件。
- 静态内容托管:使用 CDN 加速。
6.4 消息
- 竞争消费者:多线程并发消费。
- 优先级队列:高优先级消息优先消费。
6.5 管理与监控
公开运行时信息,支持动态管理。
6.6 性能与扩展
支持动态扩展以应对负载变化。
6.7 弹性
- 隔离:故障隔离。
- 断路器:处理远程服务故障。
- 补偿交易:撤销操作。
- 重试:处理临时故障。
6.8 安全
- 联合身份:外部身份验证。
- 看门人:代理验证请求。
- 代客钥匙:限制资源访问。
7. 工程应用
7.1 资源调度
弹性伸缩
- 应用扩容:自动扩展/缩容。
- 机器下线:回收资源。
- 机器置换:无缝切换故障机器。
网络管理
- 域名申请/变更:统一管理。
- 负载管理:设定访问策略。
- 安全外联:拦截非法请求。
- 统一接入:统一权限管理。
故障快照
- 现场保留:保存故障现场。
- 调试接入:日志调试。
7.2 流量调度
负载均衡
- 交换机, F5, LVS, Nginx, VIPServer
网关设计
- 高性能、分布式、业务筛选。
流量管理
- 请求校验:拦截非法请求。
- 数据缓存:使用 CDN。
流控控制
- 流量分配:计数器、队列、漏斗、令牌桶。
- 流量限制:QPS、线程数、RT 阈值,工具如 Sentinel。
7.3 服务调度
注册中心
- 状态类型:检测服务可用性。
- 生命周期:管理服务状态。
版本管理
- 集群版本:定义版本号。
- 版本回滚:异常时回滚。
服务编排
- K8S, Spring Cloud, HSF, ZK+Dubbo
服务控制
- 发现:服务注册与健康检查。
- 降级:关闭非核心功能。
- 熔断:保护过载服务,工具如 Hystrix。
- 幂等:全局一致性 ID,如 Snowflake。
7.4 数据调度
- 状态转移:全局存储状态。
- 分库分表:横向扩展。
- 分片分区:多副本冗余。
7.5 自动化运维
- 配置中心:统一管理配置。
- 部署策略:停机、滚动、蓝绿、灰度、A/B 测试。
- 作业调度:SchedulerX, Spring 定时任务。
- 应用管理:重启、上下线、日志清理。
7.6 容错处理
- 重试设计:设置重试时间和次数。
- 事务补偿:补偿失败操作。
7.7 全栈监控
- 基础层:监控硬件指标。
- 中间件:监控健康情况。
- 应用层:监控性能和业务。
- 监控链路:Zipkin, SLS, Goc, Alimonitor。
7.8 故障恢复
- 应用回滚:保存故障现场后回滚。
- 基线回退:代码版本回退。
- 版本回滚:集群版本回滚。
7.9 性能调优
- 分布式锁:解决缓存一致性。
- 高并发:多线程提升吞吐量。
- 异步:事件驱动提升响应效率。
8. 总结
分布式系统复杂且易出错,需通过备份和冗余提高可靠性。微服务背景下,Docker、K8S 和 Spring Cloud 是构建分布式系统的核心技术栈。建议优先考虑单节点方案,除非性能需求明确需要分布式系统。





