← 研修トップ
出して、戻して、直す — 変更と復旧の実務
コードを置くことと、利用者に効かせることは別の操作です。新旧の版は入れ替えの間ずっと同じデータを読み書きし、待っているだけのスキーマ変更が後ろの読み取りを止めます。レプリカは誤った DELETE も複製し、バックアップは戻してみるまで仮説のままです。パスワードを替えても、開いたままの接続は切れません。壊れたときに打てる手は、壊れる前に用意した分しかありません。SRE の公開文書・PostgreSQL の公式文書・NIST の文書と、Docker で手元に立てた実演から積み上げます。
- 1約 9 分置くことと効かせることは別の操作新しいコードを本番に置く操作(デプロイ)と、それを利用者に効かせる操作(リリース)は分けられます。機能フラグは同じプロセスのまま挙動を切り替え、ブルーグリーンはプロキシの向き先を切り替えます。
- 2約 9 分カナリアは、同時に動く対照群と比べるカナリアは、新版を一部(カナリア)にだけ出し、残り(対照群)と同じ時刻に比べる手続きです。新版を全体に出してから前後で比べると、時間とともに動く指標の変化まで新版のせいに見えます。
- 3約 9 分入れ替えの間、新旧の版が同じデータを読み書きするローリング更新は、台を少しずつ入れ替えて止めずに出す方法です。止まらない代わりに、入れ替えの間は旧版と新版が同時に動き、同じ表を読み書きします。
- 4約 8 分待っているだけのスキーマ変更が、後ろの全員を止めるPostgreSQL の `ALTER TABLE ... ADD COLUMN` は、条件がそろえば大きな表でも速く終わります。しかし取るロックは `ACCESS EXCLUSIVE` で、取れるまでは待ちます。
- 5約 7 分秘密は、読める者の一覧でしか守られない秘密をコードに直書きせず環境変数に移すのは正しい一歩です。ただし秘密は消えたのではなく、置き場所が移っただけです。
- 6約 9 分秘密が効くかは、確かめる側が決める — 入れ替えと失効パスワードを替える、ロールを無効にする。どちらも記録を書き換える操作で、効くのは確かめる側が次に確かめたときだけです。
- 7約 9 分複製は誤りも複製する — レプリカはバックアップの代わりにならないレプリカは主の変更記録をそのまま再生するので、誤った DELETE も同じように再生します。守れるのは機械や拠点を失う故障で、誤操作や不具合で消えた行は守れません。
- 8約 9 分RPO は、最後のコピーが届いた地点で決まるベースバックアップと WAL アーカイブを組めば、誤った DELETE の直前へ戻せます。ただし戻れるのは、閉じて外へ届いた WAL の末尾までです。
- 9約 9 分バックアップは、まだ走らせていない復元バックアップは、戻してみるまで「戻せるはず」という仮説です。PostgreSQL 18.6 の実演では、pg_dump の出力を新しいサーバへ流すと psql は終了コード0で終わり100件が戻りましたが、アプリのロールが存在せず、そのロールではログインできませんでした。
- 10約 9 分緩和と修正は別 — 原因の場所が分かれば止血できる障害の最中に最初にやるのは、原因を解き明かすことではなく影響を止めること(緩和)です。SRE Workbook は、緩和に詳細の理解は要らず、原因の「場所」が分かればよいと書いています。
- 11約 7 分状態を持つ人を1人に決める — 変更は班に、状態は指揮役に障害対応では、全体の状態を持つ人を1人(指揮役)に決めます。システムを変更するのは、その下で動く operations team だけです。
- 12約 9 分総合演習 — 出して、壊して、戻して、直す小さなメモアプリを要件から出し、新版の不具合で本文を消し、戻して、秘密を入れ替えるところまで1本の実演で通します。フラグを切ると不具合は止まりましたが、消えた本文は1行も戻りませんでした。