索引 / 001 ZH-CN
Introduction to Reliable and Secure Distributed Programming(可靠与安全的分布式程序设计导论) cover

计算机科学

计算机科学

Introduction to Reliable and Secure Distributed Programming(可靠与安全的分布式程序设计导论)

Christian Cachin; Rachid Guerraoui; Luís Rodrigues

英文原名: Introduction to Reliable and Secure Distributed Programming

卡尚(Christian Cachin)、盖拉维(Rachid Guerraoui)与罗德里格斯(Luís Rodrigues)合著的研究生教材,讨论使分布式程序能够容忍故障的抽象。书中精确定义广播、共享内存与共识等抽象,给出在崩溃故障和拜占庭故障(任意或恶意故障)下的模块化算法,并论证其正确性。

需要的基础: 需修过分布式系统或操作系统课程以及算法课程,并能熟练阅读伪代码和正确性证明。

难度等级
高级
学术层次
研究生
distributed algorithmsfault toleranceconsensusbyzantine faultsbroadcast教科书

01 / 导读

导读

引用

Cachin, C., Guerraoui, R., & Rodrigues, L. (2011). Introduction to Reliable and Secure Distributed Programming (2nd ed.). Springer.

章节概要

本书(约 320 页)是一本教科书,讲分布式编程的抽象,以及进程可能崩溃或遭受攻击时实现这些抽象的算法。前言指出,贯穿全书的主题是对不确定性和对抗性影响的容忍:网络延迟、故障和恶意攻击。作者由简单环境中的简单抽象,逐步推进到更具挑战性环境中的更复杂抽象,并常常在多种系统模型下实现同一个原语,以展示模型如何改变算法。全书分两部分:第一部分(第1–2章)建立共同基础,第二部分(第3–6章)每章讨论一个问题。第7章是简短的结束章。第二版在第一版《Introduction to Reliable Distributed Programming》(2006)的基础上增加了对恶意行为的安全性(拜占庭容错),所以书名增加了“Secure”一词,并增加了一位合著者。

第1章:引言

本章通过讨论使用分布式编程抽象的应用来说明其必要性。内容包括分布式编程抽象、端到端论证、软件组件和算法类别,并介绍书中用来描述算法的模块化记号和伪代码。

第2章:基本抽象

本章介绍对分布式环境的各种假设和一族系统模型,前言建议把它当作后续各章的参考。主题有:分布式计算、进程的抽象、密码学抽象、通信的抽象、时间假设、时间的抽象,以及由此得到的分布式系统模型。章末有习题和解答。

第3章:可靠广播

向一组进程广播消息,并提供不同强度的递送保证。本章从尽力而为广播出发,经过常规与一致(uniform)可靠广播,到顽固(stubborn)与带日志的变体、概率广播、FIFO 与因果广播,再到针对恶意故障的拜占庭一致广播、拜占庭可靠广播和拜占庭广播信道。前言中的例子是:即使发送者崩溃,也要保证递送给一个进程的消息会递送给所有进程。

第4章:共享内存

共享内存对分布式存储对象建模,这些对象通过读写操作访问,例如分布式存储系统中的文件或多处理器中的寄存器。本章构造 (1, N) 常规寄存器和原子寄存器、(N, N) 原子寄存器、带日志的常规寄存器,以及拜占庭安全、常规和原子寄存器,使得即使有些进程崩溃、丢失了值或报告错误数据,仍能取回一个值。

第5章:共识

共识抽象使一组进程能根据各自提出的值,在存在故障进程的情况下决定同一个值。本章涵盖常规共识、一致共识(包括在 fail-noisy 模型中)、带日志的共识、随机共识、拜占庭共识和拜占庭随机共识。

第6章:共识的变体

通过扩展或修改共识而得到的变体:全序广播(及其拜占庭版本)、可终止可靠广播、快速共识与快速拜占庭共识、非阻塞原子提交、组成员关系和视图同步通信。

第7章:结束语

简短的结束章,涉及在 Appia 中的实现、其他实现和进一步阅读。

核心概念

第1–2章:抽象与模型

  • 模块与事件记号:用来描述抽象和算法的模块化伪代码风格。
  • 系统模型:进程抽象(崩溃与拜占庭故障)、链路抽象和时间假设。
  • 密码学抽象:拜占庭算法所依赖的密码学原语的抽象形式。

第3–4章:广播与寄存器

  • 可靠广播与一致广播:在崩溃情况下的递送保证,一致版本更强。
  • FIFO 与因果广播:建立在可靠广播之上的顺序保证。
  • 常规寄存器与原子寄存器:共享存储的精确正确性条件。

第5–6章:共识

  • 共识:在存在故障进程的情况下,就提出的值达成一致。
  • 全序广播、原子提交、组成员关系:通过共识定义的抽象。
  • 拜占庭变体:能容忍任意或恶意行为的对应版本。

评析

优点

  • 模块化、渐进的设计。 先给出抽象的规约,然后在最简单的模型中给出算法,再在更难的模型中重新讨论同一个原语,因此假设产生的影响清晰可见。
  • 同时涵盖崩溃与拜占庭故障。 第二版在第一版的基础上增加了对恶意进程的安全性,第3–6章每章都在崩溃故障的版本之外给出拜占庭变体。
  • 附解答的习题。 作者为习题花了大量时间,并附有全部习题的解答,意图是把它们作为内容的一部分。容易的习题适合课堂,较难的适合自学。
  • 自成一体。 前言称本书是自足的,只需很少的算法、逻辑、网络、安全和操作系统背景,就能理解其中的抽象。
  • 配套材料。 书的网站提供讲义、教程材料,以及第一版中基于 Appia 框架的 Java 实践实现(已为本版更新)。

局限

  • 不是形式证明。 作者声明书中没有定理,正确性论证的目的是帮助理解而非形式证明;重点是抽象和算法,而不是可计算性和复杂度。想了解不可能性结果或复杂度界的读者需要参考其他资料。
  • 偏形式而非实践。 第二版的一位评论者(Alex Popescu)称它是从形式角度出发的极好入门,讲的是共识、寄存器和广播这样的分布式系统基础,而不是“编程”或“工程”。
  • 范围。 第一版的一位评论者(Seif Haridi)指出有些主题未涉及,例如自稳定算法和对分布式事务更详细的说明。
  • 作为课程的进度。 第一版的另一位评论者(Felix Freiling)报告说,仅从底层抽象一路讲到可终止可靠广播,就已用了整整一个学期,这还没算编程习题,并且还补充了关于证明的材料。

在课程中的定位

这是分布式系统书单中偏形式、偏算法的一端。《Understanding Distributed Systems》是面向构建或运维联网应用的开发者的简明入门;van Steen 和 Tanenbaum 的《Distributed Systems》以及 Coulouris 等人的《Distributed Systems: Concepts and Design》是涵盖架构、通信、命名、复制和安全的综合教材;《Designing Data-Intensive Applications》是对数据系统的实用研究;《An Introduction to Parallel Programming》讲如何为多核、集群和 GPU 系统编写并行程序。

想先了解各类系统,可先读那些更宽泛的教材或实践书;当你想要广播、寄存器和共识的精确规约与算法,并理解复制系统在故障和攻击下为什么会那样表现时,再读本书。

如何使用本书

作者把本书写成面向本科或基础研究生教学以及个人自学的教科书。具备算法、一阶逻辑、编程语言、网络、安全和操作系统的初步知识会有帮助,但不是必需的。

实用安排:

  • 较短的基础课程: 第1–2章,然后是第3至6章中仅涉及崩溃故障的版本;前言认为这是一门较短的课程,可以作为偏实践的分布式编程课程的配套。
  • 完整课程: 所有章节和习题,包括拜占庭算法和随机算法。
  • 按兴趣选读: 想了解复制与消息传递读第3章,存储读第4章,一致性协议读第5章。

先做习题再看解答;作者说,被动学习无法获得像样的理解。网站上的 Appia 实践代码可用来运行这些算法。