Dev Study
← 研修トップ

出して、戻して、直す — 変更と復旧の実務

コードを置くことと、利用者に効かせることは別の操作です。新旧の版は入れ替えの間ずっと同じデータを読み書きし、待っているだけのスキーマ変更が後ろの読み取りを止めます。レプリカは誤った DELETE も複製し、バックアップは戻してみるまで仮説のままです。パスワードを替えても、開いたままの接続は切れません。壊れたときに打てる手は、壊れる前に用意した分しかありません。SRE の公開文書・PostgreSQL の公式文書・NIST の文書と、Docker で手元に立てた実演から積み上げます。

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