全部文章

分布式系统

文章目录

本文基于 SYSU-DCS325 的内容,对计算机专业课《分布式系统》进行较为详尽的知识点总结,涵盖少量实例分析。

1. 课程概述

1.1 课程目标

  1. 理解分布式系统的基本概念与核心原理。
  2. 掌握分布式系统的架构设计方法。
  3. 学习分布式系统的编程技术与工具。
  4. 了解分布式系统的运维与管理策略。
  5. 探索分布式系统领域的前沿技术与发展趋势。
  6. 激发学生对分布式系统研究与应用的兴趣。

1.2 课程内容安排

章节 内容
第1讲 分布式系统概述
第2讲 分布式系统体系架构
第3讲 分布式系统进程模型
第4讲 分布式系统通信
第5讲 分布式系统命名
第6讲 时钟与时间同步
第7讲 分布式系统同步
第8讲 分布式系统一致性
第9讲 分布式系统复制
第10讲 容错与可靠性保障
第11讲 分布式系统共识
第12讲 Paxos及RAFT协议
第13讲 分布式文件系统与存储系统
第14讲 面向大数据与AI的分布式计算框架
第15讲 P2P及内容分发网络

2. 分布式系统基础概念

2.1 定义

分布式系统是由多个自主且独立的计算机通过网络互联而成的集合,对用户而言,这些计算机像是一个单一的整体系统。

Leslie Lamport 的著名定义:

“A distributed system is one in which the failure of a computer you didn’t even know existed can render your own computer unusable.”

2.2 特性

  1. 自主性

    • 计算节点的硬件与软件进程独立运行。
    • 节点在物理上分布,而在逻辑上协调一致。
  2. 耦合性

    • 用户感知系统为一个整体,隐藏了内部的分布性。
    • 节点之间需要协作,共同完成任务。
  3. 其他特性

    • 组件由所有用户共享访问。
    • 系统资源可能分布在不同的物理位置,不一定直接可访问。
    • 软件运行在不同处理器上的多个并发进程中。
    • 支持多点控制和多点故障。

3. 分布式系统目标

分布式系统设计主要围绕以下四个目标:

  1. 资源访问

    • 提供便捷的资源访问方式,用户无需关注资源的实际存储位置。
  2. 透明性

    • 隐藏资源在网络上的分布,包括访问、位置、复制等方面的透明性。
  3. 开放性

    • 采用标准化的接口,确保系统的可扩展性和互操作性。
  4. 可扩展性

    • 系统能够在规模、地域和管理上灵活扩展,以适应不断增长的需求。

3.1 透明性的详细分类

透明性类型 说明
访问 隐藏不同的数据表示形式及资源访问方式
位置 隐藏资源的实际物理位置
迁移 隐藏资源的动态移动,确保资源位置变化对用户透明
重定位 隐藏资源在使用过程中可能的迁移动作
复制 隐藏资源是否存在多个副本
并发 隐藏多个用户对资源的并发访问
故障 隐藏系统资源的故障与恢复过程
持久化 隐藏数据在主存与磁盘之间的存储细节

注意:完全透明性难以实现,且可能带来性能开销。因此,设计时需在透明性与系统性能之间找到平衡。

4. 可扩展性

4.1 可扩展性的三个维度

  1. 规模可扩展性

    • 支持用户数量和处理进程数量的增加。
  2. 地理可扩展性

    • 支持节点分布在广泛的地理位置,确保跨地域的数据访问与计算。
  3. 管理可扩展性

    • 系统管理结构能够适应管理域和组织结构的扩展。

4.2 扩展技术

  1. 隐藏通信延迟

    • 使用异步通信技术,减少同步等待。
    • 设计分离的响应消息处理器,提高响应效率。
    • 将部分计算任务从服务器端迁移至客户端,减轻服务器负载。
  2. 分布式处理

    • 将数据和计算任务分布到多个机器上,提升并行处理能力。
    • 使用分布式命名服务器(如DNS)和分布式信息系统(如WWW)实现资源的全局管理。
  3. 数据复制

    • 在多个机器上创建数据副本,提升数据的可用性和访问速度。
    • 应用场景包括:分布式文件服务器、数据库复制、网站镜像和Web缓存等。

5. 分布式系统类型

5.1 集群计算系统

5.2 网格计算系统

5.3 云计算

5.4 普适计算系统

5.5 移动计算系统

5.6 传感网络

6. 分布式系统面临的挑战

  1. 系统设计

    • 设计正确的接口和抽象层次。
    • 功能划分与可扩展性设计。
  2. 一致性

    • 共享数据的一致性保证。
    • 处理读写冲突与写写冲突。
  3. 容错

    • 确保系统在节点失效情况下的正常运行。
    • 设计有效的故障检测与恢复机制。
  4. 部署场景差异

    • 集群环境、广域网环境、传感网络等不同部署场景带来的设计与实现差异。
  5. 实现问题

    • 最大化并行性,消除性能瓶颈。
    • 负载均衡与资源优化。

7. 分布式系统架构

7.1 案例分类

  1. 分布式文件系统

    • 例子:HDFS、NFS、Ceph。
  2. 分布式数据库

    • 例子:MongoDB、Cassandra、Elasticsearch。
  3. 分布式处理框架

    • 例子:Hadoop、MPI、Spark、Storm。
  4. 分布式调度器

    • 例子:YARN、Mesos、Slurm。
  5. 分布式操作系统

    • 例子:Kubernetes、OpenStack。

7.2 软件体系结构

7.2.1 基本概念
7.2.2 软件体系结构风格
  1. 分层体系结构

    • 分层设计,常用于客户端-服务器模型,如典型的三层架构(表示层、业务逻辑层、数据层)。
  2. 面向对象的体系结构

    • 基于对象的设计,适用于分布式对象系统,如CORBA。
  3. 基于事件的体系结构

    • 采用发布/订阅模式,事件驱动,适用于高并发、高解耦系统。
  4. 共享数据空间体系结构

    • 通过共享内存或数据空间,实现进程间的解耦与协作。

7.3 系统体系结构

7.3.1 类型划分
  1. 集中式体系结构(Master-Slave)

    • 单一控制中心管理整个系统,协调各节点的工作。
  2. 非集中式体系结构(P2P)

    • 无中心控制,各节点自主运行,适用于去中心化应用。
  3. 混合体系结构

    • 结合集中式与非集中式特点,例如点对点文件共享系统,部分节点充当协调者。
7.3.2 客户端-服务器模型

特点:

  1. 服务器进程

    • 提供特定服务的核心进程。
  2. 客户端进程

    • 发送请求并等待服务器响应,获取所需服务。
  3. 通信协议

    • 常用协议包括HTTP/HTTPS(REST API)、AJAX(异步请求)、RPC(如XMLRPC、SOAP、gRPC)。
7.3.3 应用分层

传统三层架构:

  1. 用户接口层

    • 系统与用户直接交互的部分,如GUI、管理界面。
  2. 应用逻辑层

    • 包含业务逻辑与主要功能,不直接依赖具体数据存储。
  3. 数据访问层

    • 管理系统使用的实际数据,如数据库、文件系统。

8. 分布式系统通信

8.1 基础网络模型

8.1.1 网络层次结构
  1. 物理层

    • 负责数据的实际传输,处理物理媒介上的发送和接收。
  2. 数据链路层

    • 将数据组织成帧,提供错误检测与流量控制。
  3. 网络层

    • 负责数据包在网络中的路由与转发。
  4. 传输层

    • 提供端到端的通信服务,主要协议包括TCP(可靠)、UDP(不可靠)、QUIC(基于UDP的高效协议)。
  5. 中间件层

    • 提供通用的通信服务和协议支持,如数据封装、命名协议、安全协议等。

8.2 通信类型

8.2.1 基本分类
  1. 瞬时通信 vs 持久通信

    • 瞬时通信:消息无法传递时直接丢弃。
    • 持久通信:消息存储在服务器,直到成功传递。
  2. 同步通信 vs 异步通信

    • 同步通信:发送方在等待响应期间被阻塞。
    • 异步通信:发送方无需等待响应,可以继续执行其他任务。
8.2.2 客户端-服务器通信特点

同步通信缺点:

8.3 远程过程调用(RPC)

8.3.1 基本原理
8.3.2 参数传递注意事项
  1. 数据表示差异

    • 客户端与服务器可能使用不同的数据表示方式,需要统一编码机制。
  2. 编码机制

    • 基本数据类型需统一表示,如整数、字符串。
    • 复杂数据类型需规范化,如结构体、对象的序列化与反序列化。
8.3.3 RPC类型
  1. 同步RPC

    • 客户端发送请求后阻塞,直到接收到服务器响应。
  2. 异步RPC

    • 客户端发送请求后立即返回,后续通过回调或事件处理响应。
  3. 多RPC调用

    • 客户端同时向多个服务器发送请求,提高并发与效率。
8.3.4 现代RPC实现:gRPC & Protobuf

特点:

  1. 语言无关、平台无关,支持多种编程语言。
  2. 高效,使用二进制序列化协议(Protobuf),体积小、传输快。
  3. 支持流式通信,适合实时数据传输。
  4. 严格的接口约束,确保服务的一致性与兼容性。

8.4 面向消息的通信

8.4.1 Berkeley套接字

主要操作原语:

socket()   // 创建通信端点
bind() // 绑定本地地址
listen() // 监听连接
accept() // 接受连接请求
connect() // 建立连接
send() // 发送数据
recv() // 接收数据
close() // 关闭连接
8.4.2 ZeroMQ高级消息模式
  1. 请求-回复模式

    • 客户端发送请求,服务器回复响应。
  2. 发布-订阅模式

    • 发布者广播消息,订阅者接收感兴趣的消息。
  3. 管道模式

    • 多生产者与多消费者通过队列交互,实现任务分发与处理。
8.4.3 消息队列系统

特点:

  1. 支持异步、持久化消息传递。
  2. 通过队列管理器管理消息的存储与转发。
  3. 提供灵活的消息路由功能,支持多种消息交换模式。

8.5 Kafka消息系统

主要组件:

  1. Producer - 消息的生产者,负责发送消息到Kafka集群。
  2. Consumer - 消息的消费者,从Kafka集群中读取消息。
  3. Broker - Kafka集群中的服务器节点,负责消息的存储与转发。
  4. Topic - 消息的主题,Producer发送消息到特定主题,Consumer订阅主题获取消息。
  5. Partition - 主题的分区,Kafka通过分区实现消息的并行处理与负载均衡。

8.6 多播通信

8.6.1 应用层多播

组织方式:

  1. 树状结构

    • 节点间形成唯一路径,结构简单但可靠性较低。
  2. 网络结构

    • 节点有多个邻居,结构复杂但具备更高的健壮性。
8.6.2 Gossip协议(流行病协议)

传播模型:

  1. 反熵(Anti-entropy)模型

    • 基于数据同步,确保最终一致性。
  2. 流言传播模型

    • 随机选择节点进行信息交换,具备良好的扩展性,适用于大规模系统。

9. 分布式系统命名系统

9.1 基本概念

9.1.1 名称
9.1.2 访问点(Access Point)
9.1.3 标识符(Identifiers)

特性:

  1. 每个标识符唯一引用一个实体。
  2. 每个实体最多由一个标识符引用。
  3. 标识符一旦分配,永不重用,确保引用的一致性。

9.2 无层次结构命名

9.2.1 基于广播/多播的命名解析
  1. 广播方式

    • 客户端发送广播请求,实体响应当前地址。
    • 局限性:难以跨越局域网,需所有进程监听请求,带来带宽浪费。
  2. 多播方式

    • 客户端发送多播请求,实体响应。
    • 优势:适用于大规模网络,减少不必要的广播流量。
9.2.2 基于转发指针的命名解析

原理:

问题:

9.2.3 分布式散列表(DHT)

以Chord为例:

结构特点:

  1. 节点组织成环形结构,每个节点有唯一的m位标识符。
  2. 实体通过唯一的m位健值(Key)进行标识,存储在满足ID >= Key的最小标识符节点上。
  3. 每个节点维护m个指针,指向当前节点后的2^(i-1)位置节点,支持对数级别的查找效率。

9.3 结构化命名

9.3.1 命名空间
9.3.2 名称解析机制
  1. 闭包机制

    • 通过分层命名解析,如www.domain.com由DNS服务器解析,/home/user/file由本地文件服务器解析。
  2. 链接类型

    • 硬链接:直接通过路径名查找。
    • 软链接:通过存储绝对路径名实现引用。
9.3.3 命名空间实现的三层结构
  1. 全局层

    • 包含根节点及近根节点,结构稳定,通常代表整个组织或多个组织群体。
  2. 行政层

    • 单个组织内部管理的目录节点,变化相对频繁,代表组织内的实体组。
  3. 管理层

    • 代表本地主机、文件系统等,节点状态频繁变更,由终端用户维护。

9.4 名称解析方式

9.4.1 迭代式解析
9.4.2 递归式解析

9.5 基于属性的命名

9.5.1 LDAP(轻量级目录访问协议)

特点:

9.5.2 扩展性考虑
  1. 规模扩展性

    • 服务器需处理大量并发请求,需具备高吞吐量与低延迟。
  2. 地理扩展性

    • 通过数据复制提高可用性,采用“就近服务”原则减少延迟。

10. 分布式系统协同

10.1 基础概念

10.1.1 同步与协作
  1. 同步类型

    • 事件同步:事件在时间上达成一致。
    • 进程同步:一个进程等待其他进程完成特定操作。
    • 数据同步:保证多个节点的数据集合保持一致。
  2. 协作定义

    • 管理系统中各行为之间的交互与依赖关系,分布式系统的协作复杂度高于单节点系统。

10.2 时钟同步

10.2.1 物理时钟
  1. 统一协调时间(UTC)

    • 基于原子钟的精确时间标准,通过网络时间协议(NTP)同步。
  2. 时钟精度与准确度

    精度定义:|Ci(t) - Cj(t)| ≤ ε
    准确度定义:|Ci(t) - t| ≤ α
    • Ci(t) 表示机器i在UTC时间t的时钟时间。
    • ε 为精度参数,α 为准确度参数。
10.2.2 时钟漂移
  1. 时钟规约

    (1 - ρ) ≤ F(t)/F ≤ (1 + ρ)
    • ρ 为最大时钟漂移率。
    • F(t) 为t时刻硬件时钟频率,F 为理想频率。
  2. 时钟同步方法

    a) Berkeley算法

    • 时间服务器定期收集所有节点时间,计算均值后通知各节点调整时钟。

    b) 参考广播同步化(RBS)

    • 适用于无线网络,节点定期广播参考时间,接收节点通过线性回归调整本地时钟。

10.3 逻辑时钟

10.3.1 发生关系(Happen-before)

定义三条规则:

  1. 同一进程中,事件a在事件b之前发生,则a → b。
  2. 事件a是消息的发送,事件b是消息的接收,则a → b。
  3. 如果a → b 且 b → c,则a → c。
10.3.2 Lamport逻辑时钟
  1. 时间戳规则

    • P1:同进程事件a → b,则C(a) < C(b)。
    • P2:消息发送事件a和接收事件b,则C(a) < C(b)。
  2. 实现机制

    1. 每个进程Pi维护本地计数器Ci。
    2. 进程内部事件发生时,Ci = Ci + 1。
    3. 发送消息m时,Ci = Ci + 1,将时间戳ts = Ci附加到消息。
    4. 接收消息m(ts)时,Ci = max(Ci, ts) + 1。
10.3.3 向量时钟
  1. 数据结构

    • 每个进程Pi维护一个向量VCi[1…N]。
    • VCi[j] 表示Pi已知的第j个进程的事件数。
  2. 更新规则

    • 进程Pi本地事件:VCi[i] = VCi[i] + 1。
    • Pi发送消息:先执行本地事件更新,再发送消息。
    • Pi接收消息m(ts):
      • 对所有j,VCi[j] = max(VCi[j], ts[j])。
      • VCi[i] = VCi[i] + 1。

10.4 分布式互斥

10.4.1 基于许可的方法
  1. 集中式方法

    • 单一协调者控制资源访问,存在单点故障风险。
  2. 分布式方法(Ricart & Agrawala算法)

    请求访问资源时:

    1. 构造消息(资源名,进程号,逻辑时间)。
    2. 发送给所有其他进程。
    3. 等待所有进程回复OK。

    接收请求时:

    1. 未访问资源:直接返回OK。
    2. 已获得访问权:将请求加入队列。
    3. 想访问但未获得:比较时间戳
      • 接收到的消息时间戳早:返回OK。
      • 自己时间戳早:将请求加入队列。
10.4.2 基于令牌的方法

令牌环算法

10.5 选举算法

10.5.1 Bully算法

运行机制:

  1. Pi发起选举:

    • 向所有ID更大的进程发送ELECTION消息。
    • 如无人响应,Pi成为新Leader。
    • 有响应则等待更高ID进程的选举结果。
  2. Pj收到ELECTION消息:

    • 发送OK给Pi。
    • 向更高ID进程发起新一轮选举。
  3. 胜出者发送COORDINATOR消息,宣布自己为Leader。

10.5.2 Ring算法

运行机制:

  1. 进程按环形结构组织。
  2. 选举发起者将自己的ID加入消息列表。
  3. 消息沿环传递,各进程添加自己的ID。
  4. 消息返回发起者时,选出最大ID作为Leader。
  5. 新Leader通过环形广播通知所有进程。

11. 分布式系统一致性与复制

11.1 基础概念

11.1.1 复制的原因
  1. 性能提升

    • 通过在多个节点上存储数据副本,提升数据读取速度与系统吞吐量。
  2. 提高可用性

    • 数据副本的存在保证了部分节点故障时系统依然可用。
11.1.2 主要挑战
  1. 一致性保证

    • 确保所有副本上的数据在任何时间点保持一致,防止数据冲突与不一致。
  2. 冲突类型

    • 读写冲突:一个进程读取数据,另一个进程同时写入数据。
    • 写写冲突:多个进程对同一数据进行并发写操作。

11.2 数据中心一致性模型

11.2.1 连续一致性模型

偏差类型:

  1. 数值偏差

    • 不同副本间的数值存在差异。
  2. 新旧偏差

    • 不同副本的数据新旧程度不同。
  3. 顺序偏差

    • 不同副本上操作的顺序和数量不一致。
11.2.2 Consistency Unit(Conit)

结构组成:

  1. 包含多个数据项(如x, y)。
  2. 每个副本维护向量时钟,记录数据状态。
  3. 操作持久化,不允许回滚,确保操作记录的不可更改性。

偏差度量:

11.2.3 顺序一致性

定义:所有进程看到的操作执行顺序一致,每个进程自身的操作按程序顺序执行。

示例:

时间轴示意:
P1: W(x)1 R(x)1
P2: W(x)2 R(x)2 [顺序一致]
11.2.4 因果一致性

定义:具有因果关系的操作必须以相同顺序被所有进程看到,保持操作之间的因果依赖。

特点:

11.3 客户端中心一致性模型

11.3.1 单调读一致性

定义:如果一个进程读取了数据项x的值,后续的读取操作不会读到更旧的值。

示例:

正确示例:
P1: W(x)1 R(x)1 R(x)1
P2: W(x)2 R(x)2

错误示例:
P1: W(x)1 R(x)2 R(x)1 [违反单调读]
P2: W(x)2
11.3.2 单调写一致性

定义:一个进程的写操作必须按顺序完成,即后续的写操作不能先于先前的写操作执行。

11.3.3 读写一致性

定义:进程的写操作结果必须对该进程的后续读操作可见,确保读到最新写入的数据。

11.4 复制管理

11.4.1 副本放置策略
  1. 服务器放置

    • 从N个位置中选择K个最佳位置,考虑客户端距离最小化。
    • 常用方法:几何空间划分,如哈希分区、地理分布等。
  2. 内容放置

    • 使用多层次的放置策略,如三个同心环:
      • 永久副本(最内环):关键数据的稳定副本。
      • 服务器启动副本(中环):由服务器自动管理的副本。
      • 客户端启动副本(外环):由客户端主动管理和维护的副本。
11.4.2 内容分发策略
  1. 传播方式

    • 更新通知传播:服务器主动通知客户端更新信息。
    • 数据传播:被动复制,通过请求拉取更新数据。
    • 操作传播:主动复制,传递操作日志以同步更新。
  2. 更新方式

    Push方式:

    • 服务器主动推送更新到客户端。
    • 适用于频繁更新的数据。

    Pull方式:

    • 客户端按需主动请求更新。
    • 适用于低频更新或按需访问的数据。

11.5 一致性协议

11.5.1 基于主备份的协议
  1. 远程写协议

    步骤:

    1. 客户端发送更新请求到主副本。
    2. 主副本转发更新请求到所有备份副本。
    3. 备份副本确认接收更新。
    4. 主副本向客户端返回成功响应。
  2. 本地写协议

    适用场景:

    • 离线计算环境、移动计算环境。
    • 进行数据传输前的本地缓存与更新。
11.5.2 客户端中心一致性协议

实现机制:

每个客户端维护:

  1. 读操作集:与客户端读操作相关的写操作记录。
  2. 写操作集:客户端自身的写操作记录。

一致性检查:

12. 分布式系统容错

12.1 基本概念与术语

12.1.1 可依赖性相关概念
  1. 可靠性(Reliability)

    R(t) = P(组件从t=0到t时刻正常工作的概率)

    重要指标:

    • MTTF(平均失效时间):组件从工作开始到第一次失效的平均时间。
    • MTTR(平均恢复时间):组件失效后恢复正常工作的平均时间。
    • MTBF(平均故障间隔时间)= MTTF + MTTR。
  2. 可用性(Availability)

    A(t) = 在[0,t]时间内组件可用时间的比例。
    长期可用性:A = MTTF / (MTTF + MTTR)。

12.1.2 故障分类
  1. 按持续性分类

    • 暂时性故障:仅发生一次,可以通过重试恢复。
    • 间歇性故障:周期性发生,需要监控与预测。
    • 持久性故障:持续存在,需人工干预或更换组件。
  2. 按性质分类

    • 遗漏性失效:未执行应执行的操作,导致资源状态不可用。
    • 执行性失效:执行了不应执行的操作,可能导致资源状态不一致。

12.2 进程恢复机制

12.2.1 冗余策略
  1. 信息冗余

    • 通过附加校验位或冗余信息,检测与纠错数据传输中的错误。
  2. 时间冗余

    • 通过重执行操作或事务处理,确保操作的可靠性。
  3. 物理冗余

    • 增加额外的设备或进程,提升系统的容错能力。
12.2.2 K-容错组

容错度定义:

假设条件:

  1. 所有成员同质,具备相同能力。
  2. 所有成员以相同顺序处理命令,确保操作一致性。

12.3 共识协议

12.3.1 基于泛洪的共识

系统模型:

组件:

过程:

  1. 客户端联系Pi执行命令。
  2. 每个进程维护命令列表,基于轮数进行共识。
12.3.2 Paxos协议假设
  1. 系统模型:
    • 半同步系统,消息可能延迟但最终会到达。
    • 通信不可靠,消息可能丢失、重复或乱序。
    • 能够检测并丢弃损坏的消息。
    • 操作具有确定性,保证相同输入产生相同输出。
    • 节点可能出现崩溃失效,但不会发生网络分区。
    • 节点不会串通欺骗,保持诚实。

13. 分布式系统容错

13.1 可靠通信

13.1.1 可靠RPC机制

错误类型及解决方案:

  1. 无法定位服务器

    • 客户端返回错误信息,提示服务器不可达。
  2. 请求丢失

    • 客户端重新发送请求,确保最终传递。
  3. 服务器崩溃

    • 使用幂等操作,避免重复执行带来的副作用。
    • 采用事务处理机制,确保操作的原子性。
  4. 客户端崩溃

    • 使用孤儿操作消灭、任务再生和超时机制,确保系统状态一致。
13.1.2 可靠组通信

实现方式:

  1. 基本机制

    • 确保组内每个进程都能接收到消息。
    • 区分消息的发送与接收,防止消息丢失或重复。
  2. 反馈控制

    • 无等级反馈:使用多播反馈抑制机制,减少重复反馈。
    • 分等级反馈:采用树形结构组织反馈,提高反馈效率。

13.2 分布式提交协议

13.2.1 两阶段提交(2PC)

阶段1(投票阶段):

  1. 协调者发送VOTE_REQUEST给所有参与者。
  2. 参与者返回VOTE_COMMIT或VOTE_ABORT。

阶段2(提交阶段):

  1. 协调者根据投票结果发送GLOBAL_COMMIT或GLOBAL_ABORT。
  2. 参与者执行相应操作并返回确认。

失效处理:

13.2.2 恢复机制
  1. 检查点机制

    特点:

    • 定期记录进程状态,便于恢复。
    • 需要协调所有进程找到一致的恢复点。
    • 可能导致多米诺效应,即多个进程必须同时回滚。

    类型:

    • 独立检查点:每个进程独立记录状态。
    • 协调检查点:全局同步记录一致的状态。
  2. 日志消息机制

    优势:

    • 记录操作日志,支持通过重放达到一致状态。
    • 实现成本低于全面检查点。

    实现方式:

    • 持久化重要消息日志。
    • 保证消息的顺序一致性。
  3. 面向恢复的计算(RoC)

    特点:

    • 只重启系统的部分组件,减少恢复时间。
    • 系统组件高度分离,组件间依赖关系简单。
    • 支持增量恢复,提高恢复效率。

14. 分布式系统共识机制

14.1 基础概念

14.1.1 背景
14.1.2 系统特性

基于BASE理论:

14.2 Paxos算法

14.2.1 基本概念

角色定义:

  1. Proposer(提议者):提出共识值的节点。
  2. Acceptor(接受者):接收并投票的节点。
  3. Learner(学习者):学习最终共识值的节点。

消息类型:

  1. **Prepare(n)**:准备请求,提议编号n。
  2. **Promise(n, v)**:承诺响应,承诺不接受编号小于n的提案,并返回已接受的最高编号提案值v。
  3. **Accept(n, v)**:接受请求,提议编号n和提议值v。
  4. **Accepted(n, v)**:接受响应,表示接受了提议编号n的值v。
14.2.2 算法流程

阶段1(Prepare):

Proposer:

  1. 选择一个提案编号n。
  2. 向所有Acceptor发送Prepare(n)消息。

Acceptor:

  1. 如果n大于已承诺的所有编号:
    • 承诺不再接受编号小于n的提案。
    • 返回Promise(n, 已接受的最高编号提案值v)。
  2. 否则,拒绝Prepare请求。

阶段2(Accept):

Proposer:

  1. 如果收到大多数Promise响应:
    • 选择最高编号已接受的值v(如无则自由选择)。
    • 向所有Acceptor发送Accept(n, v)消息。

Acceptor:

  1. 如果未对更大编号做出承诺:
    • 接受提案,并发送Accepted(n, v)响应。
  2. 否则,拒绝Accept请求。
14.2.3 算法特性与示例
  1. 无冲突情况:
  1. 并发提案冲突:
  1. 安全性保证:

14.3 Raft算法

14.3.1 核心概念

角色定义:

  1. Leader(领导者):负责处理所有客户端请求,并管理日志复制。
  2. Follower(跟随者):被动响应Leader的请求或选举。
  3. Candidate(候选者):在Leader失效时发起选举的节点。

任期:

14.3.2 选举过程
  1. Follower在超时未收到Leader心跳后,转换为Candidate。
  2. Candidate增加当前任期编号,向其他节点发送选票请求。
  3. 如果Candidate获得多数选票,成为新的Leader。
  4. Leader定期发送心跳消息,维持领导地位。
  5. 如果其他Candidate在选举过程中发现更高任期的Leader,转换为Follower。
14.3.3 日志复制
14.3.4 一致性保证

14.4 PBFT(实用拜占庭容错)

14.4.1 系统模型

假设条件:

14.4.2 协议流程
  1. 请求阶段:

    • 客户端发送请求消息到主节点。
  2. 预准备阶段:

    • 主节点为请求分配序号,并广播预准备消息给所有节点。
  3. 准备阶段:

    • 节点验证预准备消息,确认消息的合法性。
    • 节点广播准备消息给所有参与节点。
  4. 提交阶段:

    • 节点在收到2f+1个准备消息后,广播提交消息。
  5. 执行阶段:

    • 节点在收到2f+1个提交消息后,执行请求并向客户端发送响应。
14.4.3 视图变更

触发条件:

过程:

  1. 副本节点广播视图变更请求。
  2. 在接收到至少2f+1个视图变更请求后,开始选举新的主节点。
  3. 选举出新主节点后,同步全局状态,恢复共识流程。

总结:

选择依据:系统需求(如一致性强度、容错类型)、性能要求与实现复杂度等。

15. 分布式文件系统

15.1 问题背景与概述

15.2 分布式文件系统的重要属性

15.3 分布式文件系统的体系结构

15.3.1 客户端-服务器体系结构
15.3.2 基于集群的分布式文件系统
15.3.3 Google文件系统(GFS)特点
15.3.4 对称式体系结构

15.4 文件系统中的进程

15.4.1 NFS的有状态与无状态模式
  1. 无状态NFS:

    • 优点:
      • 服务器实现简单,易于扩展。
      • 即使服务器崩溃,客户端无需恢复状态。
    • 缺点:
      • 无法实现文件锁定,容易导致并发访问冲突。
  2. 有状态NFS:

    • 优点:
      • 支持文件锁定,确保并发访问的一致性。
    • 缺点:
      • 服务器需要维护客户端的状态信息,增加实现复杂度。
      • 服务器崩溃后需恢复状态,影响系统可用性。
15.4.2 分布式文件系统中的RPC

15.5 NFS的命名与挂载

15.5.1 命名原则
15.5.2 自动挂载
15.5.3 全局名称空间

15.6 文件同步

15.6.1 文件共享语义
15.6.2 同步方案
  1. 立即传播改动

    • 优点:简单直接,确保所有副本实时一致。
    • 缺点:效率低下,增加网络带宽消耗。
  2. 会话语义

    • 特点:文件修改仅对修改进程可见,文件关闭后对其他进程可见,降低同步频率。
    • 适用场景:适用于需要中间状态不可见的应用,如文本编辑器。
  3. 只读文件

    • 特点:文件仅支持创建与读取,避免写操作带来的同步问题。
    • 适用场景:适用于日志文件、备份文件等仅需读操作的场景。
  4. 原子事务

    • 特点:通过事务机制,保证共享文件的操作具有原子性,即操作要么全部成功,要么全部失败。
    • 适用场景:需要确保操作一致性与完整性的应用,如数据库系统。
15.6.3 文件锁定
15.6.4 共享预约

16. 分布式系统一致性与复制

16.1 一致性模型

16.1.1 连续一致性与顺序一致性
16.1.2 因果一致性

16.2 一致性协议

16.2.1 Paxos协议
16.2.2 Raft协议
16.2.3 PBFT(实用拜占庭容错)

17. 分布式文件系统实例

17.1 HDFS(Hadoop Distributed File System)

17.2 Ceph文件系统

17.3 Lustre文件系统

18. 面向大数据与AI的分布式计算框架

18.1 分布式计算框架概述

18.2 著名分布式计算框架

  1. Hadoop

    • 组件:HDFS(分布式存储)、MapReduce(计算模型)、YARN(资源管理)。
    • 特点:适用于批处理大数据任务,具备高容错性与可扩展性。
  2. Spark

    • 特点:内存计算框架,支持多种计算模式(批处理、流处理、机器学习、图计算)。
    • 优势:高性能、易用性,广泛应用于实时数据分析与机器学习任务。
  3. MPI(Message Passing Interface)

    • 特点:面向高性能计算的并行编程模型,适用于需要低延迟、密集通信的应用。
    • 应用:科学计算、工程模拟、大规模并行应用。
  4. Storm

    • 特点:实时流处理框架,适用于实时数据分析与事件处理。
    • 优势:低延迟、高吞吐,广泛应用于流数据处理系统。

18.3 分布式机器学习平台

  1. Parameter Server(参数服务器)

    • 功能:管理和存储机器学习模型的参数,实现高效的参数访问与更新。
    • 技术:采用一致性哈希进行参数分区,支持分布式并行训练。
  2. 分布式训练策略

    • 数据并行:将数据集划分为多个子集,分布到不同的训练节点并行处理。
    • 模型并行:将模型划分为不同部分,分布到多个节点进行并行计算。
  3. 容错机制

    • 任务重试:在节点失效时,重新分配任务以保证任务完成。
    • 参数恢复:通过日志或快照机制,恢复模型参数状态,确保模型一致性。

18.4 深度学习在分布式环境中的应用

18.4.1 分布式深度学习的挑战
  1. 计算复杂度高

    • 深度学习模型包含大量参数,训练过程需要高性能计算资源。
    • 需要高效的计算资源管理与任务调度策略。
  2. 通信瓶颈

    • 模型参数的同步与更新会占用大量网络带宽,影响训练速度。
    • 需要优化通信协议与算法,减少带宽占用。
18.4.2 分布式深度学习平台
  1. FloydHub:https://www.floydhub.com/

    • 提供全托管的深度学习训练与部署服务,简化分布式训练流程。
  2. OpenPAI:https://github.com/Microsoft/pai

    • 微软开源的分布式人工智能平台,支持大规模分布式训练与模型管理。
  3. PaddlePaddle:http://www.paddlepaddle.org/

    • 百度开发的深度学习平台,支持高效的分布式训练与大规模模型部署。
  4. Kubeflow:https://www.kubeflow.org/

    • 基于Kubernetes的机器学习平台,支持分布式训练、模型部署与管理。
  5. Polyaxon:https://polyaxon.com/

    • 开源实验管理与分布式部署平台,支持机器学习模型的训练与调优。

19. 分布式文件系统案例分析

19.1 HDFS(Hadoop Distributed File System)

19.2 Ceph文件系统

19.3 Lustre文件系统

20. 安全性在分布式系统中的应用

20.1 NFS的安全性

20.2 安全的RPC

20.3 安全的对等文件共享系统

21. 总结

本课程全面涵盖了分布式系统的核心概念、架构设计、通信机制、一致性与复制、容错与可靠性保障以及分布式文件系统的实际应用。通过理论学习与案例分析,能够深入理解分布式系统的复杂性与设计挑战,掌握解决这些问题的关键技术与方法,为未来的研究与实际应用奠定坚实基础。

学习建议:

通过系统学习与实践,将具备设计、实现与维护高性能、高可用性分布式系统的能力,满足现代计算与大数据时代的需求。

# Operation System