バックエンド・API・データ · 上級

ダウンタイムなしのスキーマ移行

一行でいうと: 後方互換性のあるステップでスキーマを変更する:追加し、埋め、切り替え、最後にのみ——削除する。

問題

リリース中は二つのコードバージョンが一緒に実行される。一度にカラムを変更する移行はどちらかを壊す。なので、すべての構造的変更はそれぞれが単独で安全なステップのシーケンスに分解される。

安全なシーケンス

追加。新しいカラム、NULLを許可、既存のものに触らない。

二重書き込み。コードは両方のカラムに書き込み、古いものから読むことを好む。

バックフィル。小さなバッチで、ピーク時間外に、停止できる機能を持って。

読み取り切り替え。データが同一であることを確認後。

削除。誰も読んでいないことを確認した後の別のリリースで。

注意ルール

大きなテーブルへの移行はロックする可能性がある。エンジンのロック動作を確認し、本番サイズのコピーで実行する。前のバックアップ、プレッシャー下で即興されるのではなく事前に書かれたロールバックスクリプト。

さらに深く

自動実行と順序制御でバージョン管理のコードとして移行を管理する。スキーマ変更と同じリリースでロジック変更を混ぜない:何かが壊れたとき、どちらが原因かを知りたい。