Postgresアップグレードの準備
- リスク評価: アップグレード過程で発生し得るリスクの一覧を作成し、重要度に応じて並べ替える。
- リスク解決策の検討: リスクを完全に取り除く、または時間をかけて分散できる解決策を検討する。
- リスク一覧の更新: プロジェクト進行中に新たなリスクが見つかった場合は一覧を更新する。
監視とメトリクスについて
- システム監視: データベースとシステムの健全性を監視するために徹底したツールを使用する。
- 主要メトリクスの観察: トランザクションID、CPU使用率、待機セッション、クエリ遅延、API応答遅延などの主要メトリクスを監視する。
Postgresアップグレードの選択肢
インプレースアップグレード(ゼロダウンタイムアップグレードには不向き)
- インプレースアップグレードの限界: AWS RDSで実行する場合はデータベースの再起動が必要で、データ量に応じて時間がかかる。
レプリケーションベースのアップグレード
- レプリケーションベースのアップグレードを選ぶ理由: 段階的な移行ステップ、実際のワークロードとデータで新しいデータベースをテスト可能、アップグレードの制御性を確保できる。
- ソースおよびターゲットデータベースの設定: レプリケーションスロットを設定し、
wal_levelをlogicalに設定する。
テーブルレプリケーション方法の選択
「小さい」テーブルのレプリケーション
- 小さいテーブルのレプリケーション: 単純な追加とサブスクリプションの再読み込みでレプリケーションできる。
大きく、追記専用のテーブル
- 追記専用テーブルのレプリケーション:
copy_dataオプションをfalseに設定して将来の変更のみをレプリケーションし、その後バックアップから過去データをバックフィルする。
更新が多い大規模テーブル
- 更新が多い大規模テーブルのレプリケーション: テーブルサイズを縮小し、
VACUUMを実行し、テーブルパーティショニングを検討する。
テーブルレプリケーション状態の確認
- レプリケーション状態の監視:
pg_subscription_relシステムテーブルを通じてレプリケーション状態を確認し、一度に1つのテーブルをレプリケーションすることを推奨する。
レプリケーションの中断
- レプリケーションを中断する方法: 必要に応じてテーブルレプリケーションを中断し、サブスクリプションの再読み込みでロールバックできる。
レプリケーションスロット移行に関する注意
- レプリケーションスロット移行の問題: レプリケーションスロットのLSNは元のデータベースに固有であるため、新しいデータベースへ直接コピーすることはできない。
マイグレーションの仕上げ
- テーブル整合性の検証: 2つのデータベース間でテーブルの行数が一致することを確認し、必要に応じてランダムサンプリングでデータ整合性を検証する。
アプリケーションレベルの変更
- データベース接続の変更: アプリケーションが新しいデータベースに接続するよう変更し、トラフィック切り替え戦略を策定する。
シーケンスに関する補足
- シーケンスの同期: レプリケーション過程ではシーケンス値は同期されないため、手動でシーケンス値を設定する。
最終確認チェックリスト
- 最終確認: テーブル整合性、サブスクリプション状態、スキーマ一致、データベースサイズ、レプリカ追加、インデックス再構築、性能テスト、リスク評価、ステージング環境での演習。
最終切り替え
- 最終切り替えの実行: 夜間にテーブルレプリケーションを行い、ステージング環境で複数回練習した後、最終確認とフラグ切り替えを行う。
GN⁺の意見
- 重要性: KnockはPostgres 11.9から15.3へのゼロダウンタイムアップグレードという複雑なプロセスを成功させた。これはデータベース管理とサービス可用性における重要なマイルストーンを示している。
- 興味深さ: レプリケーションベースのアップグレード手法は、データベース管理者に新しいデータベースへのスムーズな移行を可能にし、技術コミュニティの大きな関心を集め得る。
- 面白さ: Knockのアップグレードプロセスは、体系的なリスク管理と問題解決を通じて複雑な技術的課題を克服するベストプラクティスを示している。
1件のコメント
Hacker Newsのコメント
大容量テーブルをコピーするより良い方法がある。
ここで提示されているアプローチは興味深く、よく文書化されているが、「現代の顧客は100%の可用性を期待する」という文には同意しない。
AWSは現在ブルーグリーンデプロイをサポートしている。
問題の大半を自動化するツールを書いた。
hava.ioでAWS RDS PostgreSQL 11.13から15.5への移行を進めている。
pglogicalを使った単方向レプリケーション方式を選んだ。Knockサービスではいかなるダウンタイムも受け入れられないという主張に疑問を呈している。
バックアップからレプリケーションを初期化できないことに驚いた。
データベース認証情報を入力するだけで、ゼロダウンタイムでPostgresを更新できるオールインワンツールに興味があるかと尋ねている。
シーケンスの扱いに関する話が興味深い。
分散システムで起こる問題は適切な
sleep(1000)で解決できると冗談を言っている。