要約

  • 参加者は、自分の処理をredoにもundoにもできる情報を永続化してからYESを返す。その票は単独で撤退する自由を失わせるが、全体の結論は作らない。
  • コーディネーターの永続的な決定は別の事実である。preparedの参加者がそれを確認できないなら、推測より待機の方が原子性を守る。
  • commitが拘束するのは参加した資源管理系であり、メール、人の作業、現金払出機など外部の作用が一度だけ完了したことまでは証明しない。

障害から戻った参加者のログに、強制書き込み済みのprepare記録がある。ローカル処理は成功し、YESも送った。しかし判定だけが見つからない。この状態を「ほぼcommit」と呼ぶと、運用判断を誤る。正確にはprepared、すなわち決定待ちである。

Jim Grayのトランザクション論が今も有効なのは、準備と決定権を分けて考えさせるからだ。第一相は二つの結果を実行できる能力と、勝手に離脱しない義務を作る。第二相で初めて、正当な権限から結果が届く。

prepareは判定ではなく約束である

Grayの1978年の論考では、コーディネーターが各参加者に、何が起きても担当分をredoまたはundoできる状態へ移るよう求める。参加者はAGREEと答える前に、必要なUNDO/REDO情報を安全な場所へ書かなければならない。

YES以前なら拒否してabortできる。YES以後は、commitとabortの双方を実行できるログ、ロック、版を維持する必要がある。ローカルの成功が全体の成功へ昇格したのではない。条件付きの約束が永続化されたのである。

C. Mohan、Bruce Lindsay、Ron ObermarckによるIBM R*の論文は、この境界をさらに明記する。下位参加者はprepare記録を強制書き込みし、YESを送り、prepared状態に入る。その後は単独でcommitもabortもできない。

commit点はコーディネーター側にある

コーディネーターは必要な票を集め、条件がそろったときに全体のcommit記録を強制書き込みしてから結論を通知する。R*はこの書き込みをcommit pointと呼ぶ。個々のYESは、その参加者が後で従うべき事実より先に存在する。

この順序がなければ、複数のローカル成功が相反する複数の真実になる。一つの参加者が自分のYESをcommitと解釈し、別の参加者が準備前に失敗すれば、片方だけが変更を外部へ見せかねない。二つの相は、各地の準備を一つの永続的な判定に従属させるためにある。

他の全員がYESだったと知っても、参加者が自動的にコーディネーターになるわけではない。票についての知識と結果を成立させる権限は別物だ。復旧が探すべきものは、本物の決定であって、もっともらしい予測ではない。

復旧が再構成するのはプロトコル上の知識

Grayの復旧規則は簡潔だ。強制書き込み済みの同意記録がなければ、永続的な約束は外へ出ていないのでabortできる。記録があれば、コーディネーターか正当な復旧経路から判定を得て、REDOまたはUNDOを行う。ログが答えるのは「何を約束したか」であり、「何が起きてほしいか」ではない。

したがって運用画面は、working、prepared/in-doubt、committed、abortedを分ける必要がある。preparedを「成功」にまとめると、最も重要な不確実性が消える。サービスが正常でデータも無傷なのに、全体の結果だけは不明という状態は現実にある。

必要な証拠は、トランザクション識別子、コーディネーターまたは復旧権限、prepare時刻、最後に確認した応答、保持中のロックや版である。業務処理を再実行しても古い判定は分からず、二重の作用を増やすおそれがある。

ブロックは結論を捏造しないための境界

YESを受け取った後、参加者に判定が届く前にコーディネーターが失われると、古典的2PCはブロックしうる。GrayとLeslie LamportのConsensus on Transaction Commitも、この単一コーディネーター障害を明確な制約として扱う。

待機中はロックも容量も解放できず、後続処理が止まる。それでも待機は、知識も権限も足りないという事実を正直に保つ。commitを推測すれば結果が分裂し、abortを推測すれば別の場所ですでに永続化されたcommitと矛盾する可能性がある。

R*は非常時のヒューリスティックな運用判断にも触れるが、全体判定との不一致を招くと警告する。強制判断は通常保証からの例外として記録し、照合と修復を伴わせるべきで、2PCを非ブロッキングに変える魔法ではない。

トランザクションの外側は自動では守られない

Grayは1981年の論文で、保護された作用と「real action」を区別した。データベースのログは状態を戻せるが、払い出した現金を回収し、届いたメールを取り消し、人の判断や未参加の装置動作を逆再生することはできない。

外部作用には別の設計が要る。commit後まで遅らせる、冪等キーを与える、後で配送する要求を永続化する、あるいは補償動作を定める方法がある。補償は新たな業務行為であって、完全なrollbackではない。

そのためデータベースがcommittedでも、外部メッセージは未送信、重複、失敗のいずれかになりうる。逆に装置が動いた後でトランザクションがabortすることもある。正しい状態表示は、トランザクション判定と外部作用の証拠を別々に示す。

歴史上の功績も一人にはまとめられない

Grayの説明を中心に据えても、彼を2PC唯一の発明者とは書けない。Gray自身の1978年の注記はRon Obermarck、Earl Jenner、Steve Weickの先行研究を挙げ、Butler LampsonとHoward Sturgisによる独立発見を記す。R*論文とその最適化はMohan、Lindsay、Obermarckの仕事であり、後の大著はAndreas Reuterとの共著、Paxos CommitはLamportとの共著である。

この境界を守ると、Grayから得られる核心が鮮明になる。システムが何を知り、何を約束し、誰が決め、どの作用が制御外に残るのかを、別々の問いとして扱う姿勢である。

出典