索引 / 001 JA
Distributed Systems(分散システム) cover

コンピュータサイエンス

コンピュータサイエンス

Distributed Systems(分散システム)

Maarten van Steen; Andrew S. Tanenbaum

英語原題: Distributed Systems

アーキテクチャ、プロセス、通信、命名、協調、一貫性、複製、耐故障性、セキュリティを、原理のすぐそばに既存システムの実例を置きながら説明する、原理重視の分散システム教科書。第4版ではブロックチェーンシステムに関する内容が加わり、すべてのコード例がPython 3に更新された。著者は、メールアドレスを登録した読者に個人用のディジタル版を無料で提供している。

前提知識: 入門レベルのオペレーティングシステムとコンピュータネットワーク、およびプログラミング経験。Pythonの例は短く読みやすい。

難易度レベル
中級
学術レベル
学部
distributed systemsconsistencyreplicationfault toleranceopen access教科書

01 / 読書ガイド

読書ガイド

引用

van Steen, M., & Tanenbaum, A. S. (2023). Distributed Systems (4th ed.). distributed-systems.net. 著者のサイトで無料の個人用コピーが入手できます:https://www.distributed-systems.net/index.php/books/ds4/

章の要約

本書は全9章です。著者のページによれば、第3版の構成に近く、既存の分散システムの例は、それが示す一般原理のそばに置かれ、最初は読み飛ばしてよい内容は枠で囲んだ節に入れられ、ブロックチェーンシステムとその構成要素が全体を通して論じられます。すべての Python コードは Python 3 に更新され、完全な例は著者のサイトから入手できます。

第1章:Introduction(はじめに)

最初の章は、ネットワークシステムから分散システムへと進み、分散システムと分散型(decentralized)システムを区別します。設計目標(資源共有、分散透明性、オープン性、信頼性、セキュリティ、スケーラビリティ)を示し、分散システムを分類し(クラスタやグリッドなどの高性能コンピューティング、分散情報システムとアプリケーション統合、モバイルコンピューティングやセンサネットワークを含むパーベイシブシステム、クラウドとエッジの連続体)、最後に分散システム開発の落とし穴を取り上げます。

第2章:Architectures(アーキテクチャ)

第2章は、アーキテクチャスタイル(階層型、オブジェクトベース、RESTful、パブリッシュ・サブスクライブまたは調整ベースのスタイル)とミドルウェアの役割から始まり、システムアーキテクチャを比較します。階層型と多層の集中型設計、対称な分散型設計(構造化および非構造化ピアツーピアシステム、スーパーピア、BitTorrent)、そして混成型の設計(クラウドコンピューティング、エッジサーバアーキテクチャ、ブロックチェーン)です。

第3章:Processes(プロセス)

この章は、スレッド、仮想化(コンテナ、仮想マシンとクラウドコンピューティングの関係を含む)、クライアント、サーバ(全体の構成、状態、オブジェクトサーバ、Apache やコンテンツ配信ネットワークなどの例)、コード移動(仮想マシンの移動を含む)を扱います。

第4章:Communication(通信)

この章は階層化プロトコルと通信の種類から始まり、遠隔手続き呼出し、メッセージ指向通信(ソケット、要求・応答、パブリッシュ・サブスクライブ、パイプライン、MPI、メッセージブローカーによるキューベースのメッセージング)、マルチキャスト通信(アプリケーションレベルのマルチキャストと、情報伝達のための疫学的プロトコルを含む)を扱います。

第5章:Coordination(調整)

第5章は、時計の同期、論理時計とベクトル時計、相互排除と選挙アルゴリズムを扱い、ZooKeeper、Raft、プルーフ・オブ・ワークやプルーフ・オブ・ステークによる選挙を例とします。続いて、ゴシップに基づく調整、分散イベントマッチング、GPS や Vivaldi などの位置特定システムへ進みます。

第6章:Naming(名前付け)

名前付けの章は、名前、識別子、アドレスを区別し、フラットな名前付け(ブロードキャスト、転送ポインタ、ホームベースの方式、Chord などの分散ハッシュテーブル)、構造化された名前付け(名前空間、解決、DNS、NFS)、属性ベースの名前付け(ディレクトリサービス、LDAP)、名前付きデータネットワーキングを扱います。

第7章:Consistency and Replication(一貫性とレプリケーション)

この章は、なぜデータを複製するのかを説明したあと、データ中心の一貫性モデル(逐次一貫性、因果一貫性、結果整合性、連続的一貫性)、クライアント中心の一貫性モデル(単調読み出しと単調書き込み、自分の書き込みの読み出し、読み出しに続く書き込み)、レプリカ管理、一貫性プロトコル(プライマリベースと複製書き込みのプロトコル)、Web におけるキャッシュとレプリケーションを扱います。

第8章:Fault Tolerance(耐障害性)

この章は、信頼性と障害モデルの紹介から始まり、プロセスの耐性とコンセンサス(フラッディングベースのコンセンサス、Raft、Paxos、ビザンチン耐障害性 PBFT、CAP 定理を含む)を扱います。続いて、信頼できるクライアントサーバ通信とグループ通信、分散コミット(2相コミット)、チェックポイントとメッセージログによるリカバリを扱います。

第9章:Security(セキュリティ)

セキュリティの章は、セキュリティの脅威、ポリシー、メカニズム(プライバシーと GDPR を含む)、暗号、認証(共有鍵、Needham-Schroeder、公開鍵、Kerberos、TLS)、分散システムにおける信頼(シビル攻撃とエクリプス攻撃、ブロックチェーンによる方法)、認可(アクセス制御、委譲、OAuth)、ファイアウォールと侵入検知による監視を扱います。

主要概念

第1〜4章:基礎

  • 分散透明性とスケーラビリティ:分散をユーザやアプリケーションから隠すこと、規模と地理的範囲を拡大すること。
  • アーキテクチャスタイルとミドルウェア:コンポーネントとコネクタの構成。ピアツーピア、クラウド、エッジ、ブロックチェーンのシステムを含む。
  • 仮想化とコード移動:複数のマシンにまたがってソフトウェアを実行し、移動すること。
  • RPC とメッセージ指向通信:プロセスがデータをやり取りする主な方法。

第5〜6章:調整と名前付け

  • 論理時計とベクトル時計:大域的な時計なしにイベントを順序づけること。
  • 相互排除と選挙:アクセスを調整し、リーダーを選ぶこと。
  • フラット、構造化、属性ベースの名前付け:エンティティの所在を突き止めること。Chord と DNS が例。

第7〜9章:一貫性、耐障害性、セキュリティ

  • 一貫性モデル:複製されたデータに対するデータ中心およびクライアント中心の保証。
  • コンセンサスと分散コミット:Paxos、Raft、PBFT、2相コミット。
  • 認証、認可、信頼:暗号プロトコルとアクセス制御。

批判的分析

長所

  • 原理が先、システムはその傍らに。 著者は、既存システムの例が一般原理を論じる箇所に置かれていると述べており、各章は製品のカタログではなく、繰り返し現れる問題(名前付け、調整、一貫性、耐障害性)を中心に構成されています。
  • 実行できるコード。 すべての Python コードは Python 3 に更新され、著者はほぼすべての例が簡単なスクリプトで実行できると述べています。完全な例と図はダウンロード可能なアーカイブに入っています。
  • 新しい話題。 ブロックチェーンシステムが全体にわたって論じられ、目次にはクラウドとエッジのアーキテクチャ、コンテナ、Raft と Paxos、ビザンチン耐障害性、GDPR、OAuth が含まれています。
  • オープンアクセス。 個人用のデジタルコピーは無料で、PDF と PPTX のスライド一式があり、スライドの LaTeX ソースも提供されています。
  • 任意の内容に印がある。 枠で囲んだ節は最初は読み飛ばせるので、初学者は本筋を追うことができます。

短所

  • データシステムに関する章が少ない。 トランザクション、分散ファイルシステム、マルチメディアは独立した章になっていません。NFS の例はアーキテクチャと名前付けの中に現れ、入れ子トランザクションは第1章のアプリケーション統合の議論に出てきます。ストレージやトランザクションをもっと知りたい読者には、別の本が必要です。
  • 実践上の手間。 著者は、例によっては Redis などの特別なパッケージのインストールが必要であること、無料コピーの申請の処理には時間がかかることがあると述べています。
  • 自己出版。 本は著者自身が配布しており、ペーパーバックは Amazon 経由です。後のバージョン(4.01〜4.03)には小さな訂正が含まれるため、自分と授業がどのバージョンを使っているか確認する必要があります。
  • 簡略化されたコード。 著者が述べているように、コード例は読みやすさのために多くの詳細を省いており、考え方を示すものであって、製品品質の実装ではありません。

コースにおける位置づけ

van Steen と Tanenbaum の本は、このコースの図書のうち原理優先の分散システムの教科書です。Coulouris、Dollimore、Kindberg、Blair の Distributed Systems: Concepts and Design はより長く(21章)、より古く(2011年)、ミドルウェア、セキュリティ、トランザクション、拡張された事例研究により多くの紙幅を割いているので、両者は代替にも補完にもなります。Vitillo の Understanding Distributed Systems は開発者向けの簡潔な入門書で先に読むことができ、Kleppmann と Riccomini の Designing Data-Intensive Applications は、レプリケーション、パーティショニング、ストリーム処理を扱うデータシステムの実践的な研究で、上で述べたストレージとトランザクションの不足を補います。

Cachin、Guerraoui、Rodrigues の Introduction to Reliable and Secure Distributed Programming は、ブロードキャスト、共有メモリ、コンセンサスの抽象を厳密に規定する大学院レベルの教科書で、本書の第5章と第8章の次に進むのに自然な本です。Pacheco の An Introduction to Parallel Programming は、マルチコアマシンやクラスタで並列プログラムを書くための別の道筋です。

本書の使い方

本書は、上級の学部生や大学院1年次の分散システムの授業、およびネットワークサービスを作るソフトウェアエンジニアに向いています。著者のページは前提知識を示していません。プログラミングの経験があれば Python の例が理解しやすく、オペレーティングシステムとネットワークの知識があればプロセスと通信の章が理解しやすくなります。

実践的な進め方は次のとおりです。

  • 中核: 第1・2章、続いて第4章(通信)、第5章(時計、相互排除、選挙)、第7章(一貫性とレプリケーション)、第8章(耐障害性とコンセンサス)。
  • 選択的に: オペレーティングシステムの背景が薄ければ第3章、名前付けは第6章、セキュリティは第9章(単独で読めます)。
  • 実習: コードと図のアーカイブをダウンロードし、Python の例を(必要なパッケージをインストールして)実行し、復習にスライドを使ってください。最初は枠で囲んだ節を飛ばします。
  • 版の確認: 無料コピーは現行バージョン(4.03 以降)を使ってください。小さな訂正が行われてもページ番号は変わらないようにされています。