## 定義 部分故障(partial failure)とは、分散システムの一部だけが予測不能な形で壊れる一方、他の部分は正常に動作し続ける状態を指す。単一コンピュータでは(ハードウェアが正常な限り)同じ操作は常に同じ結果を返す決定的な振る舞いをし、内部故障が起きればカーネルパニック等で完全停止することを設計上選好するため「正常か完全停止か」の二値になりやすい。これに対し分散システムでは、複数マシンをネットワークで接続する構成そのものが「一部だけ壊れる」余地を作り出す。部分故障は本質的に**非決定的**である——複数ノードとネットワークが絡む操作は、実行するたびに成功したり失敗したりし、しかも呼び出し側は成功したかどうか自体を確信できないことがある。(Source: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 9 The Trouble with Distributed Systems]] "Faults and Partial Failures") ## 部分故障がもたらす二面性 部分故障の非決定性はソフトウェアを扱いにくくする直接の原因である一方、システムが部分故障を許容できれば強力な可能性が開ける。たとえば 1 台ずつ再起動しながらソフトウェア更新を行うローリングアップグレードは、システム全体を止めずに一部だけを意図的に「故障」させる操作と見なせる。フォールトトレランスは、信頼できない部品の集合から単一ノードより信頼できるシステムを構築する手段になる。(Source: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 9 The Trouble with Distributed Systems]] "Faults and Partial Failures") ## 横断的知見 - **部分故障の非決定性は、テスト側から見ると「粗粒度障害では再現しない」という形で現れる**: DDIA 第9章は部分故障を「一部だけが予測不能に壊れる」現象として定義するが、[[@2026__TOCS__Fail-Slow Hardware Failure Bug Analysis and Detection for Cloud Systems]] はこの非決定性がテストの設計制約になることを示す——フェイルスロー NIC が一部の I/O だけを遅くする状況で、代わりにノードクラッシュやネットワーク分断のような**全体を落とす**障害を注入すると、フォールトトレランス機構が働いてバグが再現しない。部分故障は「起きたときに扱いにくい」だけでなく「意図的に再現することも難しい」。(Source: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 9 The Trouble with Distributed Systems]], [[@2026__TOCS__Fail-Slow Hardware Failure Bug Analysis and Detection for Cloud Systems]] §1) - 現時点では DDIA 第9章が主要ソース。[[分散システム障害]] は設定ミス・非決定的並行バグ・実証研究ベースの分類を扱っており、本概念(部分故障という現象そのものの理論的定義)とは補完関係にあると見込まれるが、突き合わせにはソースの追加が必要。 - **Database Internals 9 章は、部分故障の非決定性を「障害検出という具体的な工学的問題」として書き直す**: DDIA 第9章が部分故障を「一部だけが予測不能に壊れる」現象として抽象的に定義するのに対し、[[@2021__OReillyJapan__詳説 データベース - Chapter 9 障害検出]]は同じ非決定性を「プロセスがクラッシュしたのか、それとも実行速度が遅くて応答に限りないほど長い時間がかかっているのかを区別できない」という、[[障害検出器]]が解決を試みる具体的な検知問題として提示する。DDIA が「なぜ非決定的にならざるを得ないか」を演繹的に説明するのに対し、Database Internals は「その非決定性を前提にどう実用的な検出アルゴリズムを設計するか」という工学的な後続の問いに踏み込んでおり、両者は部分故障という同じ現象の異なる焦点(理論的性質 対 検出アルゴリズム設計)を扱う。(Source: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 9 The Trouble with Distributed Systems]] "Faults and Partial Failures", [[@2021__OReillyJapan__詳説 データベース - Chapter 9 障害検出]] p.201) - **Database Internals 8 章は「部分故障」という用語そのものを先に導入し、9 章の障害検出はその用語を前提に工学的問題へ具体化する**: Database Internals 第8章§8.2.6は「1つ以上のプロセスに障害があっても正常に動作し続けられるシステムを構築するには、部分障害[TANENBAUM06]のケースを考慮し…」と述べ、部分故障という用語をネットワーク分断・欠落障害と結びつけて導入している。この時点では「障害は検出するのが困難であり、システムの異なる箇所から常に同じように見えるとは限らない」という一般論にとどまるが、続く第9章はこれを[[障害検出器]]という具体的なアルゴリズム設計問題として引き継ぐ。DDIA第9章の理論的定義(「一部だけが予測不能に壊れる」)・Database Internals第8章の用語導入(ネットワーク分断との結びつけ)・同第9章の検出アルゴリズム設計という3段階は、抽象度を下げながら同じ現象を扱う一連の記述と見なせる。(Source: [[@2021__OReillyJapan__詳説 データベース - Chapter 8 基本事項の紹介と概要]] §8.2.6, [[@2021__OReillyJapan__詳説 データベース - Chapter 9 障害検出]], [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 9 The Trouble with Distributed Systems]] "Faults and Partial Failures") ## 未解決の問い - [[分散システム障害]] が扱う実証的な障害タクソノミー(設定ミス・並行バグ・CSI 障害・スケーラビリティ障害)は、本概念の「部分故障」という理論的定義とどう対応するか。実証研究の各カテゴリは部分故障のどの側面(検知不能性・非決定性)を具体化したものと言えるか。 - 部分故障を許容する設計(ローリングアップグレード等)と、部分故障を検知して復旧する設計(クォーラム・フェンシングトークン等、本章後半で扱う)は、システム設計上どちらを優先すべきか。両者はどの程度独立に選択できるか。 - [[障害検出器]]が示す完全性/正確性のトレードオフ(Database Internals 9 章)は、部分故障の非決定性という理論的性質からどの程度必然的に導かれるか。両者を接続する形式的な議論はまだ本概念に蓄積されていない。 ## 関連 - ソース: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 9 The Trouble with Distributed Systems]] / [[@2021__OReillyJapan__詳説 データベース - Chapter 8 基本事項の紹介と概要]] / [[@2021__OReillyJapan__詳説 データベース - Chapter 9 障害検出]] - 概念: [[分散システム障害]] / [[フォールトトレランス]] / [[グレイ障害]] / [[フェイルスローハードウェア]] / [[障害注入]] / [[障害検出器]] ## 出典 - Martin Kleppmann and Chris Riccomini, *Designing Data-Intensive Applications*, 2nd Edition, O'Reilly Media, 2026, Chapter 9, "Faults and Partial Failures". - Gen Dong, Yu Hua, Yongle Zhang, Zhangyu Chen, Menglei Chen. "Fail-Slow Hardware Failure Bug Analysis and Detection for Cloud Systems." *ACM Transactions on Computer Systems*, 2026. DOI: 10.1145/3838187. - Alex Petrov, *詳説 データベース*, オライリー・ジャパン, 2021, 9 章 p.201. - Alex Petrov, *詳説 データベース*, オライリー・ジャパン, 2021, 8 章, §8.2.6.